Diff for /loncom/interface/lonrequestcourse.pm between versions 1.44 and 1.116

version 1.44, 2010/02/21 23:38:51 version 1.116, 2023/03/11 04:44:51
Line 119  use Apache::loncoursequeueadmin; Line 119  use Apache::loncoursequeueadmin;
 use Apache::lonuserutils;  use Apache::lonuserutils;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
   my $registered_flush;
   my $registered_instcats;
   my $modified_dom;
   
 sub handler {  sub handler {
     my ($r) = @_;      my ($r) = @_;
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
Line 127  sub handler { Line 131  sub handler {
         return OK;          return OK;
     }      }
   
       $registered_flush = 0;
       $registered_instcats = 0;
       $modified_dom = '';
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
         ['action','showdom','cnum','state','crstype']);          ['action','showdom','cnum','state','crstype','queue','tabs']);
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     my $dom = &get_course_dom();      my $dom = &get_course_dom();
     my $action = $env{'form.action'};      my $action = $env{'form.action'};
     my $state = $env{'form.state'};      my $state = $env{'form.state'};
     my (%states,%stored);      my (%states,%stored);
     my ($jscript,$uname,$udom,$result,$warning);      my ($jscript,$uname,$udom,$result,$warning,$showcredits,$instcredits,%can_request,
           %request_domains,@incdoms);
       my %domdefs = &Apache::lonnet::get_domain_defaults($dom);
       if ($domdefs{'officialcredits'} || $domdefs{'unofficialcredits'} || $domdefs{'textbookcredits'}) {
           $showcredits = 1;
       }
   
       my $canreq =
           &Apache::lonnet::check_can_request($dom,\%can_request,\%request_domains);
   
       foreach my $item (keys(%request_domains)) {
           if (ref($request_domains{$item}) eq 'ARRAY') {
               foreach my $possdom (@{$request_domains{$item}}) {
                   unless(grep(/^\Q$possdom\E$/,@incdoms)) {
                       push(@incdoms,$possdom);
                   }
               }
           }
       }
   
       if ($canreq) {
           if (($env{'form.crstype'} eq 'lti') && ($env{'request.lti.login'}) &&
               ($env{'form.lti.reqrole'} eq 'cc') && ($env{'form.lti.reqcrs'}) &&
               ($env{'form.lti.sourcecrs'} ne '')) {
               if ($action eq 'process') {
                   if ($can_request{'lti'}) {
                       my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
                       &process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig,\%can_request,'lti');
                   } else {
                       $r->print(&header('Course Request','','','',{ 'only_body' => 1}).
                                 '<div>'.
                                 '<p class="LC_info">'.&mt('You do not have privileges to request creation of LTI courses.').'</p>'.
                                 '</div>'.
                                 &Apache::loncommon::end_page());
                   }
               }
               return OK;
           }
           if (($env{'form.crstype'} eq 'textbook') || 
               (scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) {
               my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
               if ($action eq 'log') {
                   my $usetabs;
                   if ((scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) {
                       $usetabs = 1;
                   } elsif ($env{'form.tabs'} eq 'on') {
                       $usetabs = 1;
                   }
                   &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'});
                   my $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');
                   &print_request_logs($r,$dom,undef,undef,$crumb,$usetabs);
               } elsif ($action eq 'process') {
                   if ($can_request{'textbook'}) {
                       &process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig,\%can_request);
                   } else {
                       &textbook_request_disabled($r,$dom,$action,\%can_request);
                   }
               } elsif ($action eq 'display') {
                  my ($uname,$udom,$result,$warning) = &domcoord_display($dom);
                  if ($warning ne '') {
                      my $args = { only_body => 1 };
                      $r->print(&header('Course/Community Requests','','' ,'',$args).
                                '<h3>'.&mt('Course/Community Request Details').'</h3>'.
                                '<div class="LC_warning">'.$warning.'</div>'.
                                &close_popup_form());
                   } else {
                       $states{'display'} = ['details'];
                       my $loaditems = &onload_action($action,$state);
                       my $page = 0;
                       &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                               $loaditems,'','','','','',$showcredits,'','',
                                               $uname,$udom);
                   }
               } else {
                   if ($can_request{'textbook'}) {
                       &print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'},
                                            \%can_request,'textbook');
                   } else {
                       &textbook_request_disabled($r,$dom,$action,\%can_request);
                   }
               }
               return OK;
           }
       }
   
     $states{'display'} = ['details'];      $states{'display'} = ['details'];
     $states{'view'} = ['pick_request','details','cancel','removal'];      $states{'view'} = ['pick_request','details','cancel','removal'];
     $states{'log'} = ['filter','display'];      $states{'log'} = ['display'];
     $states{'new'} = ['courseinfo','enrollment','personnel','review','process'];      $states{'new'} = ['courseinfo','enrollment','personnel','review','process'];
   
     if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) {      if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) {
Line 147  sub handler { Line 238  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 252  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',
                  removal       => 'Outcome',                   removal       => 'Outcome',
                    display       => 'Request Logs',
                 );                  );
   
     if (($env{'form.crstype'} eq 'official') && (&Apache::lonnet::auto_run('',$dom))) {      if (($env{'form.crstype'} eq 'official') && (&Apache::lonnet::auto_run('',$dom))) {
         $trail{'enrollment'} = 'Enrollment';          $trail{'enrollment'} = 'Enrollment';
     }      }
   
     my ($page,$crumb,$newinstcode,$codechk,$checkedcode,$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 $reqkey = $cnum.'_approval';  
                 my $namespace = 'courserequestqueue';  
                 my $domconfig = &Apache::lonnet::get_domainconfiguser($dom);  
                 my %queued =  
                     &Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig);  
                 if (ref($queued{$reqkey}) eq 'HASH') {  
                     $uname = $queued{$reqkey}{'ownername'};  
                     $udom  = $queued{$reqkey}{'ownerdom'};  
                     if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {  
                         $result = &retrieve_settings($dom,$cnum,$udom,$uname);  
                     } else {  
                         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 260  sub handler { Line 321  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 274  sub handler { Line 335  sub handler {
             $jscript = &mainmenu_javascript();              $jscript = &mainmenu_javascript();
         } else {          } else {
             $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored);              $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored);
               if ($state eq 'courseinfo') {
                   $jscript .= &cloning_javascript();
               }
         }          }
     }      }
   
Line 283  sub handler { Line 347  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 305  sub handler { Line 366  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 '') {
             my $args = { only_body => 1 };              my $args = { only_body => 1 };
             $r->print(&header('Course/Community Requests','','',$args).$crumb.              $r->print(&header('Course/Community Requests','','' ,'',$args).$crumb.
                       '<h3>'.&mt('Course/Community Request Details').'</h3>'.                        '<h3>'.&mt('Course/Community Request Details').'</h3>'.
                       '<div class="LC_warning">'.$warning.'</div>'.                        '<div class="LC_warning">'.$warning.'</div>'.
                       &close_popup_form());                        &close_popup_form());
         } else {          } else {
             &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,              &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                     $loaditems,$crumb,'','','','','',$uname,$udom);                                      $loaditems,$crumb,'','','','',$showcredits,'','',
                                       $uname,$udom);
         }          }
     } elsif ($action eq 'log') {      } elsif ($action eq 'log') {
         &print_request_logs($jscript,$loaditems,$crumb);          if ($state eq 'crstype') {
               &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\@incdoms);
           } else {
               $jscript .= <<ENDJS;
   
   function backPage(formname,prevstate) {
       formname.state.value = prevstate;
       formname.submit();
   }
   
   function setPage(formname) {
       formname.page.value = '1';
       return;
   }
   
   ENDJS
               &print_request_logs($r,$dom,$jscript,$loaditems,$crumb,\%can_request);
           }
     } else {      } else {
         &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains);          &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\@incdoms);
     }      }
     return OK;      return OK;
 }  }
Line 353  function setAction(courseForm) { Line 432  function setAction(courseForm) {
 END  END
 }  }
   
   sub cloning_javascript {
       return <<"END";
   function setCloneDisplay(courseForm) {
       if (courseForm.cloning.length > 1) {    
           for (var i=0; i<courseForm.cloning.length; i++) {
               if (courseForm.cloning[i].checked) {
                   if (courseForm.cloning[i].value == 1) {
                       document.getElementById('cloneoptions').style.display="block";
                   }
               }
           }
       }
   }
   END
   }
   
 sub get_breadcrumbs {  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 394  sub get_breadcrumbs { Line 489  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 450  sub header { Line 547  sub header {
 }  }
   
 sub form_elements {  sub form_elements {
     my ($dom) = @_;      my ($dom,$showcredits) = @_;
       my $instcredits;
     my %elements =      my %elements =
     (      (
         new => {          new => {
Line 461  sub form_elements { Line 559  sub form_elements {
             },              },
             courseinfo => {              courseinfo => {
                 cdescr           => 'text',                  cdescr           => 'text',
                   cloning          => 'radio', 
                 clonecrs         => 'text',                  clonecrs         => 'text',
                 clonedom         => 'selectbox',                  clonedom         => 'selectbox',
                 datemode         => 'radio',                  datemode         => 'radio',
                 dateshift        => 'text',                  dateshift        => 'text',
                   tinyurls         => 'radio',
             },              },
             enrollment  => {              enrollment  => {
                 accessstart_month  => 'selectbox',                  accessstart_month  => 'selectbox',
Line 517  sub form_elements { Line 617  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 533  sub form_elements { Line 632  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 548  sub form_elements { Line 674  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 586  sub form_elements { Line 711  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 596  sub onload_action { Line 721  sub onload_action {
         if ($state eq 'crstype') {          if ($state eq 'crstype') {
             $loaditems{'onload'} = 'javascript:setAction(document.mainmenu_action);javascript:setType(document.mainmenu_coursetype)';              $loaditems{'onload'} = 'javascript:setAction(document.mainmenu_action);javascript:setType(document.mainmenu_coursetype)';
         } else {          } else {
             $loaditems{'onload'} = 'javascript:setFormElements(document.requestcrs)';              $loaditems{'onload'} = 'javascript:setFormElements(document.requestcrs);';
           }
           if ($state eq 'courseinfo') {
               $loaditems{'onload'} .= 'javascript:setCloneDisplay(document.requestcrs);';
         }          }
     }      }
     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 645  $nextstate_setter Line 769  $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 654  END Line 780  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.\\nAll types is not allowed.',          textbook => 'You are not permitted to request creation of a textbook course in this domain',
           placement => 'You are not permitted to request creation of a placement test in this domain',
           all => 'You must choose a specific course type when making a new course request.',
           allt => '"All types" is not allowed.',
     );       ); 
       &js_escape(\%js_lt);
     $js .= <<END;      $js .= <<END;
     if (crschoice == 'official') {      if (crschoice == 'official') {
         if (official != 1) {          if (official != 1) {
             alert("$lt{'official'}");              alert("$js_lt{'official'}");
             return false;              return false;
         }          }
     } else {      } else {
         if (crschoice == 'unofficial') {          if (crschoice == 'unofficial') {
             if (unofficial != 1) {              if (unofficial != 1) {
                 alert("$lt{'unofficial'}");                  alert("$js_lt{'unofficial'}");
                 return false;                  return false;
             }              }
         } else {          } else {
             if (crschoice == 'community') {              if (crschoice == 'community') {
                 if (community != 1) {                  if (community != 1) {
                     alert("$lt{'community'}");                      alert("$js_lt{'community'}");
                     return false;                      return false;
                 }                  }
             } else {              } else {
                 if (actionchoice == 'new') {                  if (crschoice == 'textbook') {
                     alert("$lt{'all'}");                      if (textbook != 1) {
                     return false;                          alert("$js_lt{'textbook'}");
                 }                                         return false;
                       }
                   } else {
                       if (crschoice == 'placement') {
                           if (placement != 1) {
                               alert("$js_lt{'placement'}");
                               return false;
                           }
                       } else {
                           if (actionchoice == 'new') {
                               alert('$js_lt{'all'}'+'\\n'+'$js_lt{'allt'}');
                               return false;
                           }
                       }
                   }
             }              }
         }          }
     }      }
     return true;      return true;
 }  }
 END  END
     my ($pagetitle,$pageinfo,$domaintitle);      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 705  END Line 849  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 750  END Line 891  END
  <option value="view">'.&mt('View/Modify/Cancel pending requests').'</option>   <option value="view">'.&mt('View/Modify/Cancel pending requests').'</option>
  <option value="log">'.&mt('View request history').'</option>   <option value="log">'.&mt('View request history').'</option>
 </select></form>'.  </select></form>'.
               &Apache::lonhtmlcommon::row_closure(1).                &Apache::lonhtmlcommon::row_closure().
               &Apache::lonhtmlcommon::row_title(&mt('Type')).'                &Apache::lonhtmlcommon::row_title(&mt('Type')).'
 <form name="mainmenu_coursetype" method="post" action="">  <form name="mainmenu_coursetype" method="post" action="">
 <select size="1" name="crstype">');  <select size="1" name="crstype">');
Line 793  END Line 934  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 818  END Line 959  END
     }      }
     if ($action eq 'new') {      if ($action eq 'new') {
         my $jsextra;          my $jsextra;
         if ($state eq 'courseinfo') {          if (($state eq 'courseinfo') || ($state eq 'codepick')) {
             $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom);              $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom,'','','','','',
                                                                            $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 836  END Line 978  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 867  END Line 1010  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'); 
             }              }
             $r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n".              $r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n".
                       &print_request_status($dom).'</form></div>');                        &print_request_status($dom,$action).'</form></div>');
         } elsif ($state eq 'details') {          } elsif ($state eq 'details') {
             my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk);              my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk);
             my $origcnum = $env{'form.cnum'};              my $origcnum = $env{'form.cnum'};
Line 890  END Line 1037  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 914  END Line 1062  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 991  END Line 1140  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());
     } elsif ($action eq 'log') {  
         $r->print(&coursereq_log('View request log',$jscript,$loaditems).$crumb);  
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
   sub domcoord_display {
       my ($dom) = @_;
       my ($uname,$udom,$result,$warning);
       if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {
           if ($env{'form.cnum'} ne '') {
               my $cnum = $env{'form.cnum'};
               my $queue = $env{'form.queue'};
               my $reqkey = $cnum.'_'.$queue;
               my $namespace = 'courserequestqueue';
               my $domconfig = &Apache::lonnet::get_domainconfiguser($dom);
               my %queued =
                   &Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig);
               if (ref($queued{$reqkey}) eq 'HASH') {
                   $uname = $queued{$reqkey}{'ownername'};
                   $udom  = $queued{$reqkey}{'ownerdom'};
                   if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {
                       $result = &retrieve_settings($dom,$cnum,$udom,$uname);
                   } else {
                       if ($env{'form.crstype'} eq 'community') {
                           $warning = &mt('Invalid username or domain for community requestor');
                       } else {
                           $warning = &mt('Invalid username or domain for course requestor');
                       }
                   }
               } else {
                   if ($env{'form.crstype'} eq 'community') {
                       $warning = &mt('No information was found for this community request.');
                   } else {
                       $warning = &mt('No information was found for this course request.');
                   }
               }
           } else {
               $warning = &mt('No course request ID provided.');
           }
       } else {
           if ($env{'form.crstype'} eq 'any') {
               $warning = &mt('You do not have rights to view course or community request information.');
           } elsif ($env{'form.crstype'} eq 'community') {
               $warning = &mt('You do not have rights to view community request information.');
           } else {
               $warning = &mt('You do not have rights to view course request information.');
           }
       }
       return ($uname,$udom,$result,$warning);
   }
   
 sub enrollment_lcsec_js {  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 1061  function validateEnrollSections(formname Line 1257  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 1187  sub get_instcode { Line 1385  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 1260  sub print_request_form { Line 1458  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 1286  sub print_request_form { Line 1484  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 1341  sub print_request_form { Line 1561  sub print_request_form {
         if ($env{'form.origcnum'} =~ /^($match_courseid)$/) {          if ($env{'form.origcnum'} =~ /^($match_courseid)$/) {
             $cnum = $env{'form.origcnum'};              $cnum = $env{'form.origcnum'};
         } else {          } else {
             $cnum = &Apache::lonnet::generate_coursenum($dom);              my $gentype = 'Course';
               if ($crstype eq 'community') {
                   $gentype = 'Community';
               }
               $cnum = &Apache::lonnet::generate_coursenum($dom,$gentype);
         }          }
         &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,          &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                  \%cat_order,\@code_order);                                                   \%cat_order,\@code_order);
Line 1350  sub print_request_form { Line 1574  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 1362  sub print_request_form { Line 1595  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>');
                   }
               }
           }
       } elsif ($state eq 'reqauthor') {
           my ($result,@links); 
           if ($env{'form.requestauthor'}) {
               $r->print(&Apache::loncoursequeueadmin::process_reqauthor(\$result));
               if ($result eq 'created') {
                   my $role = 'au';
                   my $spec = "$role./$env{'form.showdom'}/";
                   push(@links,&mt('Enter your Authoring Space with role: [_1]',
                                   '<a href="/adm/roles?selectrole=1&amp;'.$spec.'=1">'.
                                   &Apache::lonnet::plaintext($role).'</a>'));
               }
           }
           if (($env{'form.disposition'} eq 'created') &&
               ($env{'form.cnum'} =~ /^$match_courseid$/) &&
               ($env{'form.showdom'} =~ /^$match_domain$/)) {
               my ($spec,$area,$role,$type);
               my $role = 'cc';
               my $spec = "$role./$env{'form.showdom'}/$env{'form.cnum'}";
               my $type = 'Course';
               if ($env{'form.crstype'} eq 'community') {
                   $type = 'Community';
             }              }
             $r->print('<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');              my $showrole = &Apache::lonnet::plaintext($role,$type);
             return;              unshift(@links,&mt('Enter new course with role: [_1]',
                                  '<a href="/adm/roles?selectrole=1&amp;'.$spec.'=1">'.$showrole.'</a>'));
           }
           if (@links > 1) {
               $r->print(&mt('New roles will be listed on your [_1]Roles[_2] page.',
                             '<a href="/adm/roles">','</a>').'&nbsp'.&mt('Choose a role:').
                          '<ul>');
               foreach my $link (@links) {
                   $r->print('<li>'.$link.'</li>');
               }
               $r->print('</ul>');
           } elsif (@links == 1) {
               $r->print('<p>'.$links[0].'</p>');
         }          }
     }      }
     my @excluded = &get_excluded_elements($dom,$states,$action,$state);      my @excluded = &get_excluded_elements($dom,$states,$action,$state,$showcredits);
     if ($state eq 'personnel') {      if ($state eq 'personnel') {
         push(@excluded,'persontotal');          push(@excluded,'persontotal');
     }      }
Line 1402  sub print_request_form { Line 1681  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 1428  sub check_newuser_rules { Line 1733  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 1450  sub check_newuser_rules { Line 1755  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 1483  sub get_excluded_elements { Line 1804  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 1496  sub print_enrollment_menu { Line 1818  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 1527  sub print_enrollment_menu { Line 1877  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 1548  sub print_enrollment_menu { Line 1898  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 1572  sub print_enrollment_menu { Line 1939  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 1637  sub inst_section_selector { Line 2012  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 1648  sub date_setting_table { Line 2023  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 1667  sub date_setting_table { Line 2044  sub date_setting_table {
     }      }
   
     $table = &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($help_item{$prefix}{'start'}).      $table = &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($help_item{$prefix}{'start'}).
              '&nbsp;'.$datetitles{'start'}).$startform.               '&nbsp;'.&mt($datetitles{'start'})).$startform.
              &Apache::lonhtmlcommon::row_closure(1).               &Apache::lonhtmlcommon::row_closure(1).
              &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($help_item{$prefix}{'end'}).               &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($help_item{$prefix}{'end'}).
              '&nbsp;'.$datetitles{'end'}).$endform.$perpetual.               '&nbsp;'.&mt($datetitles{'end'})).$endform.$perpetual.
              &Apache::lonhtmlcommon::row_closure($closure);               &Apache::lonhtmlcommon::row_closure($closure);
     return $table;      return $table;
 }  }
Line 1738  sub print_personnel_menu { Line 2115  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>';
     }      }
     for (my $i=0; $i<$persontotal; $i++) {       my $cansearch = 1;
       my @alldoms = &Apache::lonnet::all_domains();
       if (@alldoms == 1) {
           my %domsrch = &Apache::lonnet::get_dom('configuration',
                                                  ['directorysrch'],$alldoms[0]);
           if (ref($domsrch{'directorysrch'}) eq 'HASH') {
               if ((!$domsrch{'directorysrch'}{'available'}) &&
                   ($domsrch{'directorysrch'}{'lcavailable'} eq '0')) {
                   $cansearch = 0;
               }
           }
       }
       my ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('enroll',$dom);
       for (my $i=0; $i<$persontotal; $i++) {
         my @linkargs = map { 'person_'.$i.'_'.$_ } (@items);          my @linkargs = map { 'person_'.$i.'_'.$_ } (@items);
         my $linkargstr = join("','",@linkargs);          my $linkargstr = join("','",@linkargs);
         my $uname_form = '<input type="text" name="person_'.$i.'_uname" value="" size="20" />';          my $uname_form = '<input type="text" name="person_'.$i.'_uname" value="" size="20" />';
         my $onchange = 'javascript:fix_domain('."'$formname','person_".$i."_dom',".          my $onchange = 'javascript:fix_domain('."'$formname','person_".$i."_dom',".
                        "'person_".$i."_hidedom','person_".$i."_uname'".');';                         "'person_".$i."_hidedom','person_".$i."_uname'".');';
         my $udom_form = &Apache::loncommon::select_dom_form($dom,'person_'.$i.'_dom','',          my $udom_form = &Apache::loncommon::select_dom_form($dom,'person_'.$i.'_dom','',
                                                             1,$onchange).                                                              1,$onchange,undef,$trusted,$untrusted).
                         '<input type="hidden" name="person_'.$i.'_hidedom" value="" />';                          '<input type="hidden" name="person_'.$i.'_hidedom" value="" />';
         my %form_elems;          my %form_elems;
         foreach my $item (@items) {          foreach my $item (@items) {
Line 1765  sub print_personnel_menu { Line 2157  sub print_personnel_menu {
         }          }
         $sectionselector .= $newtitle.          $sectionselector .= $newtitle.
             '<input type="text" name="person_'.$i.'_newsec" size="15" value="" />'."\n";              '<input type="text" name="person_'.$i.'_newsec" size="15" value="" />'."\n";
         my $usersrchlinktxt = &mt('Search for user');          my $usersrchlink;
         my $usersrchlink =  &Apache::loncommon::selectuser_link($formname,@linkargs,$dom,          if ($cansearch) {
                             $usersrchlinktxt);              my $usersrchlinktxt = &mt('Search for user');
               $usersrchlink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom,
                                                                   $usersrchlinktxt);
           } else {
               $usersrchlink = '&nbsp;';
           }
         my $userchklinktxt = &mt('Check username');          my $userchklinktxt = &mt('Check username');
         my $userchklink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom,          my $userchklink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom,
                             $userchklinktxt,'checkusername');                              $userchklinktxt,'checkusername');
Line 1817  sub current_lc_sections { Line 2214  sub current_lc_sections {
     return @currsecs;      return @currsecs;
 }  }
   
 sub print_request_status {  sub sorted_request_history {
     my ($dom) = @_;      my ($dom,$action,$curr_req) = @_;
       my ($after,$before,$statusfilter,$crstypefilter);
       if ($env{'form.status'} ne '') {
           $statusfilter = $env{'form.status'};
       }
       if ($env{'form.crstype'} ne '') {
           $crstypefilter = $env{'form.crstype'};
       }
       if (ref($curr_req) eq 'HASH') {
           $after = $curr_req->{'requested_after_date'},
           $before = $curr_req->{'requested_before_date'};
           $statusfilter = $curr_req->{'status'};
           $crstypefilter = $curr_req->{'crstype'};
       }
     my %statusinfo = &Apache::lonnet::dump('courserequests',$env{'user.domain'},      my %statusinfo = &Apache::lonnet::dump('courserequests',$env{'user.domain'},
                                            $env{'user.name'},'^status:'.$dom);                                             $env{'user.name'},'^status:'.$dom);
     my ($output,$formname,%queue_by_date);      my %queue_by_date;
     my ($types,$typenames) = &Apache::loncommon::course_types();      my ($types,$typenames) = &Apache::loncommon::course_types();
     foreach my $key (keys(%statusinfo)) {      foreach my $key (keys(%statusinfo)) {
         if (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending')) {           if ($action eq 'view') {
             (undef,my($cdom,$cnum)) = split(':',$key);              next unless (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending'));
             next if ($cdom ne $dom);             } else {
             my $requestkey = $cdom.'_'.$cnum;              next unless (($statusfilter eq 'any') ||
             if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {                            ($statusfilter eq $statusinfo{$key}));
                 my %history = &Apache::lonnet::restore($requestkey,'courserequests',          }
                                                        $env{'user.domain'},$env{'user.name'});          (undef,my($cdom,$cnum)) = split(':',$key);
                 my $entry;          next if ($cdom ne $dom);   
                 my $timestamp = $history{'reqtime'};          my $requestkey = $cdom.'_'.$cnum;
                 my $crstype = $history{'crstype'};          if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {
                 my $disposition = $history{'disposition'};              my %history = &Apache::lonnet::restore($requestkey,'courserequests',
                                                      $env{'user.domain'},$env{'user.name'});
               my $entry;
               my $reqtime = $history{'reqtime'};
               my $lastupdate = $history{'timestamp'};
               my $crstype = $history{'crstype'};
               my $disposition = $history{'disposition'};
               my $status = $history{'status'};
               my $uniquecode = $history{'code'}; 
               if ($action eq 'view') {
                 next if ((exists($history{'status'})) && ($history{'status'} eq 'created'));                  next if ((exists($history{'status'})) && ($history{'status'} eq 'created'));
                 next unless (($env{'form.crstype'} eq 'any') ||               } else {
                             ($env{'form.crstype'} eq $crstype));                  next if (($reqtime < $after) || ($reqtime > $before));
               }
               next unless (($crstypefilter eq 'any') || 
                            ($crstypefilter eq $crstype));
               if ($action eq 'view') {
                 next unless (($disposition eq 'approval') ||                   next unless (($disposition eq 'approval') || 
                              ($disposition eq 'pending'));                               ($disposition eq 'pending'));
                 if (ref($history{'details'}) eq 'HASH') {              }
                     $entry = $requestkey.':'.$crstype.':'.              if (ref($history{'details'}) eq 'HASH') {
                              &escape($history{'details'}{'cdescr'});                  $entry = $requestkey.':'.$crstype.':'.
                     if ($crstype eq 'official') {                           &escape($history{'details'}{'cdescr'});
                         $entry .= ':'.&escape($history{'details'}{'instcode'});                   if ($action eq 'log') {
                       $entry .= ':'.$uniquecode.':'.$lastupdate.':';
                       if ($statusinfo{$key} ne '') {
                           $entry .= $statusinfo{$key};
                       } elsif ($status ne '') {
                           $entry .= $status;
                       } else {
                           $entry .= $disposition;
                     }                      }
                 }                  }
                 if ($entry ne '') {                  if ($crstype eq 'official') {
                     if (exists($queue_by_date{$timestamp})) {                      $entry .= ':'.&escape($history{'details'}{'instcode'}); 
                         if (ref($queue_by_date{$timestamp}) eq 'ARRAY') {                  }
                             push(@{$queue_by_date{$timestamp}},$entry);              }
                         }              if ($entry ne '') {
                     } else {                  if (exists($queue_by_date{$reqtime})) {
                         @{$queue_by_date{$timestamp}} = ($entry);                      if (ref($queue_by_date{$reqtime}) eq 'ARRAY') {
                           push(@{$queue_by_date{$reqtime}},$entry);
                     }                      }
                   } else {
                       @{$queue_by_date{$reqtime}} = ($entry);
                 }                  }
             }              }
         }          }
     }      }
     $formname = 'requestcrs';      return %queue_by_date;
   }
   
   sub print_request_status {
       my ($dom,$action) = @_;
       my %queue_by_date = &sorted_request_history($dom,$action);
     my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date));      my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date));
     $output = '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".      my $formname = 'requestcrs';
       my ($types,$typenames) = &Apache::loncommon::course_types();
       my $output = '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".
   
               '<input type="hidden" name="state" value="'.$env{'form.state'}.'" />'."\n".                '<input type="hidden" name="state" value="'.$env{'form.state'}.'" />'."\n".
               '<input type="hidden" name="crstype" value="'.$env{'form.crstype'}.'" />'."\n".                '<input type="hidden" name="crstype" value="'.$env{'form.crstype'}.'" />'."\n".
Line 1971  sub print_cancel_request { Line 2411  sub print_cancel_request {
                       &Apache::loncommon::start_data_table_row().                        &Apache::loncommon::start_data_table_row().
                       '<td>'.$history{details}{'cdescr'}.'</td><td>'.                        '<td>'.$history{details}{'cdescr'}.'</td><td>'.
                       &Apache::lonlocal::locallocaltime($timestamp).'</td>'.                        &Apache::lonlocal::locallocaltime($timestamp).'</td>'.
                       '<td>'.$showtype.'</td>'.                        '<td>'.&mt($showtype).'</td>'.
                       &Apache::loncommon::end_data_table_row().                        &Apache::loncommon::end_data_table_row().
                       &Apache::loncommon::end_data_table().                        &Apache::loncommon::end_data_table().
                       '<br /><div class="LC_warning">';                        '<br /><div class="LC_warning">';
Line 2026  ENDJS Line 2466  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 2041  ENDJS Line 2482  ENDJS
 }  }
   
 sub print_request_logs {  sub print_request_logs {
     my ($jscript,$loaditems,$crumb) = @_;      my ($r,$dom,$jscript,$loaditems,$crumb,$usetabs) = @_;
       my $title;
       if ($env{'form.crstype'} eq 'community') {
           $title = 'Community Request Logs';
       } elsif ($env{'form.crstype'} eq 'any') {
           $title = 'Course/Community Request Logs';
       } else {
           $title = 'Course Request Logs';
       }
       $r->print(&header($title,$jscript,$loaditems).$crumb);
       if ($usetabs) {
           &startContentScreen($r,'textbooklogs');
       }
       my $formname = 'requestcrs';
       $r->print('<form action="/adm/requestcourse" method="post" name="'.$formname.'" onsubmit="javascript:setPage(this);">'."\n".
                 '<input type="hidden" name="action" value="log" />'."\n".
                 '<input type="hidden" name="state" value="display" />'."\n");
       # set defaults
       my $now = time();
       my $defstart = $now - (7*24*3600); #7 days ago
       my %defaults = (
                        page                => '1',
                        show                => '10',
                        crstype             => 'any',
                        status              => 'any',
                        requested_before_date => $now,
                        requested_after_date  => $defstart,
                      );
       my ($types,$typenames) = &Apache::loncommon::course_types();
       my $more_records = 0;
       my %curr;
       foreach my $item ('show','page','crstype','status') {
           $curr{$item} = $env{'form.'.$item};
       }
       $curr{'requested_after_date'} = &Apache::lonhtmlcommon::get_date_from_form('requested_after_date');
       $curr{'requested_before_date'} = &Apache::lonhtmlcommon::get_date_from_form('requested_before_date');
       foreach my $key (keys(%defaults)) {
           if ($curr{$key} eq '') {
               $curr{$key} = $defaults{$key};
           }
       }
       my ($statuses,$statusnames) = &reqstatus_names($curr{'crstype'});
       $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.
                 &requestlog_display_filter($formname,\%curr));
       my %queue_by_date = &sorted_request_history($dom,$env{'form.action'},\%curr);
       my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date));
       my $showntablehdr = 0;
       my $tablehdr = &Apache::loncommon::start_data_table().
                      &Apache::loncommon::start_data_table_header_row().
                      '<th>&nbsp;</th><th>'.&mt('Request Date').'</th>'.
                      '<th>'.&mt('Description').'</th>';
       if ($curr{'crstype'} eq 'any') {
           $tablehdr .= '<th>'.&mt('Course Type').'</th>';
       }
       if (($curr{'crstype'} eq 'official') || ($curr{'crstype'} eq 'any')) {
           $tablehdr .= '<th>'.&mt('Institutional Code').'</th>';
       }
       my $showuniquecode;
       my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
       if (($curr{'status'} eq 'any') || ($curr{'status'} eq 'created')) {
           if (ref($domconfig{'requestcourses'}) eq 'HASH') {
               if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') {
                   if ($curr{'crstype'} eq 'any') {
                       my @types = qw(official unofficial community textbook placement);
                       foreach my $type (@types) {
                           if ($domconfig{'requestcourses'}{'uniquecode'}{$type}) {
                               $showuniquecode = 1;
                               last;
                           }
                       }
                   } elsif ($domconfig{'requestcourses'}{'uniquecode'}{$curr{'crstype'}}) {
                       $showuniquecode = 1;
                   }
               }
           }
       }
       if ($showuniquecode) {
           $tablehdr .= '<th>'.&mt('Unique Code').'</th>';    
       }
       if ($curr{'status'} eq 'any') {
           $tablehdr .= '<th>'.&mt('Status').'</th>';
       } elsif ($curr{'status'} eq 'created') {
           $tablehdr .= '<th>'.&mt('Creation Date').'</th>';
       } elsif ($curr{'status'} eq 'cancelled') {
           $tablehdr .= '<th>'.&mt('Cancellation Date').'</th>';
       } elsif ($curr{'status'} eq 'rejected') {
           $tablehdr .= '<th>'.&mt('Rejection Date').'</th>';
       }
       $tablehdr .= &Apache::loncommon::end_data_table_header_row();
       my ($minshown,$maxshown);
       $minshown = 1;
       my $count = 0;
       if ($curr{'show'} ne &mt('all')) {
           $maxshown = $curr{'page'} * $curr{'show'};
           if ($curr{'page'} > 1) {
               $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
           }
       }
       my $norecords;
       if (@sortedtimes > 0) {
           foreach my $item (@sortedtimes) {
               if ($curr{'show'} ne &mt('all')) {
                   if ($count >= $curr{'page'} * $curr{'show'}) {
                       $more_records = 1;
                       last;
                   }
               }
               $count ++;
               next if ($count < $minshown);
               if (!$showntablehdr) {
                   $r->print($tablehdr);
                   $showntablehdr = 1;
               }
               my $showtime = &Apache::lonlocal::locallocaltime($item);
               if (ref($queue_by_date{$item}) eq 'ARRAY') {
                   foreach my $request (sort(@{$queue_by_date{$item}})) {
                       my ($key,$crstype,$desc,$uniquecode,$timestamp,$status,$instcode) = split(':',$request);
                       my ($cdom,$cnum) = split('_',$key);
                       my $output = &Apache::loncommon::start_data_table_row().
        '<td>'.$count.'</td>'.
        '<td>'.$showtime.'</td>'.
        '<td>'.&unescape($desc).'</td>';
                       if ($curr{'crstype'} eq 'any') {
                           my $typename;
                           if (ref($typenames) eq 'HASH') {
                               $typename = &mt($typenames->{$crstype});
                           }
                           if ($typename eq '') {
                               $typename = &mt('Unknown type');
                           }
                           $output .= '<td>'.$typename.'</td>';
                       }
                       if (($curr{'crstype'} eq 'any') ||
                           ($curr{'crstype'} eq 'official')) {
                           my $showinstcode;
                           if ($crstype eq 'official') {
                               $showinstcode = &unescape($instcode);
                           } else {
                               $showinstcode = &mt('Not applicable');
                           }
                           $output .= '<td>'.$showinstcode.'</td>';
                       }
                       if ($showuniquecode) {
                           if ($status eq 'created') {
                               $output .= '<td>'.$uniquecode.'</td>';
                           } else {
                               $output .= '<td>'.&mt('Not applicable').'</td>';
                           }    
                       }
                       if ($curr{'status'} eq 'any') {
                           my $statusname = &mt('Unknown status');
                           if (ref($statusnames) eq 'HASH') {
                               if ($statusnames->{$status} ne '') {
                                   $statusname = $statusnames->{$status};
                               }
                           }
                           if (($status eq 'created') || ($status eq 'cancelled') ||
                               ($status eq 'rejected')) {
                               $statusname .= ' '.&Apache::lonlocal::locallocaltime($timestamp);
                           }
                           $output .= '<td>'.$statusname.'</td>';
                       } elsif (($status eq 'created') || ($status eq 'cancelled') ||
                                ($status eq 'rejected')) {
                            $output .= '<td>'.&Apache::lonlocal::locallocaltime($timestamp).'</td>';
                       }
                       $output .= &Apache::loncommon::end_data_table_row();
                       $r->print($output);
                   }
               }
           }
           if ($showntablehdr) {  
               $r->print(&Apache::loncommon::end_data_table());
               if (($curr{'page'} > 1) || ($more_records)) {
                   $r->print('<table><tr>');
                   if ($curr{'page'} > 1) {
                       $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');
                   }
                   if ($more_records) {
                       $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');
                   }
                   $r->print('</tr></table>');
                   $r->print(<<"ENDSCRIPT");
   <script type="text/javascript">
   // <![CDATA[
   function chgPage(caller) {
       if (caller == 'previous') {
           document.$formname.page.value --;
       }
       if (caller == 'next') {
           document.$formname.page.value ++;
       }
       document.$formname.submit();
       return;
   }
   // ]]>
   </script>
   ENDSCRIPT
               }
           } else {
               $norecords = 1;
           }
       } else {
           $norecords = 1;
       }
       if ($norecords) {
           $r->print('<p class="LC_info">'.
                     &mt('There are no records to display').
                     '</p>');
       }
       if ($usetabs) {
           $r->print('<input type="hidden" name="tabs" value="on" />');
       }
       $r->print('</form>');
       if ($usetabs) {
           &endContentScreen($r);
       }
       $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
   sub reqstatus_names {
       my ($crstype) = @_;
       my @statuses = qw(created approval pending rejected cancelled);
       my %statusnames =
               &Apache::lonlocal::texthash (
                           created   => 'Created',
                           approval  => 'Queued pending approval',
                           pending   => 'Queued pending validation',
                           rejected  => 'Request rejected',
                           cancelled => 'Request cancelled',
               );
       if (($crstype eq 'official') || ($crstype eq 'unofficial') || ($crstype eq 'textbook') || ($crstype eq 'placement')) {
           $statusnames{'created'} = &mt('Course created');
       } elsif ($crstype eq 'community') {
           $statusnames{'created'} = &mt('Community created');
       }
       return (\@statuses,\%statusnames);
   }
   
   sub requestlog_display_filter {
       my ($formname,$curr) = @_;
       my $nolink = 1;
       my $output = '<table><tr><td valign="top">'.
                    '<span class="LC_nobreak"><b>'.&mt('Records/page:').'</b></span><br />'.
                    &Apache::lonmeta::selectbox('show',$curr->{'show'},undef,
                                                 (&mt('all'),5,10,20,50,100,1000,10000)).
                    '</td><td>&nbsp;&nbsp;</td>';
       my $startform =
           &Apache::lonhtmlcommon::date_setter($formname,'requested_after_date',
                                               $curr->{'requested_after_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       my $endform =
           &Apache::lonhtmlcommon::date_setter($formname,'requested_before_date',
                                               $curr->{'requested_before_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       $output .= '<td valign="top"><b>'.&mt('Window during which course/community was requested:').'</b><br />'.
                  '<table><tr><td>'.&mt('After:').
                  '</td><td>'.$startform.'</td></tr>'.
                  '<tr><td>'.&mt('Before:').'</td>'.
                  '<td>'.$endform.'</td></tr></table>'.
                  '</td>'.
                  '<td>&nbsp;&nbsp;</td>';
       my ($types,$typenames) = &Apache::loncommon::course_types();
       if (ref($types) eq 'ARRAY') {
           if (@{$types} > 1) {
               $output .= '<td valign="top"><b>'.
                          &mt('Course Type:').'</b><br /><select name="crstype">';
               my $selstr = '';
               if ($curr->{'crstype'} eq 'any') {
                   $selstr = ' selected="selected"';
               }
               $output .= '<option value="any"'.$selstr.'>'.&mt('All types').'</option>'."\n";
               foreach my $crstype (@{$types}) {
                   my $selstr = '';
                   if ($curr->{'crstype'} eq $crstype) {
                       $selstr = ' selected="selected"';
                   }
                   my $typename = $crstype;
                   if (ref($typenames) eq 'HASH') {
                       if ($typenames->{$crstype} ne '') {
                           $typename = $typenames->{$crstype};
                       }
                   }
                   $output .= '<option value="'.$crstype.'"'.$selstr.'>'.&mt($typename).'</option>'."\n";
               }
               $output .= '</select></td>';
           }
       }
       my ($statuses,$statusnames) = &reqstatus_names($curr->{'crstype'});
       if (ref($statuses) eq 'ARRAY') {
           if (@{$statuses} > 1) {
               $output .= '<td valign="top"><b>'.
                          &mt('Request Status:').'</b><br /><select name="status">';
               my $selstr = '';
               if ($curr->{'status'} eq 'any') {
                   $selstr = ' selected="selected"';
               }
               $output .= '<option value="any"'.$selstr.'>'.&mt('Any status').'</option>'."\n";
               foreach my $status (@{$statuses}) {
                   my $selstr = '';
                   if ($curr->{'status'} eq $status) {
                       $selstr = ' selected="selected"';
                   }
                   my $statusname = $status;
                   if (ref($statusnames) eq 'HASH') {
                       if ($statusnames->{$status} ne '') {
                           $statusname = $statusnames->{$status};
                       }
                   }
                   $output .= '<option value="'.$status.'"'.$selstr.'>'.$statusname.'</option>'."\n";
               }
               $output .= '</select></td>';
           }
       }
       $output .= '</tr></table>';
   
       # Update Display button
       $output .= '<p>'.
                  '<input type="submit" value="'.&mt('Update Display').'" />'.
                  '</p><hr />';
       return $output;
   }
   
 sub print_review {  sub print_review {
     my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom,      my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom,
         $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 2080  sub print_review { Line 2840  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 2095  sub print_review { Line 2856  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 2164  sub print_review { Line 2936  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($env{'form.crstype'});
     $inst_headers .= '<th>'.&mt('Clone From').'</th>';      $inst_headers .= '<th>'.&mt('Clone From').'</th>';
     if (($env{'form.clonecrs'} =~ /^$match_name$/) &&       if (($env{'form.cloning'}) &&
           ($env{'form.clonecrs'} =~ /^$match_name$/) && 
         ($env{'form.clonedom'} =~ /^$match_domain$/)) {          ($env{'form.clonedom'} =~ /^$match_domain$/)) {
         my $canclone = &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},          my $canclone = &Apache::loncoursequeueadmin::can_clone_course($uname,
                            $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'},                             $udom,$env{'form.clonecrs'},$env{'form.clonedom'},
                            $env{'form.crstype'});                             $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'));
             if (keys(%courseenv) > 0) {              if (keys(%courseenv) > 0) {
                 $inst_headers .= '<th>'.$ctxt{'dsh'}.'</th>';                  $inst_headers .= '<th>'.$ctxt{'dsh'}.'</th>'.
                                    '<th>'.$ctxt{'dpl'}.'</th>';
                 $inst_values .= '<td>'.$courseenv{'description'}.'&nbsp;';                  $inst_values .= '<td>'.$courseenv{'description'}.'&nbsp;';
                 my $cloneinst = $courseenv{'internal.coursecode'};                  my $cloneinst = $courseenv{'internal.coursecode'};
                 if ($cloneinst ne '') {                  if ($cloneinst ne '') {
Line 2193  sub print_review { Line 2970  sub print_review {
                 } else {                  } else {
                     $inst_values .= $ctxt{'ncd'};                      $inst_values .= $ctxt{'ncd'};
                 }                  }
                   $inst_values .= '</td><td>';
                   if ($env{'form.tinyurls'} eq 'delete') {
                       $inst_values .= $ctxt{'nsl'};
                   } elsif ($env{'form.tinyurls'} eq 'transfer') {
                       $inst_values .= $ctxt{'tsl'};
                   } else {
                       $inst_values .= $ctxt{'csl'};
                   }
                 $inst_values .= '</td>';                  $inst_values .= '</td>';
              } else {               } else {
                  $inst_values .= '<td>'.&mt('Unknown').'</td>';                   $inst_values .= '<td>'.&mt('Unknown').'</td>';
Line 2334  sub dates_from_form { Line 3119  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');
 }  }
   
   function toggleCloning() {
       var willclone;
       if (document.$formname.cloning.length > 1) {
           for (var i=0; i<document.$formname.cloning.length; i++) {
               if (document.$formname.cloning[i].checked) {
                   willclone = document.$formname.cloning[i].value;
               }
           }
       }
       if (willclone == 1) {
           document.getElementById('cloneoptions').style.display="block";
       } else {
           document.getElementById('cloneoptions').style.display="none";
           document.$formname.clonecrs.value = '';
       }
   }
   
 // ]]  // ]]
 </script>  </script>
   
Line 2360  ENDJS Line 3166  ENDJS
         $title = &mt('Brief Community Description');          $title = &mt('Brief Community Description');
         $clonetitle = &mt('Clone content and settings from an existing community?');          $clonetitle = &mt('Clone content and settings from an existing community?');
     }      }
     my $output .= $js_validate."\n".'<div>'.&Apache::lonhtmlcommon::start_pick_box().      my $output .= $js_validate."\n".&Apache::lonhtmlcommon::start_pick_box().
                   &Apache::lonhtmlcommon::row_headline().                    &Apache::lonhtmlcommon::row_headline().
                   '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Description').'&nbsp;'.$title.'</h3>'.                    '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Description').'&nbsp;'.$title.'</h3>'.
                   &Apache::lonhtmlcommon::row_closure(1).                    &Apache::lonhtmlcommon::row_closure(1).
Line 2376  ENDJS Line 3182  ENDJS
     $output .= $home_server_pick.      $output .= $home_server_pick.
                &Apache::lonhtmlcommon::row_closure().                 &Apache::lonhtmlcommon::row_closure().
                &Apache::lonhtmlcommon::row_headline().                 &Apache::lonhtmlcommon::row_headline().
                '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Clone').'&nbsp;'.$clonetitle.'</h3>'.                  '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Clone').'&nbsp;'.$clonetitle.
                  &Apache::lonhtmlcommon::row_closure(1).
                  &Apache::lonhtmlcommon::row_title(&mt('Clone?')).
                  '<label><input type="radio" name="cloning" value="1" '.
                  'onclick="javascript:toggleCloning()" />'.
                  &mt('Yes').('&nbsp;'x2).'</label><label>'.
                  '<input type="radio" name="cloning" value="0" checked="checked" '.
                  'onclick="javascript:toggleCloning()" />'.&mt('No').'</label>'.
                  '</h3>'.
                &Apache::lonhtmlcommon::row_closure(1).                 &Apache::lonhtmlcommon::row_closure(1).
                  &Apache::lonhtmlcommon::row_headline().
                  '<div id="cloneoptions" style="display: none" >'.
                  &Apache::lonhtmlcommon::start_pick_box().
                &clone_form($dom,$formname,$crstype).                 &clone_form($dom,$formname,$crstype).
                &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n";                 &Apache::lonhtmlcommon::end_pick_box().'</div>'.
                  &Apache::lonhtmlcommon::end_pick_box()."\n";
     return $output;      return $output;
 }  }
   
Line 2388  sub clone_form { Line 3206  sub clone_form {
     my $type = 'Course';      my $type = 'Course';
     if ($crstype eq 'community') {      if ($crstype eq 'community') {
         $type = 'Community';          $type = 'Community';
       } elsif ($crstype eq 'placement') {
           $type = 'Placement'; 
     }      }
     my $cloneform = &Apache::loncommon::select_dom_form($dom,'clonedom').'&nbsp;'.      my %lt = &clone_text($crstype);
                     &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type);  
     my %lt = &clone_text();  
     my $output .=       my $output .= 
         &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'.  
         '<input type="text" size="25" name="clonecrs" value=""  />'.  
         '</label>'.&Apache::lonhtmlcommon::row_closure(1).  
         &Apache::lonhtmlcommon::row_title($lt{'dmn'}).'<label>'.          &Apache::lonhtmlcommon::row_title($lt{'dmn'}).'<label>'.
         $cloneform.'</label>'.&Apache::lonhtmlcommon::row_closure(1).          &Apache::loncommon::select_dom_form($dom,'clonedom').'</label>'.
           &Apache::lonhtmlcommon::row_closure(1).
           &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'.
           '<input type="text" size="25" name="clonecrs" value="" onfocus="this.blur();opencrsbrowser('."'$formname','clonecrs','clonedom','','','','$type'".')" />'.
           '</label>&nbsp;'.
           &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type).
           &Apache::lonhtmlcommon::row_closure(1).
         &Apache::lonhtmlcommon::row_title($lt{'dsh'}).'<label>'.          &Apache::lonhtmlcommon::row_title($lt{'dsh'}).'<label>'.
         '<input type="radio" name="datemode" value="delete" /> '.$lt{'ncd'}.          '<input type="radio" name="datemode" value="delete" /> '.$lt{'ncd'}.
         '</label><br /><label>'.          '</label><br /><label>'.
Line 2405  sub clone_form { Line 3226  sub clone_form {
         '</label><br /><label>'.          '</label><br /><label>'.
         '<input type="radio" name="datemode" value="shift" checked="checked" /> '.          '<input type="radio" name="datemode" value="shift" checked="checked" /> '.
         $lt{'shd'}.'</label>'.          $lt{'shd'}.'</label>'.
         '<input type="text" size="5" name="dateshift" value="365" />'.          '<input type="text" size="5" name="dateshift" value="364" />'.
           &Apache::lonhtmlcommon::row_closure(1).
           &Apache::lonhtmlcommon::row_title($lt{'dpl'}).'<label>'.
           '<input type="radio" name="tinyurls" value="delete" /> '.$lt{'nsl'}.
           '</label><br /><label>'.
           '<input type="radio" name="tinyurls" value="transfer" /> '.$lt{'tsl'}.
           '</label><br /><label>'.
           '<input type="radio" name="tinyurls" value="create" checked="checked" /> '.$lt{'csl'}.
           '</label>'.
         &Apache::lonhtmlcommon::row_closure(1);          &Apache::lonhtmlcommon::row_closure(1);
     return $output;      return $output;
 }  }
   
 sub clone_text {  sub clone_text {
     return &Apache::lonlocal::texthash(      my ($crstype) = @_;
       my %lt = &Apache::lonlocal::texthash(
                'cid'  => 'Course ID',                 'cid'  => 'Course ID',
                'dmn'  => 'Domain',                 'dmn'  => 'Domain',
                'dsh'  => 'Date Shift',                 'dsh'  => 'Date Shift',
                'ncd'  => 'Do not clone date parameters',                 'ncd'  => 'Do not clone date parameters',
                'prd'  => 'Clone date parameters as-is',                 'prd'  => 'Clone date parameters as-is',
                'shd'  => 'Shift date parameters by number of days',                 'shd'  => 'Shift date parameters by number of days',
         );                 'dpl'  => 'URL shortcuts (for deep linking)',
                  'nsl'  => 'Do not clone URL shortcuts',
                  'tsl'  => 'Transfer URL shortcuts from existing course to new course',
                  'csl'  => 'Create new URL shortcuts in new course',
       );
       if ($crstype eq 'Community') {
           $lt{'tsl'} = &mt('Transfer URL shortcuts from existing course to new community');
           $lt{'csl'} = &mt('Create new URL shortcuts in new course');
       }
       return %lt;
 }  }
   
 sub coursecode_form {  sub coursecode_form {
     my ($dom,$context,$codetitles,$cat_titles,$cat_order,$num) = @_;      my ($dom,$context,$codetitles,$cat_titles,$cat_order,$num) = @_;
     my $output;      my $output;
     my %rowtitle = (      my %rowtitle = &Apache::lonlocal::texthash (
                     instcode  => 'Course Category',                      instcode  => 'Course Category',
                     crosslist => 'Cross Listed Course',                      crosslist => 'Cross Listed Course',
                    );                     );
     my %helpitem = (       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 2445  sub coursecode_form { Line 3283  sub coursecode_form {
         }          }
         if (@{$codetitles} > 0) {          if (@{$codetitles} > 0) {
             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 2512  sub coursecode_form { Line 3354  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 2529  sub get_course_dom { Line 3391  sub get_course_dom {
                     return $env{'user.domain'};                      return $env{'user.domain'};
                 }                  }
             }              }
             my @possible_doms;              my (@possible_doms,%willtrust);
             foreach my $type (@{$types}) {              foreach my $type (@{$types}) {
                 my $dom_str = $env{'environment.reqcrsotherdom.'.$type};                  my $dom_str = $env{'environment.reqcrsotherdom.'.$type};
                 if ($dom_str ne '') {                  if ($dom_str ne '') {
                     my @domains = split(',',$dom_str);                      my @domains = split(',',$dom_str);
                     foreach my $entry (@domains) {                      foreach my $entry (@domains) {
                         my ($extdom,$extopt) = split(':',$entry);                          my ($extdom,$extopt) = split(':',$entry);
                         if ($extdom eq $env{'request.role.domain'}) {                          unless (exists($willtrust{$extdom})) {
                             return $extdom;                              $willtrust{$extdom} = &Apache::lonnet::will_trust('reqcrs',$env{'user.domain'},$extdom);
                         }                           }
                         unless(grep(/^\Q$extdom\E$/,@possible_doms)) {                          if ($willtrust{$extdom}) {
                             push(@possible_doms,$extdom);                              if ($extdom eq $env{'request.role.domain'}) {
                                   return $extdom;
                               }
                               unless(grep(/^\Q$extdom\E$/,@possible_doms)) {
                                   push(@possible_doms,$extdom);
                               }
                         }                          }
                     }                      }
                 }                  }
Line 2604  sub display_navbuttons { Line 3471  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 2614  sub print_request_outcome { Line 3482  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 2641  sub print_request_outcome { Line 3511  sub print_request_outcome {
                         push(@instsections,$sec);                          push(@instsections,$sec);
                     }                      }
                     $sections{$i}{'loncapa'} = $env{'form.loncapasec_'.$i};                      $sections{$i}{'loncapa'} = $env{'form.loncapasec_'.$i};
                       $sections{$i}{'loncapa'} =~ s/\W//g;
                       if ($sections{$i}{'loncapa'} eq 'none') {
                           $sections{$i}{'loncapa'} = '';
                       }
                 }                  }
             }              }
         }          }
Line 2666  sub print_request_outcome { Line 3540  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 2677  sub print_request_outcome { Line 3552  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 2722  sub print_request_outcome { Line 3647  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 2729  sub print_request_outcome { Line 3659  sub print_request_outcome {
     }      }
     my $autoadds = 0;      my $autoadds = 0;
     if ($env{'form.autoadds'}) {      if ($env{'form.autoadds'}) {
         $autodrops = $env{'form.autoadds'};          $autoadds = $env{'form.autoadds'};
     }  
     if ($env{'form.autoadds'}) {  
         $autodrops = $env{'form.autoadds'};  
     }      }
     my $instcode = '';      my $instcode = '';
     if (exists($env{'form.instcode'})) {      if (exists($env{'form.instcode'})) {
         $instcode = $env{'form.instcode'};          $instcode = $env{'form.instcode'};
     }      }
       my $credits;
       if ($instcredits) {
           $credits = $instcredits;
       } elsif (exists($env{'form.coursecredits'})) {
           $credits = $env{'form.coursecredits'};
       }
     my $clonecrs = '';      my $clonecrs = '';
     my $clonedom = '';      my $clonedom = '';
     if (($env{'form.clonecrs'} =~ /^($match_courseid)$/) &&       if (($env{'form.cloning'}) &&
           ($env{'form.clonecrs'} =~ /^($match_courseid)$/) && 
         ($env{'form.clonedom'} =~ /^($match_domain)$/)) {          ($env{'form.clonedom'} =~ /^($match_domain)$/)) {
         my $clonehome = &Apache::lonnet::homeserver($env{'form.clonecrs'},          my $clonehome = &Apache::lonnet::homeserver($env{'form.clonecrs'},
                                                     $env{'form.clonedom'});                                                      $env{'form.clonedom'});
Line 2748  sub print_request_outcome { Line 3682  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'};
             }              }
         }          }
     }      }
       if ($env{'form.chome'} eq 'default') {
           my %servers = &Apache::lonnet::get_servers($dom,'library');
           my $numlib = keys(%servers);
           if ($numlib) {
               my $loadm=10000000;
               my $chome;
               foreach my $tryserver (keys(%servers)) {
                   ($chome,$loadm) =
                       &Apache::lonnet::compare_server_load($tryserver,$chome,$loadm);
               }
               $env{'form.chome'} = $chome;
           }
       }
     my $details = {      my $details = {
                     owner          => $env{'user.name'},                      owner          => $env{'user.name'},
                     domain         => $env{'user.domain'},                       domain         => $env{'user.domain'}, 
Line 2764  sub print_request_outcome { Line 3711  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'},
                     dateshift      => $env{'form.dateshift'},                      dateshift      => $env{'form.dateshift'},
                       tinyurls       => $env{'form.tinyurls'},
                     sectotal       => $sectotal,                      sectotal       => $sectotal,
                     sections       => \%sections,                      sections       => \%sections,
                     crosslisttotal => $crosslisttotal,                      crosslisttotal => $crosslisttotal,
Line 2780  sub print_request_outcome { Line 3730  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 2791  sub print_request_outcome { Line 3750  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 2804  sub print_request_outcome { Line 3767  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 2812  sub print_request_outcome { Line 3782  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 2839  sub print_request_outcome { Line 3824  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 2852  sub print_request_outcome { Line 3851  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 $clonemsg = [];
             my $type = 'Course';              my $type = 'Course';
             if ($crstype eq 'community') {              if ($crstype eq 'community') {
                 $type = 'Community';                  $type = 'Community';
Line 2861  sub print_request_outcome { Line 3862  sub print_request_outcome {
             foreach my $role (@roles) {              foreach my $role (@roles) {
                 $longroles{$role}=&Apache::lonnet::plaintext($role,$type);                  $longroles{$role}=&Apache::lonnet::plaintext($role,$type);
             }              }
             my $result = &Apache::loncoursequeueadmin::course_creation($dom,$cnum,              my $preamble = '<div id="LC_update" class="LC_info">'.
                                    'autocreate',$details,\$logmsg,\$newusermsg,\$addresult,                             '<br />'.
                                    \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles);                             &mt("Please be patient while your request is processed").
                              '<br /></div>'.
                              '<div style="padding:0;clear:both;margin:0;border:0"></div>';
                           my $closure = <<ENDCLOSE;
   <script type="text/javascript">
   // <![CDATA[
   \$("#LC_update").hide('slow');
   // ]]>
   </script>
   ENDCLOSE
               my %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,undef,$preamble);
               &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Processing ...'));
               $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,$clonemsg,\$newusermsg,
                                             \$addresult,\$enrollcount,\$response,\$keysmsg,\%domdefs,
                                             \%longroles,\$code,\%customitems);
               &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished!'));
               &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
               $r->print($closure);
               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 2874  sub print_request_outcome { Line 3916  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>';
                   if ($logmsg) {
                       $output .= '<p>'.$logmsg.'</p>';
                   }
                   if ((ref($clonemsg) eq 'ARRAY') && (@{$clonemsg})) {
                       $output .= '<p class="LC_info">';
                       my $user_lh = &Apache::loncommon::user_lang($env{'user.name'},$env{'user.domain'});
                       foreach my $item (@{$clonemsg}) {
                           if (ref($item) eq 'HASH') {
                               $output .= &mt_user($user_lh,$item->{mt},
                                                   @{$item->{args}}).'<br />'."\n";
                           }
                       }
                       $output .= '</p>'."\n";
                   }
                 $creationresult = 'created';                  $creationresult = 'created';
                   # Flush the course logs so reverse user roles immediately updated
                   unless ($registered_flush) {
                       my $handlers = $r->get_handlers('PerlCleanupHandler');
                       $r->set_handlers('PerlCleanupHandler' => [\&Apache::lonnet::flushcourselogs,@{$handlers}]);
                       $registered_flush=1;
                   }
                   if ($instcode ne '') {
                       &Apache::lonnet::devalidate_cache_new('instcats',$dom);
                       # Update cache of self-cataloging courses on institution's server(s).
                       if (&Apache::lonnet::shared_institution($dom)) {
                           unless ($registered_instcats) {
                               my $handlers = $r->get_handlers('PerlCleanupHandler');
                               $r->set_handlers('PerlCleanupHandler' => [\&devalidate_remote_instcats,@{$handlers}]);
                               $registered_instcats=1;
                               $modified_dom = $dom;
                           }
                       }
                   }
             } else {              } else {
                 $output = '<span class="LC_error">';                  $output = '<span class="LC_error">';
                 if ($crstype eq 'community') {                  if ($crstype eq 'community') {
Line 2890  sub print_request_outcome { Line 3983  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') {
                   $request->{$requestid}->{'instcode'} = $instcode;
               }
             my $statuskey = 'status:'.$dom.':'.$cnum;              my $statuskey = 'status:'.$dom.':'.$cnum;
             my %userreqhash = &Apache::lonnet::get('courserequests',[$statuskey],              my %userreqhash = &Apache::lonnet::get('courserequests',[$statuskey],
                                                    $env{'user.domain'},$env{'user.name'});                                                     $env{'user.domain'},$env{'user.name'});
Line 2911  sub print_request_outcome { Line 4008  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 2922  sub print_request_outcome { Line 4029  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 2935  sub print_request_outcome { Line 4044  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($r,$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 2952  sub print_request_outcome { Line 4098  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 devalidate_remote_instcats {
       if ($modified_dom ne '') {
           my %servers = &Apache::lonnet::internet_dom_servers($modified_dom);
           my %thismachine;
           map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();
           if (keys(%servers)) {
               foreach my $server (keys(%servers)) {
                   next if ($thismachine{$server});
                   &Apache::lonnet::remote_devalidate_cache($server,['instcats:'.$modified_dom]);
               }
           }
           $modified_dom = '';
       }
       return;
   }
   
   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 3094  sub update_requestors_roles { Line 4281  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 3112  sub notification_information { Line 4299  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 3130  sub notification_information { Line 4394  sub notification_information {
     return $output;      return $output;
 }  }
   
   sub pending_validation_form {
       my ($r,$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 $hostname = &Apache::lonnet::hostname($lonhost);
                   my $protocol = $Apache::lonnet::protocol{$lonhost};
                   $protocol = 'http' if ($protocol ne 'https');
                   my $alias = &Apache::lonnet::use_proxy_alias($r,$lonhost);
                   $hostname = $alias if ($alias ne '');
                   my $crscreator = $protocol.'://'.$hostname.'/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 3144  sub check_autolimit { Line 4458  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 3190  sub retrieve_settings { Line 4504  sub retrieve_settings {
             }              }
             $env{'form.clonecrs'} = $reqinfo{'clonecrs'};              $env{'form.clonecrs'} = $reqinfo{'clonecrs'};
             $env{'form.clonedom'} = $reqinfo{'clonedom'};              $env{'form.clonedom'} = $reqinfo{'clonedom'};
               if (($reqinfo{'clonecrs'} ne '') && ($reqinfo{'clonedom'} ne '')) {
                   $env{'form.cloning'} = 1;
               }
             $env{'form.datemode'} = $reqinfo{'datemode'};              $env{'form.datemode'} = $reqinfo{'datemode'};
             $env{'form.dateshift'} = $reqinfo{'dateshift'};              $env{'form.dateshift'} = $reqinfo{'dateshift'};
             if (($reqinfo{'crstype'} eq 'official') && ($reqinfo{'instcode'} ne '')) {               $env{'form.tinyurls'} = $reqinfo{'tinyurls'};
                  $env{'form.sectotal'} = $reqinfo{'sectotal'};              if ($reqinfo{'crstype'} eq 'official') {
                  $env{'form.crosslisttotal'} = $reqinfo{'crosslisttotal'};                  $env{'form.autoadds'} = $reqinfo{'autoadds'};
                  $env{'form.autoadds'} = $reqinfo{'autoadds'};                  $env{'form.autodrops'} = $reqinfo{'autodrops'};
                  $env{'form.autdrops'} = $reqinfo{'autodrops'};                  if ($reqinfo{'instcode'} ne '') { 
                  $env{'form.instcode'} = $reqinfo{'instcode'};                      $env{'form.sectotal'} = $reqinfo{'sectotal'};
                  my $crscode = {                       $env{'form.crosslisttotal'} = $reqinfo{'crosslisttotal'};
                                  $cnum => $reqinfo{'instcode'},                      $env{'form.instcode'} = $reqinfo{'instcode'};
                                };                      my $crscode = { 
                  &extract_instcode($dom,'instcode',$crscode,$cnum);                                      $cnum => $reqinfo{'instcode'},
                                     };
                       &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 3332  sub generate_date_items { Line 4660  sub generate_date_items {
     return;      return;
 }  }
   
   sub print_textbook_form {
       my ($r,$dom,$incdoms,$domdefs,$settings,$can_request,$crstype,$formhash) = @_;
       my (%prefab,%ordered,%numprefab);
       if ($crstype eq '') {
           $crstype = 'textbook';
       }
   #
   #  Retrieve list of prefabricated courses (textbook courses and templates) cloneable by user
   #
       foreach my $type ('textbooks','templates') {
           $numprefab{$type} = 0;
           if (ref($settings) eq 'HASH') {
               $prefab{$type} = $settings->{$type};
               if (ref($prefab{$type}) eq 'HASH') {
                   foreach my $item (keys(%{$prefab{$type}})) {
                       my ($clonedom,$clonecrs) = split(/_/,$item);
                       if (ref($prefab{$type}{$item}) eq 'HASH') {
                           if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                                             $env{'user.domain'},$clonecrs,$clonedom,$crstype,$dom)) {
   
                               my $num = $prefab{$type}{$item}{'order'};
                               $ordered{$type}{$num} = $item;
                               $numprefab{$type} ++;
                           }
                       }
                   }
               }
           }
       }
   
   #
   # Check if domain has multiple library servers
   #
       my ($home_server_pick,$numlib) =
           &Apache::loncommon::home_server_form_item($dom,'chome',
                                                     'default','hide');
       if ($numlib > 1) {
           $home_server_pick = &mt('Home Server for Course').': '.$home_server_pick.'<br />';
       }
   
   #
   # Retrieve information about courses owned by user, or in which user has an active
   # Course Coordinator role
   #
       my $numcurrent;
       my %cloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.',$env{'user.name'}.':'.$env{'user.domain'},
                                                     '.',undef,undef,'Course');
       my %ccroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
                                                   ['active'],['cc']);
   
       my $cc_clone = '';
       foreach my $role (keys(%ccroles)) {
           my ($cnum,$cdom,$rest) = split(/:/,$role,3);
           $cc_clone .= $cdom.':'.$cnum.'&';
           unless (exists($cloneable{$cdom.'_'.$cnum})) {
               my %courseinfo = &Apache::lonnet::coursedescription($cdom.'_'.$cnum,{'one_time' => 1});
               $cloneable{$cdom.'_'.$cnum} = {
                                                  context => $courseinfo{'internal.creationcontext'},
                                                  created => $courseinfo{'internal.created'},
                                                  creator => $courseinfo{'internal.creator'},
                                                  description => $courseinfo{'description'},
                                                  inst_code => $courseinfo{'coursecode'},
                                                  owner => $courseinfo{'internal.courseowner'},
                                                  releaserequired => $courseinfo{'internal.releaserequired'},
                                                  type  => $courseinfo{'type'},
                                             };
           }
       }
   
       my $numcurrent = scalar(keys(%cloneable));
   
   #
   # Retrieve information about courses from user's domain which user can clone, but which not owned
   # or cloneable based on Course Coordinator role.
   #
       my ($numdomcourses,%domcloneable);
       my %allcloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.','.','.',undef,undef,'Course',
                                                        undef,undef,undef,undef,undef,
                                                        $env{'user.name'}.':'.$env{'user.domain'},
                                                        $cc_clone,1);
       foreach my $cid (keys(%allcloneable)) {
           unless (exists($cloneable{$cid})) {
               $domcloneable{$cid} = $allcloneable{$cid};
           }
       }
       $numdomcourses = scalar(keys(%domcloneable));
   
       my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                    $env{'user.domain'});
   
   #
   # Retrieve any custom form information prior to rendering page
   #
   
       my $initprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'initializereview',$env{'user.name'},
                                                            $env{'user.domain'},$fullname);
       my %custominit;
       if (ref($initprocess) eq 'HASH') {
           &custom_formitems($initprocess,\%custominit);
       }
   
   #
   # Retrieve any custom onload actions or javascript used for page before rendering
   #
   
       my ($customonload,$customjs,$customvalidationjs);
       my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'prereview',$env{'user.name'},
                                                           $env{'user.domain'},$fullname,undef,undef,
                                                           undef,undef,\%custominit);
       if (ref($inprocess) eq 'HASH') {
           $customonload = $inprocess->{'onload'};
           $customjs = $inprocess->{'javascript'};
           $customvalidationjs = $inprocess->{'validationjs'};
       }
   
       my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'review',
                                                             $env{'user.name'},
                                                             $env{'user.domain'},$fullname,undef,undef,
                                                             undef,undef,\%custominit);
   
       my $jscript = &textbook_request_javascript(\%numprefab,$numcurrent,$numdomcourses,$customvalidationjs);
       $jscript .= $customjs;
       my (%loaditems,$args);
       $loaditems{'onload'} = 'javascript:uncheckAllRadio();'.$customonload;
       if ($crstype eq 'lti') {
          $args = { 'only_body' => 1};
       }
       $r->print(&header('Course Request',$jscript,\%loaditems,undef,$args));
   
       if (ref($can_request) eq 'HASH') {
           unless (((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) ||
                   ($crstype eq 'lti')) {
               &Apache::lonhtmlcommon::add_breadcrumb(
                   { href => '/adm/requestcourse',
                     text => 'Pick action',
                   });
           }
       }
       unless ($crstype eq 'lti') {
           &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests'));
   
           &startContentScreen($r,'textbookrequests');
   #
   # Show domain selector form, if required.
   #
           if (@{$incdoms} > 1) {
               my $onchange = 'this.form.submit()';
               $r->print('<form name="domforcourse" method="post" action="/adm/requestcourse">'.
                         '<div><fieldset><legend>'.&mt('Domain').'</legend>'.
                         &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,$incdoms).
                         '</fieldset></form>');
           }
       }
   
   #
   # Course request form
   #
   
   #
   # Course Title
   #
       $r->print('<form name="requestcourse" method="post" action="/adm/requestcourse" onsubmit="return validTextbookReq();">'.
                 '<div>'.
                 '<fieldset>'.
                 '<legend>'.&mt('Course Information').'</legend>'.
                 '<span class="LC_nobreak">'.&mt('Title').':&nbsp'.
                 '<input type="text" size="60" name="cdescr" value="" /></span><br />'.
                 $home_server_pick.'<br /></fieldset>'.
                 '</div>');
   
   #
   # Content source selection, if more than one available
   #
       if (keys(%cloneable) || keys(%ordered) || keys(%domcloneable)) {
           $r->print('<div>'. 
                     '<fieldset><legend>'.&mt('Course Content').'</legend>');
           if (keys(%ordered)) {
               if (ref($ordered{'textbooks'}) eq 'HASH') {
                   $r->print('<span class="LC_nobreak"><label>'.
                             '<input type="radio" name="cloning" value="textbook" onclick="javascript:cloneChoice();" />'.
                             &mt('Load textbook content').'</span>'.('&nbsp;'x2).' ');
               }
               if (ref($ordered{'templates'}) eq 'HASH') {
                   $r->print('<span class="LC_nobreak"><label>'.
                             '<input type="radio" name="cloning" value="template" onclick="javascript:cloneChoice();" />'.
                             &mt('Load pre-existing template').'</span>'.('&nbsp;'x2).' ');
               }
           }
           if (keys(%cloneable)) {
               $r->print('<span class="LC_nobreak"><label>'.
                         '<input type="radio" name="cloning" value="existing" onclick="javascript:cloneChoice();" />'.
                         &mt('Copy one of your courses').'</label></span>'.('&nbsp;'x2).' ');
           }
           if (keys(%domcloneable)) {
               $r->print('<span class="LC_nobreak"><label>'.
                         '<input type="radio" name="cloning" value="colleague" onclick="javascript:cloneChoice();" />'.
                         &mt("Copy a colleague's course").'</label></span>'.('&nbsp;'x2).' ');
           }
           $r->print('<span class="LC_nobreak"><label>'.
                     '<input type="radio" name="cloning" value="none" checked="checked" onclick="javascript:cloneChoice();" />'.
                     &mt('Empty course shell').'</label></span>');
       } else {
           $r->print('<input type="hidden" name="cloning" value="none" />');
       }
   
   #
   # Table of cloneable textbook courses
   #
       if (keys(%ordered)) {
           foreach my $type ('textbooks','templates') {
               my $divid = 'showtextbook';
               my $radioid = 'book';
               if ($type eq 'templates') {
                   $divid = 'showtemplate'; 
                   $radioid = 'template';
               }
               if (ref($ordered{$type}) eq 'HASH') {
                   $r->print('<div id="'.$divid.'" style="display:none">'.
                             &Apache::loncommon::start_data_table().
                             &Apache::loncommon::start_data_table_header_row().
                             '<th>'.&mt('Title').'</th>');
                   if ($type eq 'textbooks') {
                       $r->print('<th>'.&mt('Author(s)').'</th>');
                   }
                   $r->print('<th>'.&mt('Subject').'</th>');
                   if ($type eq 'textbooks') {
                       $r->print('<th>'.&mt('Publisher').'</th>'.
                                 '<th>'.&mt('Book').'</th>');
                   }
                   $r->print(&Apache::loncommon::end_data_table_header_row());
                   my @items = sort { $a <=> $b } keys(%{$ordered{$type}});
                   foreach my $num (@items) {
                       my $item = $ordered{$type}{$num};
                       my $cleantitle=&HTML::Entities::encode($prefab{$type}{$item}{'title'},'<>&"');
                       $cleantitle=~s/'/\\'/g;
                       $cleantitle =~ s/^\s+//;
                       $r->print(&Apache::loncommon::start_data_table_row().
                                 '<td><label><input type="radio" name="'.$radioid.'" value="'.$item.'" />'.
                                 $cleantitle.'</label></td>');
                       if ($type eq 'textbooks') {
                            $r->print('<td>'.$prefab{$type}{$item}{'author'}.'</td>');
                       }
                       $r->print('<td>'.$prefab{$type}{$item}{'subject'}.'</td>');
                       if ($type eq 'textbooks') {
                           $r->print('<td>'.$prefab{$type}{$item}{'publisher'}.'</td>'.
                                     '<td><img border="0" src="'.$prefab{$type}{$item}{'image'}.
                                     '" alt="'.$cleantitle.'" /></td>');
                       }
                       $r->print(&Apache::loncommon::end_data_table_row());
                   }
                   $r->print(&Apache::loncommon::end_data_table().
                             '</div>');
               }
           }
       }
   
   #
   # Table of user's current courses (owner and/or course coordinator)
   #
       my %lt = &clone_text('Course');
       if (keys(%cloneable)) {
           $r->print('<div id="showexisting" style="display:none">'.
                     &clone_selection_table($dom,'owned',\%cloneable).
                     '<fieldset style="display:inline-block"><legend>'.$lt{'dsh'}.'</legend><label>'.
                     '<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="364" />'.
                     '</fieldset><fieldset style="display:inline-block">'.
                     '<legend>'.$lt{'dpl'}.'</legend><label>'.
                     '<input type="radio" name="owntinyurls" value="delete" />'.$lt{'nsl'}.
                     '</label><br /><label>'.
                     '<input type="radio" name="owntinyurls" value="transfer" />'.$lt{'tsl'}.
                     '</label><br /><label>'.
                     '<input type="radio" name="owntinyurls" value="create" checked="checked" />'.$lt{'csl'}.
                     '</label></fieldset>'.
                     '</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).
                     '<fieldset style="display:inline-block"><legend>'.$lt{'dsh'}.'</legend><label>'.
                     '<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="364" />'.
                     '</fieldset><fieldset style="display:inline-block">'.
                     '<legend>'.$lt{'dpl'}.'</legend><label>'.
                     '<input type="radio" name="colltinyurls" value="delete" />'.$lt{'nsl'}.
                     '</label><br /><label>'.
                     '<input type="radio" name="colltinyurls" value="create" checked="checked" />'.$lt{'csl'}.
                     '</label></fieldset>'.
                     '</div>');
       }
   
   #
   # End of content selector
   #
       if (keys(%cloneable) || keys(%domcloneable) || keys(%ordered)) {
           $r->print('</fieldset></div>');
       }
   
       my %accesstitles = (
                             'start' => 'Default start access',
                              'end'   => 'Default end access',
                          );
       my %help_item = (
                          start => 'Course_Request_Access_Start',
                          end   => 'Course_Request_Access_End',
                       );
       my $starttime = time;
       my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
       my $startform = &Apache::lonhtmlcommon::date_setter('requestcourse','accessstart',
                                                           $starttime,'','','',1,'','','',1);
       my $endform = &Apache::lonhtmlcommon::date_setter('requestcourse','accessend',
                                                         $endtime,'','','',1,'','','',1);
   #
   # Set default start and end dates for student access
   # 
       $r->print('<div>'.
                 '<fieldset><legend>'.&mt('Student Access Dates').'</legend>'.
                 &Apache::loncommon::help_open_topic($help_item{'start'}).
                 '&nbsp;'.&mt($accesstitles{'start'}).$startform.'<br />'.
                 &Apache::loncommon::help_open_topic($help_item{'end'}).
                 '&nbsp;'.&mt($accesstitles{'end'}).$endform.'<br /></div>');
   
   #
   # Display any custom fields for this course type
   #
       if (ref($postprocess) eq 'HASH') {
           if ($postprocess->{'reviewweb'}) {
               $r->print($postprocess->{'reviewweb'});
           }
       }
   
   #
   # Submit button
   #
       $r->print('<input type="hidden" name="crstype" value="'.$crstype.'" />'.
                 '<input type="hidden" name="action" value="process" />'.
                 '<input type="submit" value="'.&mt('Create course').'" />');
   
   #
   # End request form
   #
   
       if (($crstype eq 'lti') && (ref($formhash) eq 'HASH')) {
           foreach my $item (keys(%{$formhash})) {
               $r->print('<input type="hidden" name="'.$item.'" value="'.$formhash->{$item}.'" />'."\n");
           }
       }
   
       $r->print('</form>');
       unless ($crstype eq 'lti') {
           &endContentScreen($r);
       }
       $r->print(&Apache::loncommon::end_page());
       return;
   }
   
   sub clone_selection_table {
       my ($dom,$name,$cloneableref) = @_;
       return unless ((ref($cloneableref) eq 'HASH') && (($name eq 'owned') || ($name eq 'colleague')));
       my %allownernames;
       my %sortbytitle;
       my $output;
       foreach my $cid (sort(keys(%{$cloneableref}))) {
           if (ref($cloneableref->{$cid}) eq 'HASH') {
               my $cdesc = $cloneableref->{$cid}{'description'};
               $cdesc =~ s/`/'/g;
               if ($cdesc ne '') {
                   push(@{$sortbytitle{$cdesc}},$cid);
               }
           }
       }
       foreach my $title (sort(keys(%sortbytitle))) {
            if (ref($sortbytitle{$title}) eq 'ARRAY') {
               foreach my $cid (sort(@{$sortbytitle{$title}})) {
                   my $cleantitle=&HTML::Entities::encode($title,'<>&"');
                   $cleantitle=~s/'/\\'/g;
                   $cleantitle =~ s/^\s+//;
                   my ($namestr,@owners,%ownernames);
                   if ($cloneableref->{$cid}{'owner'} ne '') {
                       push(@owners,$cloneableref->{$cid}{'owner'});
                   }
                   if ($cloneableref->{$cid}{'co-owners'} ne '') {
                       foreach my $item (split(/,/,$cloneableref->{$cid}{'co-owners'})) {
                           if (($item ne '') && (!grep(/^\Q$item\E$/,@owners))) {
                               push(@owners,$item);
                           }
                       }
                   }
                   foreach my $owner (@owners) {
                       my ($ownername,$ownerdom);
                       if ($owner =~ /:/) {
                           ($ownername,$ownerdom) = split(/:/,$owner);
                       } else {
                           $ownername = $owner;
                           if ($owner ne '') {
                               $ownerdom = $dom;
                           }
                       }
                       if ($ownername ne '' && $ownerdom ne '') {
                           if (exists($allownernames{$ownername.':'.$ownerdom})) {
                               $ownernames{$ownername.':'.$ownerdom} = $allownernames{$ownername.':'.$ownerdom};
                           } else {
                               my %namehash=&Apache::loncommon::getnames($ownername,$ownerdom);
                               $ownernames{$ownername.':'.$ownerdom} = \%namehash;
                               $allownernames{$ownername.':'.$ownerdom} = $ownernames{$ownername.':'.$ownerdom};
                           }
                       }
                   }
                   my @lastnames;
                   foreach my $owner (keys(%ownernames)) {
                       if (ref($ownernames{$owner}) eq 'HASH') {
                           push(@lastnames,$ownernames{$owner}{'lastname'});
                       }
                   }
                   if (@lastnames) {
                       $namestr = join(', ',sort(@lastnames));
                   }
                   $output .= &Apache::loncommon::start_data_table_row().
                              '<td><label><input type="radio" name="'.$name.'" value="'.$cid.'" />'.
                              '&nbsp;'.$cleantitle.'</label></td>'.
                              '<td>'.$namestr.'</td>'.
                              &Apache::loncommon::end_data_table_row();
               }
           }
       }
       if ($output) {
           return &Apache::loncommon::start_data_table().
                  &Apache::loncommon::start_data_table_header_row().
                  '<th>'.&mt('Title').'</th>'.
                  '<th>'.&mt('Owner/co-owner(s)').'</th>'.
                  &Apache::loncommon::end_data_table_header_row().
                  $output.
                  &Apache::loncommon::end_data_table();
       }
       return;
   }
   
   sub process_textbook_request {
       my ($r,$dom,$action,$domdefs,$domconfig,$can_request,$crstype) = @_;
       my ($uniquecode,$req_notifylist);
       if ($crstype eq '') {
           $crstype = 'textbook';
       }
       if (ref($domconfig) eq 'HASH') {
           if (ref($domconfig->{'requestcourses'}) eq 'HASH') {
               if (ref($domconfig->{'requestcourses'}{'notify'}) eq 'HASH') {
                   $req_notifylist = $domconfig->{'requestcourses'}{'notify'}{'approval'};
               }
               if (ref($domconfig->{'requestcourses'}{'uniquecode'}) eq 'HASH') {
                   $uniquecode = $domconfig->{'requestcourses'}{'uniquecode'}{$crstype};
               }
           }
       }
       my $now = time;
       my $reqtype = $env{'form.cloning'};
       my (@inststatuses,$storeresult,$creationresult);
       my $cnum = &Apache::lonnet::generate_coursenum($dom,'Course');
       my ($clonefrom,$clonedom,$clonecrs);
       if ($reqtype eq 'textbook') {
           $clonefrom = $env{'form.book'};
       } elsif ($reqtype eq 'template') {
           $clonefrom = $env{'form.template'};
       } elsif ($reqtype eq 'existing') {
           $clonefrom = $env{'form.owned'};
       } elsif ($reqtype eq 'colleague') {
           $clonefrom = $env{'form.colleague'};
       }
       my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend');
       if ($clonefrom) {
           ($clonedom,$clonecrs) = split(/_/,$clonefrom);
           if (&Apache::lonnet::homeserver($clonecrs,$clonedom) ne 'no_host') {
               my $canclone =
                   &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                               $env{'user.domain'},$clonecrs,$clonedom,$crstype,$dom);
               unless ($canclone) {
                   undef($clonecrs);
                   undef($clonedom);
               }
           } else {
               undef($clonecrs);
               undef($clonedom);
           }
       }
       my $args;
       if ($crstype eq 'lti') {
          $args = { 'only_body' => 1};
       }
       $r->print(&header('Course Creation','','',undef,$args));
   
       unless ($crstype eq 'lti') {
           if (ref($can_request) eq 'HASH') {
               unless ((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) {
                   &Apache::lonhtmlcommon::add_breadcrumb(
                       { href => '/adm/requestcourse',
                         text => 'Pick action',
                       });
               }
           }
           &Apache::lonhtmlcommon::add_breadcrumb(
                                                  { href => '/adm/requestcourse',
                                                    text => "Create Course",
                                                  }
                                                 );
           &Apache::lonhtmlcommon::add_breadcrumb({text=>'Request Processed'});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests'));
           &startContentScreen($r,'textbookrequests');
       }
   
       my $details = {
                       owner          => $env{'user.name'},
                       domain         => $env{'user.domain'},
                       cdom           => $dom,
                       cnum           => $cnum,
                       coursehome     => $env{'form.chome'},
                       cdescr         => $env{'form.cdescr'},
                       crstype        => $crstype,
                       uniquecode     => $uniquecode,
                       clonedom       => $clonedom,
                       clonecrs       => $clonecrs,
                       accessstart    => $accessstart,
                       accessend      => $accessend,
                       personnel      => {},
                     };
       if (($clonecrs ne '') && ($clonedom ne '')) {
           if ($reqtype eq 'existing') {
               $details->{datemode} = $env{'form.owndatemode'};
               if ($details->{datemode} eq 'shift') {
                   $details->{dateshift} = $env{'form.owndateshift'};
               } else {
                   $details->{dateshift} = '';
               }
               $details->{tinyurls} = $env{'form.owntinyurls'};
           } elsif ($reqtype eq 'colleague') {
               $details->{datemode} = $env{'form.colldatemode'};
               if ($details->{datemode} eq 'shift') {
                   $details->{dateshift} = $env{'form.colldateshift'};
               } else {
                   $details->{dateshift} = '';
               }
               $details->{tinyurls} = $env{'form.colltinyurls'};
           } elsif (($reqtype eq 'textbook') || ($reqtype eq 'template')) {
               $details->{datemode} = 'delete';
               $details->{dateshift} = '';
               $details->{tinyurls} = '';
           }
           if ($details->{dateshift} ne '') {
               $details->{dateshift} =~ s/[^\d\.]+//g;
           }
       } else {
           $details->{datemode} = '';
           $details->{dateshift} = '';
           $details->{tinyurls} = '';
       }
       my $lonhost = $r->dir_config('lonHostID');
       $r->rflush();
       my ($result,$output,$customized) = &process_request($r,$lonhost,$dom,$cnum,$crstype,$now,$details,
                                                           '',$req_notifylist,[],$domconfig);
       $r->print($output);
       if ($crstype eq 'lti') {
           my $storecrs;
           if ($env{'request.lti.login'}) {
               my %lti = &Apache::lonnet::get_domain_lti($dom,'provider');
               if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') {
                   $storecrs = $lti{$env{'request.lti.login'}}{'storecrs'};
               }
               if ($storecrs) {
                   my %consumers = &Apache::lonnet::get_dom('lticonsumers',[$env{'form.sourcecrs'}],$dom);
                   if (($env{'form.lti.sourcecrs'} ne '')  && ($consumers{$env{'form.lti.sourcecrs'}} eq '') && ($cnum ne '')) {
                       &Apache::lonnet::put_dom('lticonsumers',{ $env{'form.lti.sourcecrs'} => $env{'request.lti.login'}.':'.$cnum },$dom);
                   }
               }
           }
       } elsif (&Apache::loncoursequeueadmin::author_prompt()) {
           unless ($customized) {
               &print_author_prompt($r,$action,$cnum,$dom,$crstype,$result);
           }
       } elsif ($result eq 'created') {
           unless ($customized) {
               $r->print('<p><a href="/adm/requestcourse">'.&mt('Create another course').'</a></p>');
           }
       }
       unless ($crstype eq 'lti') {
           &endContentScreen($r);
       }
       $r->print(&Apache::loncommon::end_page());
   }
   
   sub textbook_request_javascript {
       my ($numprefab,$numcurrent,$numcolleague,$customvalidationjs) = @_;
       return unless (ref($numprefab) eq 'HASH');
       return if (!$numprefab->{'textbooks'} && !$numprefab->{'templates'} && !$numcurrent && !$numcolleague);
       my %js_lt = &Apache::lonlocal::texthash(
                    choose    => 'Please select a content option.',
                    textbook  => 'Please select a textbook, or choose a different option.',
                    template  => 'Please select a template, or choose a different option.',        
                    existing  => 'Please select one of your existing courses to copy, or choose a different option.',
                    colleague => "Please select a colleague's course to copy, or choose a different option.", 
                    title     => 'Please enter a course title.',
                );
       &js_escape(\%js_lt);
       return <<"ENDSCRIPT";
   function cloneChoice() {
       if (document.requestcourse.cloning) {
           var radioLength = document.requestcourse.cloning.length;
           if (radioLength == undefined) {
               var val = document.requestcourse.cloning.value;
               if ((val == 'textbook') || (val == 'template') || (val == 'existing') || (val == 'colleague')) {
                   var elem = document.getElementById('show'+val);
                   if (document.requestcourse.cloning.checked) {
                       elem.style.display = 'block';
                   } else {
                       uncheckRadio(val);
                       elem.style.display = 'none';
                   }
               }
           } else {
               for (var i=0; i<radioLength; i++) {
                   var val = document.requestcourse.cloning[i].value;
                   if ((val == 'textbook') || (val == 'template') || (val == 'existing') || (val == 'colleague')) {
                       var elem = document.getElementById('show'+val);
                       if (document.requestcourse.cloning[i].checked) {
                           elem.style.display = 'block';
                       }  else {
                           if (val == 'textbook') {
                               uncheckRadio('book');
                           }
                           if (val == 'template') {
                               uncheckRadio('template');
                           }
                           if (val == 'existing') {
                               uncheckRadio('owned');
                           }
                           if (val == 'colleague') {
                               uncheckRadio('colleague');
                           }
                           elem.style.display = 'none';
                       }
                   }
               }
           }
       }
       return;
   }
   
   function uncheckRadio(radioGroupName) {
       var group = document.getElementsByName(radioGroupName);
       var radioLength = group.length;
       if (radioLength == undefined) {
           group.checked = false;
       } else {
           for (var i=0; i<radioLength; i++) {
               group[i].checked = false;
           }
       }
       return;
   }
   
   function uncheckAllRadio() {
       uncheckRadio('cloning');
       var numbook = $numprefab->{'textbooks'};
       var numtemplate = $numprefab->{'templates'};
       var numcurrent = $numcurrent;
       var numcolleague = $numcolleague;
       if (numbook > 0) {
           uncheckRadio('textbook'); 
       }
       if (numtemplate > 0) {
           uncheckRadio('template');
       }
       if (numcurrent > 0) {
           uncheckRadio('existing');
       }
       if (numcolleague > 0) {
           uncheckRadio('colleague');
       }
       return;
   }
   
   function validTextbookReq() {
       if (document.requestcourse.cloning) {
           var cloneChoice = 0;
           var radioLength = document.requestcourse.cloning.length;
           if (radioLength == undefined) {
               if (document.requestcourse.cloning.checked == false) {
                   alert("$js_lt{'choose'}");
                   return false;
               } else {
                   cloneChoice = document.requestcourse.cloning.value;
               }
           } else {
               for (var i=0; i<radioLength; i++) {
                   if (document.requestcourse.cloning[i].checked) {
                       cloneChoice = document.requestcourse.cloning[i].value;
                       break;
                   }
               }
               if (cloneChoice == 0) {
                   alert("$js_lt{'choose'}");
                   return false;
               }
           }
           var group;
           if ((cloneChoice == 'textbook') || (cloneChoice == 'template') || (cloneChoice == 'existing') || (cloneChoice == 'colleague')) {
               var group;
               if (cloneChoice == 'textbook') {
                   group = document.getElementsByName('book');
               } else {
                   if (cloneChoice == 'template') {
                       group = document.getElementsByName('template');
                   } else {
                       if (cloneChoice == 'existing') {
                           group = document.getElementsByName('owned');
                       } else {
                           group = document.getElementsByName('colleague');
                       }
                   }
               }
               var groupLength = group.length;
               var chosen = 0;
               if (groupLength == undefined) {
                   if (group.checked) {
                       chosen = 1;
                   }
               } else {
                   for (var j=0; j<groupLength; j++) {
                       if (group[j].checked) {
                           chosen = 1;
                           break;
                       }
                   }
              }
              if (chosen == 0) {
                  if (cloneChoice == 'textbook') {
                      alert("$js_lt{'textbook'}");
                  } else {
                      if (cloneChoice == 'template') {
                          alert("$js_lt{'template'}");
                      } else {
                          if (cloneChoice == 'existing') {
                              alert("$js_lt{'existing'}");
                          } else {
                              alert("$js_lt{'colleague'}");
                          }
                      }
                  }
                  return false;
               }
           }
       }
       if (document.requestcourse.cdescr.value == '') {
           alert("$js_lt{'title'}");
           return false;
       }
       $customvalidationjs
       return true;
   }
    
   ENDSCRIPT
   
   }
   
   sub textbook_request_disabled {
       my ($r,$dom,$action,$can_request) = @_;
       if (ref($can_request) eq 'HASH') {
           if ($action eq 'process') {
               unless ((scalar(keys(%{$can_request})) == 1)) {
                   &Apache::lonhtmlcommon::add_breadcrumb(
                      { href => '/adm/requestcourse',
                        text => 'Pick action',
                      });
               }
           }
       }
       $r->print(&header('Course Request'));
       &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests').
                 '<div>'.
                 '<p class="LC_info">'.&mt('You do not have privileges to request creation of textbook courses.').'</p>');
       if (ref($can_request) eq 'HASH') {
           if (scalar(keys(%{$can_request})) > 1) {
               $r->print('<a href="/adm/requestcourse">'.&mt('Go back').'</a>');
            }
       }
       $r->print('</div>'.
                 &Apache::loncommon::end_page());
       return;
   }
   
   sub startContentScreen {
       my ($r,$mode)=@_;
       $r->print("\n".'<ul class="LC_TabContentBigger" id="textbookreq">'."\n");
       $r->print('<li'.(($mode eq 'textbookrequests')?' class="active"':'').'><a href="/adm/requestcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Request a Course').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n");
       $r->print('<li'.(($mode eq 'textbooklogs')?' class="active"':'').'><a href="/adm/requestcourse?action=log&amp;crstype=textbook&amp;tabs=on"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Course Request History').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n");
       $r->print("\n".'</ul>'."\n");
       $r->print('<div class="LC_Box" style="clear:both;margin:0;"><div id="mainbox" style="margin:0 0;padding:0 0;"><div class="LC_ContentBox" id="maincontentbox" style="display: block;">');
   }
   
   sub endContentScreen {
      my ($r)=@_;
      $r->print('</div></div></div>');
   }
      
 1;  1;
   

Removed from v.1.44  
changed lines
  Added in v.1.116


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.