--- loncom/interface/lonrequestcourse.pm	2009/09/08 13:20:27	1.32
+++ loncom/interface/lonrequestcourse.pm	2009/10/24 03:56:01	1.36.2.3
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Request a course
 #
-# $Id: lonrequestcourse.pm,v 1.32 2009/09/08 13:20:27 raeburn Exp $
+# $Id: lonrequestcourse.pm,v 1.36.2.3 2009/10/24 03:56:01 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -52,10 +52,6 @@ described at http://www.lon-capa.org.
 
 =item onload_action()
 
-=item check_can_request() 
-
-=item course_types()
-
 =item print_main_menu()
 
 =item request_administration()
@@ -178,7 +174,7 @@ sub handler {
         $trail{'enrollment'} = 'Enrollment';
     }
 
-    my ($page,$crumb,$newinstcode,$codechk,$checkedcode) = 
+    my ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description) = 
         &get_breadcrumbs($dom,$action,\$state,\%states,\%trail);
     if ($action eq 'display') {
         if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {
@@ -238,8 +234,8 @@ sub handler {
                                     foreach my $item (@code_order) {
                                         $crosslistcode .= $env{'form.crosslist_'.$i.'_'.$item}; 
                                     }
-                                    if ($crosslistcode ne '') { 
-                                         $codechk{$i} = 
+                                    if ($crosslistcode ne '') {
+                                        ($codechk{$i}, my $rest) =
                                             &Apache::lonnet::auto_validate_instcode('',$dom,$crosslistcode);
                                     }
                                     unless ($codechk{$i} eq 'valid') {
@@ -277,7 +273,7 @@ sub handler {
     my $loaditems = &onload_action($action,$state);
 
     my %can_request;
-    my $canreq = &check_can_request($dom,\%can_request);
+    my $canreq = &Apache::lonnet::check_can_request($dom,\%can_request);
     if ($action eq 'new') {
         if ($canreq) {
             if ($state eq 'crstype') {
@@ -286,7 +282,8 @@ sub handler {
             } else {
                 &request_administration($r,$action,$state,$page,\%states,$dom,
                                         $jscript,$loaditems,$crumb,$newinstcode,
-                                        $codechk,$checkedcode,\@invalidcrosslist);
+                                        $codechk,$checkedcode,$description,
+                                        \@invalidcrosslist);
             }
         } else {
             $r->print(&header('Course Requests').$crumb.
@@ -310,7 +307,7 @@ sub handler {
                       &close_popup_form());
         } else {
             &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
-                                    $loaditems,$crumb,'','','','',$uname,$udom);
+                                    $loaditems,$crumb,'','','','','',$uname,$udom);
         }
     } elsif ($action eq 'log') {
         &print_request_logs($jscript,$loaditems,$crumb);
@@ -346,7 +343,7 @@ END
 
 sub get_breadcrumbs {
     my ($dom,$action,$state,$states,$trail) = @_;
-    my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles);
+    my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles,$description);
     my $page = 0;
     if ((ref($states) eq 'HASH') && (ref($trail) eq 'HASH') && (ref($state))) {
         if (defined($action)) {
@@ -371,7 +368,7 @@ sub get_breadcrumbs {
                                     $$state = 'codepick';
                                     $page --;
                                 } else {
-                                    $codechk = 
+                                    ($codechk,$description) = 
                                         &Apache::lonnet::auto_validate_instcode('',
                                             $dom,$newinstcode);
                                     if ($codechk ne 'valid') {
@@ -416,7 +413,7 @@ sub get_breadcrumbs {
                 {text=>'Pick Action'});
         $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');
     }
-    return ($page,$crumb,$newinstcode,$codechk,$checkedcode);
+    return ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description);
 }
 
 sub header {
@@ -593,52 +590,9 @@ sub onload_action {
     return \%loaditems;
 }
 
-sub check_can_request {
-    my ($dom,$can_request) = @_;
-    my $canreq = 0;
-    my ($types,$typename) = &course_types();
-    my @options = ('approval','validate','autolimit');
-    my $optregex = join('|',@options);
-    if ((ref($can_request) eq 'HASH') && (ref($types) eq 'ARRAY')) {
-        foreach my $type (@{$types}) {
-            if (&Apache::lonnet::usertools_access($env{'user.name'},
-                                                  $env{'user.domain'},
-                                                  $type,undef,'requestcourses')) {
-                $canreq ++;
-                if ($dom eq $env{'user.domain'}) {
-                    $can_request->{$type} = 1;
-                }
-            }
-            if ($env{'environment.reqcrsotherdom.'.$type} ne '') {
-                my @curr = split(',',$env{'environment.reqcrsotherdom.'.$type});
-                if (@curr > 0) {
-                    $canreq ++;
-                    unless ($dom eq $env{'user.domain'}) {
-                        if (grep(/^\Q$dom\E:($optregex)(=?\d*)$/,@curr)) {
-                            $can_request->{$type} = 1;
-                        }
-                    }
-                }
-            }
-        }
-    }
-    return $canreq;
-}
-
-sub course_types {
-    my @types = ('official','unofficial','community');
-    my %typename = (
-                         official   => 'Official course',
-                         unofficial => 'Unofficial course',
-                         community  => 'Community',
-                    );
-    return (\@types,\%typename);
-}
-
-
 sub print_main_menu {
     my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb) = @_;
-    my ($types,$typename) = &course_types();
+    my ($types,$typename) = &Apache::loncommon::course_types();
     my $onchange;
     unless ($env{'form.interface'} eq 'textual') {
         $onchange = 1;
@@ -657,8 +611,31 @@ sub print_main_menu {
         }
     }
 
+    my $standby=&mt('Course selected. Please stand by.');
     my $js = <<"END";
 
+function enterrole (thisform,rolecode,buttonname) {
+    document.title='$standby';
+    window.status='$standby';
+    thisform.newrole.value=rolecode;
+    thisform.selectrole.value='1';
+    thisform.submit();
+}
+
+function ToSyllabus(cdom,cnum) {
+    if (cdom == '' || cdom == null) {
+        return;
+    }
+    if (cnum == '' || cnum == null) {
+        return;
+    }
+    var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';
+    var url = "/public/"+cdom+"/"+cnum+"/syllabus";
+    syllwin = window.open(url,'',options,1);
+    syllwin.focus();
+    return;
+}
+
 function nextPage(formname) {
     var crschoice = document.mainmenu_coursetype.crstype.value;
     var actionchoice = document.mainmenu_action.action.value;
@@ -723,16 +700,20 @@ END
 }
 
 END
-
-    $r->print(&header('Course Requests',$js.$jscript,$loaditems).$crumb.'<div>'.
+    $r->print(&header('Concept Test Courses',$js.$jscript,$loaditems).$crumb);
+    my $existing = &existing_courses();
+    if ($existing) {
+        $r->print('<div class="LC_left_float">'.
+                 '<h3>'.&mt('Request creation of a new course').'</h3>');
+    } else {
+        $r->print('<div><h3>'.&mt('Request creation of a new course, or review your pending course requests.').'</h3>');
+    }
+    $r->print('<p>'.
               &Apache::lonhtmlcommon::start_pick_box().
               &Apache::lonhtmlcommon::row_title(&mt('Course Domain')).
-              '<form name="domforcourse" method="post" action="/adm/requestcourse">'.
-              &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange));
-    if (!$onchange) {
-        $r->print('&nbsp;<input type="submit" name="godom" value="'.
-                   &mt('Change').'" />');
-    }
+              '<form name="domforcourse" method="post" action="/adm/requestcourse">');
+    $r->print('GCI Web Center Concept Test Delivery (gcitest)'."\n".
+              '<input type="hidden" value="gcitest" name="showdom" />');
     $r->print('</form>'.&Apache::lonhtmlcommon::row_closure());
 
     my $formname = 'requestcrs';
@@ -742,41 +723,217 @@ END
 <select size="1" name="action" >
  <option value="new">'.&mt('New request').'</option>
  <option value="view">'.&mt('View/Modify/Cancel pending requests').'</option>
- <option value="log">'.&mt('View request history').'</option>
 </select></form>'.
               &Apache::lonhtmlcommon::row_closure(1).
-              &Apache::lonhtmlcommon::row_title(&mt('Course Type')).'
-<form name="mainmenu_coursetype" method="post" action="">
-<select size="1" name="crstype">
- <option value="any">'.&mt('All types').'</option>');
-    if ((ref($types) eq 'ARRAY') && (ref($typename) eq 'HASH')) {
-        foreach my $type (@{$types}) {
-            my $selected = '';
-            if ($type eq 'official') {
-                $selected = ' selected="selected"';
-            }
-            $r->print('<option value="'.$type.'"'.$selected.'>'.$typename->{$type}.
-                      '</option>'."\n");
-        }
-    }
-    $r->print('</select></form>'."\n".
+              &Apache::lonhtmlcommon::row_title(&mt('Course Type')).
+              &mt($typename->{'unofficial'})."\n".
+              '<form name="mainmenu_coursetype" method="post" action="">'."\n".
+              '<input type="hidden" name="crstype" value="unofficial" ></form>'."\n".
               &Apache::lonhtmlcommon::row_closure(1)."\n".
-              &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".
-              '<div><form name="'.$formname.'" method="post" action="">'."\n".
+              &Apache::lonhtmlcommon::end_pick_box().'</p>'."\n".
+              '<p><form name="'.$formname.'" method="post" action="">'."\n".
               '<input type="hidden" name="state" value="crstype" />'."\n".
               '<input type="hidden" name="showdom" value="'.$dom.'" />'."\n".
               '<input type="hidden" name="crstype" value="" />'."\n".
               '<input type="hidden" name="action" value="" />'."\n".
               '<input type="button" name="next" value="'.$nexttext.
               '" onclick="javascript:nextPage(document.'.$formname.')" />'."\n".
-              '</form></div>');
+              '</form></p>');
+    if ($existing) {
+        $r->print('</div><div class="LC_left_float"><h3>'.&mt('Enter an existing Concept Test course').'</h3>'.$existing.'</div><div class="LC_clear_float_footer"></div>');
+    } else {
+        $r->print('</div>');
+    }
     $r->print(&Apache::loncommon::end_page());
     return;
 }
 
+sub existing_courses {
+    my $output;
+    my %roleshash = &Apache::lonnet::get_my_roles(undef,undef,'userroles',undef,
+                                                  ['cc'],['gcitest']);
+    my %courses;
+    if (keys(%roleshash) > 0) {
+        foreach my $key (keys(%roleshash)) {
+            my ($cnum,$cdom,$role) = split(':',$key);
+            my ($tstart,$tend) = split(':',$roleshash{$key});
+            my %coursehash = &Apache::lonnet::coursedescription($cdom.'/'.$cnum);
+            $courses{$cdom.'_'.$cnum}{'description'} = $coursehash{'description'};
+            $courses{$cdom.'_'.$cnum}{'owner'} = $coursehash{'internal.courseowner'};
+            if (defined($coursehash{'default_enrollment_start_date'}) ) {
+                $courses{$cdom.'_'.$cnum}{'startaccess'} = 
+                    &Apache::lonlocal::locallocaltime($coursehash{'default_enrollment_start_date'});
+            }
+            if (defined($coursehash{'default_enrollment_end_date'}) ) {
+                $courses{$cdom.'_'.$cnum}{'endaccess'} = 
+                    &Apache::lonlocal::locallocaltime($coursehash{'default_enrollment_end_date'});
+                if ($coursehash{'default_enrollment_end_date'} == 0) {
+                    $courses{$cdom.'_'.$cnum}{'endaccess'} = &mt('No ending date');
+                }
+            }
+        }
+        $output = '<form name="pickrole" action="/adm/roles" method="post">'.
+                  &Apache::loncommon::start_data_table().
+                  &Apache::loncommon::start_data_table_header_row();
+        my @coltitles = ('Select','Title','Owner(s)',
+                         'Default Access Dates for Students','Student Counts');
+        foreach my $item (@coltitles) {
+            $output .= '<th>';
+            if ($item eq 'Select') {
+                $output .= '&nbsp;&nbsp;';
+            } else {
+                $output .= &mt($item);
+            }
+            $output .= '</th>';
+        }
+        $output .= &Apache::loncommon::end_data_table_header_row();
+        my %courseinfo = &build_courseinfo_hash(\%courses);
+        my %Sortby;
+        foreach my $course (sort(keys(%courses))) {
+            my $clean_title = $courseinfo{$course}{'title'};
+            $clean_title =~ s/\W+//g;
+            if ($clean_title eq '') {
+                $clean_title = $courseinfo{$course}{'title'};
+            }
+            push(@{$Sortby{$clean_title}},$course);
+        }
+        my @sorted_courses;
+        my @sorted_courses = sort { lc($a) cmp lc($b) } (keys(%Sortby));
+        foreach my $item (@sorted_courses) {
+            foreach my $course (@{$Sortby{$item}}) {
+                my ($cdom,$cnum) = split('_',$course); 
+                $output.= &Apache::loncommon::start_data_table_row().
+                          &courseinfo_row($courseinfo{$course},$cnum,$cdom).
+                          &Apache::loncommon::end_data_table_row();
+            }
+        }
+        $output .= &Apache::loncommon::end_data_table().
+                   '<input type="hidden" name="newrole" value="" />'.
+                   '<input type="hidden" name="selectrole" value="" /></form>';
+    }
+    return $output;
+}
+
+sub build_courseinfo_hash {
+    my ($courses) = @_;
+    my %courseinfo;
+    foreach my $course (keys(%{$courses})) {
+        my ($cdom,$cnum) = split('_',$course);
+        my $descr;
+        if (ref($courses->{$course}) eq 'HASH') {
+            $descr = $courses->{$course}{'description'};
+        }
+        my $cleandesc=&HTML::Entities::encode($descr,'<>&"');
+        $cleandesc=~s/'/\\'/g;
+        $cleandesc =~ s/^\s+//;
+        my ($cdom,$cnum)=split(/\_/,$course);
+        my ($singleowner,@owners,%ownernames);
+        if (ref($courses->{$course}) eq 'HASH') {
+            $singleowner = $courses->{$course}{'owner'};
+            push(@owners,$singleowner);
+            if (ref($courses->{$course}{'co-owners'}) eq 'ARRAY') {
+                foreach my $item (@{$courses->{$course}{'co-owners'}}) {
+                    push(@owners,$item);
+                }
+            }
+        }
+        foreach my $owner (@owners) {
+            my ($ownername,$ownerdom);
+            if ($owner =~ /:/) {
+                ($ownername,$ownerdom) = split(/:/,$owner);
+            } else {
+                $ownername = $owner;
+                if ($owner ne '') {
+                    $ownerdom = $cdom;
+                }
+            }
+            if ($ownername ne '' && $ownerdom ne '') {
+                my %namehash=&Apache::loncommon::getnames($ownername,$ownerdom);
+                $ownernames{$ownername.':'.$ownerdom} = \%namehash;
+            }
+        }
+        $courseinfo{$course}{'cdom'} = $cdom;
+        $courseinfo{$course}{'cnum'} = $cnum;
+        my @lastnames;
+        foreach my $owner (keys(%ownernames)) {
+            if (ref($ownernames{$owner}) eq 'HASH') {
+                push(@lastnames,$ownernames{$owner}{'lastname'});
+            }
+        }
+        $courseinfo{$course}{'ownerlastnames'} = join(', ',sort(@lastnames));
+        $courseinfo{$course}{'title'} = $cleandesc;
+        $courseinfo{$course}{'owner'} = $singleowner;
+        my @classids;
+        $courseinfo{$course}{'counts'} =  &count_students($cdom,$cnum,0);
+        my $startaccess = $courses->{$course}{'startaccess'};
+        my $endaccess = $courses->{$course}{'endaccess'};
+        my $accessdates;
+        if ($startaccess) {
+            $accessdates .= '<i>'.&mt('From:[_1]','</i> '.$startaccess).'<br />';
+        }
+        if ($endaccess) {
+            $accessdates .= '<i>'.&mt('To:[_1]','</i> '.$endaccess).'<br />';
+        }
+        $courseinfo{$course}{'access'} = $accessdates;
+    }
+    return %courseinfo;
+}
+
+sub courseinfo_row {
+    my ($info,$cnum,$cdom) = @_;
+    my $output;
+    if (ref($info) eq 'HASH') {
+        my $rolecode = 'cc./'.$cdom.'/'.$cnum;
+        my $buttonname = $rolecode;
+        $buttonname=~s/\W//g;
+        $output .= '<td><input type="button" name="'.$buttonname.'" value="'.&mt('Select').'" onclick="javascript:enterrole(this.form,'."'$rolecode','$buttonname'".')" ></td>'.
+                   '<td>'.$info->{'title'}.'&nbsp;<font size="-2">'.
+                   '<a href="javascript:ToSyllabus('."'$cdom','$cnum'".')">'.
+                   &mt('Syllabus').'</a></font></td>'.
+                   '<td>'.$info->{'ownerlastnames'}.'</td>'.
+                   '<td>'.$info->{'access'}.'</td>'.
+                   '<td>'.$info->{'counts'}.'</td>';
+    } else {
+        $output = '<td colspan="4">'.&mt('No information available for [_1].',
+                                         $cdom.'_'.$cnum).'</td>';
+        return $output;
+    }
+    return $output;
+}
+
+sub count_students {
+    my ($cdom,$cnum,$numsec) = @_;
+    my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cnum);
+    my %student_count = (
+                           Active => 0,
+                           Future => 0,
+                           Expired => 0,
+                       );
+    my %idx;
+    $idx{'status'} = &Apache::loncoursedata::CL_STATUS();
+    my %status_title = &Apache::lonlocal::texthash(
+                           Expired => 'Previous access',
+                           Active => 'Current access',
+                           Future => 'Future access',
+                       );
+
+    while (my ($student,$data) = each(%$classlist)) {
+        $student_count{$data->[$idx{'status'}]} ++;
+    }
+
+    my $countslist = &mt('[quant,_1,section:,sections:,No sections]',$numsec).'<br />';
+    foreach my $status ('Active','Future') {
+        $countslist .= '<span class="LC_nobreak">'.$status_title{$status}.': '.
+                       $student_count{$status}.'</span><br />';
+    }
+    return $countslist;
+}
+
+
 sub request_administration {
     my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb,
-        $newinstcode,$codechk,$checkedcode,$invalidcrosslist,$uname,$udom) = @_;
+        $newinstcode,$codechk,$checkedcode,$description,$invalidcrosslist,
+        $uname,$udom) = @_;
     my $js;
     if (($action eq 'new') || (($action eq 'view') && ($state eq 'pick_request'))) {
         $js =  <<END;
@@ -812,7 +969,7 @@ END
         }
         $r->print(&header('Request a course',$js.$jscript,$loaditems,$jsextra).$crumb);
         &print_request_form($r,$action,$state,$page,$states,$dom,$newinstcode,
-                            $codechk,$checkedcode,$invalidcrosslist);
+                            $codechk,$checkedcode,$description,$invalidcrosslist);
     } elsif ($action eq 'view') {
         my $jsextra;
         my $formname = 'requestcrs';
@@ -1124,7 +1281,7 @@ sub get_instcode {
 
 sub print_request_form {
     my ($r,$action,$state,$page,$states,$dom,$newinstcode,$codechk,$checkedcode,
-        $invalidcrosslist) = @_;
+        $description,$invalidcrosslist) = @_;
     my $formname = 'requestcrs';
     my ($next,$prev,$message,$output,$codepicker,$crstype);
     $prev = $states->{$action}[$page-1];
@@ -1134,7 +1291,7 @@ sub print_request_form {
                                                next => 'Next',
                                              );
     $crstype = $env{'form.crstype'};
-    $r->print('<form name="'.$formname.'" method="post" action="/adm/requestcourse">');
+    $r->print('<br /><form name="'.$formname.'" method="post" action="/adm/requestcourse">');
     my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk,
         @disallowed);
     if ($crstype eq 'official') {
@@ -1171,7 +1328,9 @@ sub print_request_form {
             $codepicker = &coursecode_form($dom,'instcode',\@codetitles,
                                            \%cat_titles,\%cat_order);
             if ($codepicker) {
-                $r->print('<div>'.&Apache::lonhtmlcommon::start_pick_box().$codepicker.
+                $r->print(&mt('Specify the course to be created.').
+                          '<div>'.&Apache::lonhtmlcommon::start_pick_box().
+                          $codepicker.
                           &Apache::lonhtmlcommon::end_pick_box().'</div>');
             } else {
                 $next = $states->{$action}[$page+2];
@@ -1187,7 +1346,7 @@ sub print_request_form {
         if ($instcode eq '') {
             $prev = $states->{$action}[$page-2];
         }
-        $r->print(&courseinfo_form($dom,$formname,$crstype,$next));
+        $r->print(&courseinfo_form($dom,$formname,$crstype,$next,$description));
     } elsif ($state eq 'enrollment') {
         if ($crstype eq 'official') {
             &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
@@ -1411,7 +1570,7 @@ sub get_excluded_elements {
 sub print_enrollment_menu {
     my ($formname,$instcode,$dom,$codetitles,$cat_titles,$cat_order,$code_order,
         $invalidcrosslist) =@_;
-    my ($sections,$autoenroll,$access_dates,$output);
+    my ($sections,$autoenroll,$access_dates,$output,$hasauto);
     my $starttime = time;
     my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
 
@@ -1430,7 +1589,8 @@ sub print_enrollment_menu {
             $section_form = &inst_section_selector($dom,$instcode);
             if ($section_form) {
                 $sections = &Apache::lonhtmlcommon::row_headline().
-                            '<h3>'.&mt('Sections for auto-enrollment').'</h3>'.
+                            '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Sections').
+                            '&nbsp;'.&mt('Sections for auto-enrollment').'</h3>'.
                             &Apache::lonhtmlcommon::row_closure(1).
                             $section_form;
             }
@@ -1457,26 +1617,29 @@ sub print_enrollment_menu {
                               &Apache::lonhtmlcommon::row_closure(1).
                               $crosslist_form;
             }
+            $hasauto = 1;
             $autoenroll = 
-                &Apache::lonhtmlcommon::row_title(&mt('Add registered students automatically')).
+                &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic('Course_Request_Autoadd').'&nbsp;'.&mt('Add registered students automatically')).
                 '<span class="LC_nobreak"><label>'.
                 '<input type="radio" name="autoadds" value="1">'.
                 &mt('Yes').'</label>'.('&nbsp;'x3).'<label>'.
                 '<input type="radio" name="autoadds" value="0" checked="checked">'.
                 &mt('No').'</label></span>'.
                 &Apache::lonhtmlcommon::row_closure(1).
-                &Apache::lonhtmlcommon::row_title(&mt('Drop unregistered students automatically')).
+                &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic('Course_Request_Autodrop').'&nbsp;'.&mt('Drop unregistered students automatically')).
                 '<span class="LC_nobreak"><label>'.
                 '<input type="radio" name="autodrops" value="1">'.
                 &mt('Yes').'</label>'.('&nbsp;'x3).'<label>'.
                 '<input type="radio" name="autodrops" value="0" checked="checked">'.
                 &mt('No').'</label></span>'. 
                 &Apache::lonhtmlcommon::row_closure(1).
-                &date_setting_table($starttime,$endtime,$formname,'enroll',%enrolltitles);
+                &date_setting_table($starttime,$endtime,$formname,'enroll',
+                                    $hasauto,%enrolltitles);
         }
     }
     my $access_dates = 
-        &date_setting_table($starttime,$endtime,$formname,'access',%accesstitles);
+        &date_setting_table($starttime,$endtime,$formname,'access',$hasauto,
+                            %accesstitles);
     $output .= &Apache::lonhtmlcommon::start_pick_box();
     if ($sections) {
         $output .=  $sections;
@@ -1530,7 +1693,8 @@ sub inst_section_selector {
                     '<th>'.&mt('Include?').'<input type="hidden" name="sectotal" '.
                     'value="'.$sectotal.'"  /></th>'.
                     '<th>'.&mt('Institutional Section').'</th>'.
-                    '<th>'.&mt('LON-CAPA section').'</th>'.
+                    '<th>'.&Apache::loncommon::help_open_topic('Course_Request_LCSection').
+                          '&nbsp;'.&mt('LON-CAPA section').'</th>'.
                     &Apache::loncommon::end_data_table_row();
         for (my $i=0; $i<@sections; $i++) {
             my $colflag = $i%2;
@@ -1559,7 +1723,7 @@ sub inst_section_selector {
 }
 
 sub date_setting_table {
-    my ($starttime,$endtime,$formname,$prefix,%datetitles) = @_;
+    my ($starttime,$endtime,$formname,$prefix,$hasauto,%datetitles) = @_;
     my ($perpetual,$table);
     my $startform = &Apache::lonhtmlcommon::date_setter($formname,$prefix.'start',
                                                         $starttime,'','','',1,'','','',1);
@@ -1572,11 +1736,27 @@ sub date_setting_table {
                      &mt('No end date').'</label></span>';
         $closure = '1';
     }
-    $table = &Apache::lonhtmlcommon::row_title($datetitles{'start'}).
-             $startform.
+
+    my %help_item = (
+                      access => {
+                                  start => 'Course_Request_Access_Start', 
+                                  end   => 'Course_Request_Access_End',
+                                },
+                      enroll => {
+                                  start => 'Course_Request_Enroll_Start',
+                                  end   => 'Course_Request_Enroll_End',
+                                },
+                     );
+    if ($hasauto) {
+        $help_item{'access'}{'start'} = 'Course_Request_RegAccess_Start';
+        $help_item{'access'}{'end'}   = 'Course_Request_RegAccess_End';
+    }
+
+    $table = &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($help_item{$prefix}{'start'}).
+             '&nbsp;'.$datetitles{'start'}).$startform.
              &Apache::lonhtmlcommon::row_closure(1).
-             &Apache::lonhtmlcommon::row_title($datetitles{'end'}).
-             $endform.$perpetual.
+             &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($help_item{$prefix}{'end'}).
+             '&nbsp;'.$datetitles{'end'}).$endform.$perpetual.
              &Apache::lonhtmlcommon::row_closure($closure);
     return $table;
 }
@@ -1645,7 +1825,7 @@ sub print_personnel_menu {
         );
         $lt{'unofficial'} = $lt{'official'};
         $output .= &Apache::lonhtmlcommon::row_headline().
-                  '<h3>'.$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 @linkargs = map { 'person_'.$i.'_'.$_ } (@items);
@@ -1687,8 +1867,9 @@ sub print_personnel_menu {
             '<td align="center" valign="top">'.&mt('First Name').'<br />'.$form_elems{'firstname'}.'</td>'."\n".
             '<td align="center" valign="top">'.&mt('Last Name').'<br />'.$form_elems{'lastname'}.'</td>'."\n".
             '<td align="center" valign="top">'.&mt('E-mail').'<br />'.$form_elems{'emailaddr'}.'</td></tr>'."\n".
-            '<tr><td align="center" valign="top">'.&mt('Role').'<br />'.$roleselector.'</td>'."\n".
-            '<td'.$seccolspan.' align="center" valign="top">'.&mt('Section(s)').'<br />'.$sectionselector.'</td>'."\n".
+            '<tr><td align="center" valign="top">'.&Apache::loncommon::help_open_topic('Course_Roles').'&nbsp;'.&mt('Role').'<br />'.$roleselector.'</td>'."\n".
+            '<td'.$seccolspan.' align="center" valign="top">'.
+            &Apache::loncommon::help_open_topic('Course_Request_Rolesection').'&nbsp;'.&mt('LON-CAPA Section(s)').'<br />'.$sectionselector.'</td>'."\n".
             '</tr></table>'.&Apache::lonhtmlcommon::row_closure();
     }
     $output .= &Apache::lonhtmlcommon::row_title(&mt('Add another?')).
@@ -1696,7 +1877,8 @@ sub print_personnel_menu {
                '<input name="addperson" type="checkbox" value="'.$persontotal.'"'.
                ' onclick="javascript:nextPage(document.'.$formname.",'".$env{'form.state'}.
                "'".');" />'.&mt('Add?').&Apache::lonhtmlcommon::row_closure(1).
-               &Apache::lonhtmlcommon::end_pick_box().'</div>';
+               &Apache::lonhtmlcommon::end_pick_box().'</div>'.
+               '<p>'.&mt('You may also add users later, once the course has been created, by using the "Manage course users" link, accessible from the "Main Menu".').'</p>';
     return $output;
 }
 
@@ -1721,14 +1903,8 @@ sub print_request_status {
     my ($dom) = @_;
     my %statusinfo = &Apache::lonnet::dump('courserequests',$env{'user.domain'},
                                            $env{'user.name'},'^status:'.$dom);
-    my ($output,$formname,%queue_by_date,%typenames);
-    if ($env{'form.crstype'} eq 'any') {
-        %typenames = &Apache::lonlocal::texthash (
-                                                   official   => 'Official course',
-                                                   unofficial => 'Unofficial course',
-                                                   community  => 'Community',
-                                                 );
-    }
+    my ($output,$formname,%queue_by_date);
+    my ($types,$typenames) = &Apache::loncommon::course_types();
     foreach my $key (keys(%statusinfo)) {
         if (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending')) { 
             (undef,my($cdom,$cnum)) = split(':',$key);
@@ -1799,7 +1975,10 @@ sub print_request_status {
      '<td>'.&unescape($desc).'</td>'.
      '<td>'.$cdom.'</td>';
                     if ($env{'form.crstype'} eq 'any') {
-                        my $typename = $typenames{$type};
+                        my $typename;
+                        if (ref($typenames) eq 'HASH') {
+                            $typename = &mt($typenames->{$type});
+                        }
                         if ($typename eq '') {
                             $typename = &mt('Unknown type');
                         }
@@ -1847,7 +2026,7 @@ sub print_cancel_request {
             }
             $output = &mt('No further action will be taken');
         } elsif (ref($history{'details'}) eq 'HASH') {
-            my ($types,$typename) = &course_types();
+            my ($types,$typename) = &Apache::loncommon::course_types();
             my $showtype = $crstype;
             if (defined($typename->{$crstype})) {
                 $showtype = $typename->{$crstype}; 
@@ -1933,7 +2112,7 @@ sub print_request_logs {
 sub print_review {
     my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom,
         $disallowed,$disallowmsg) = @_;
-    my ($types,$typename) = &course_types();
+    my ($types,$typename) = &Apache::loncommon::course_types();
     my ($owner,$ownername,$owneremail);
     if ($uname eq '' || $udom eq '') {
         $uname = $env{'user.name'};
@@ -1952,7 +2131,7 @@ sub print_review {
     $crstypename = $env{'form.crstype'};
     if (ref($typename) eq 'HASH') {
         unless ($typename->{$env{'form.crstype'}} eq '') {
-            $crstypename = $typename->{$env{'form.crstype'}};
+            $crstypename = &mt($typename->{$env{'form.crstype'}});
         }
     }
     my $category = 'Course';
@@ -2214,7 +2393,7 @@ sub dates_from_form {
 }
 
 sub courseinfo_form {
-    my ($dom,$formname,$crstype,$next) = @_;
+    my ($dom,$formname,$crstype,$next,$description) = @_;
     my %lt = &Apache::lonlocal::texthash(
                 official => 'You must provide a (brief) course description.',
                 community => 'You must provide a (brief) community description.'
@@ -2241,10 +2420,10 @@ ENDJS
     }
     my $output .= $js_validate."\n".'<div>'.&Apache::lonhtmlcommon::start_pick_box().
                   &Apache::lonhtmlcommon::row_headline().
-                  '<h3>'.$title.'</h3>'.
+                  '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Description').'&nbsp;'.$title.'</h3>'.
                   &Apache::lonhtmlcommon::row_closure(1).
                   &Apache::lonhtmlcommon::row_title(&mt('Description')).
-                 '<input type="text" size="40" name="cdescr" />';
+                 '<input type="text" size="60" name="cdescr" value="'.$description.'" />';
     my ($home_server_pick,$numlib) =
         &Apache::loncommon::home_server_form_item($dom,'chome',
                                                   'default','hide');
@@ -2255,7 +2434,7 @@ ENDJS
     $output .= $home_server_pick.
                &Apache::lonhtmlcommon::row_closure().
                &Apache::lonhtmlcommon::row_headline().
-               '<h3>'.&mt('Clone content and settings from an existing course?').'</h3>'. 
+               '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Clone').'&nbsp;'.&mt('Clone content and settings from an existing course?').'</h3>'. 
                &Apache::lonhtmlcommon::row_closure(1).
                &clone_form($dom,$formname,$crstype).
                &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n";
@@ -2268,14 +2447,14 @@ sub clone_form {
     if ($crstype eq 'community') {
         $type = 'Community';
     }
-    my $cloneform = &Apache::loncommon::select_dom_form($dom,'clonedom').
+    my $cloneform = &Apache::loncommon::select_dom_form($dom,'clonedom').'&nbsp;'.
                     &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type);
     my %lt = &clone_text();
     my $output .= 
         &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'.
         '<input type="text" size="25" name="clonecrs" value=""  />'.
-        '</label>'.&Apache::lonhtmlcommon::row_closure(1).'<label>'.
-        &Apache::lonhtmlcommon::row_title($lt{'dmn'}).'</label>'.
+        '</label>'.&Apache::lonhtmlcommon::row_closure(1).
+        &Apache::lonhtmlcommon::row_title($lt{'dmn'}).'<label>'.
         $cloneform.'</label>'.&Apache::lonhtmlcommon::row_closure(1).
         &Apache::lonhtmlcommon::row_title($lt{'dsh'}).'<label>'.
         '<input type="radio" name="datemode" value="delete" /> '.$lt{'ncd'}.
@@ -2307,6 +2486,10 @@ sub coursecode_form {
                     instcode  => 'Course Category',
                     crosslist => 'Cross Listed Course',
                    );
+    my %helpitem = ( 
+                     instcode => 'Course_Request_Category',
+                     crosslist => 'Course_Request_Crosslist',
+                   );
     if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH') && 
         (ref($cat_order))) {
         my ($sel,$instsec,$lcsec);
@@ -2322,7 +2505,7 @@ sub coursecode_form {
             my $lastitem = pop(@{$codetitles});
             my $lastinput = '<input type="text" size="5" name="'.$sel.'_'.                                            $lastitem.'" />';
             if (@{$codetitles} > 0) {
-                $output = &Apache::lonhtmlcommon::row_title($rowtitle{$context}).
+                $output = &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($helpitem{$context}).'&nbsp;'.$rowtitle{$context}).
                           '<table><tr>';
                 if ($context eq 'crosslist') {
                     $output .= '<td>'.&mt('Include?').'<br />'.
@@ -2395,7 +2578,7 @@ sub get_course_dom {
         }
     }
     if (($env{'user.domain'} ne '') && ($env{'user.domain'} ne 'public')) {
-        my ($types,$typename) = &course_types();
+        my ($types,$typename) = &Apache::loncommon::course_types();
         if (ref($types) eq 'ARRAY') {
             foreach my $type (@{$types}) {
                 if (&Apache::lonnet::usertools_access($env{'user.name'},
@@ -2826,85 +3009,90 @@ sub update_requestors_roles {
     my $owner = $env{'user.name'}.':'.$env{'user.domain'};
     if (ref($details) eq 'HASH') {
         if (ref($details->{'personnel'}) eq 'HASH') {
-            if (ref($details->{'personnel'}{$owner}) eq 'HASH') {
-                my @roles;
-                if (ref($details->{'personnel'}{$owner}{'roles'}) eq 'ARRAY') {
-                    @roles = sort(@{$details->{'personnel'}{$owner}{'roles'}});
-                    unless (grep(/^cc$/,@roles)) {
-                        push(@roles,'cc');
-                    }
-                } else {
-                    @roles = ('cc');
+            unless (ref($details->{'personnel'}{$owner}) eq 'HASH') {
+                $details->{'personnel'}{$owner} = {
+                                                    'roles' => ['cc'],
+                                                    'cc'    => { 'usec' => [] },
+                                                  };
+            }
+            my @roles;
+            if (ref($details->{'personnel'}{$owner}{'roles'}) eq 'ARRAY') {
+                @roles = sort(@{$details->{'personnel'}{$owner}{'roles'}});
+                unless (grep(/^cc$/,@roles)) {
+                    push(@roles,'cc');
                 }
-                foreach my $role (@roles) {
-                    my $start = $now;
-                    my $end = '0';
-                    if ($role eq 'st') {
-                        if ($details->{'accessstart'} ne '') {
-                            $start = $details->{'accessstart'};
-                        }
-                        if ($details->{'accessend'} ne '') {
-                            $end = $details->{'accessend'};
-                        }
-                    }
-                    my @usecs;
-                    if ($role ne 'cc') {
-                        if (ref($details->{'personnel'}{$owner}{$role}{'usec'}) eq 'ARRAY') {
-                            @usecs = @{$details->{'personnel'}{$owner}{$role}{'usec'}};
-                        }
-                    } 
-                    if ($role eq 'st') {
-                        if (@usecs > 1) {
-                            my $firstsec = $usecs[0];
-                            @usecs = ($firstsec);
-                        }
-                    }
-                    if (@usecs == 0) {
-                        push(@usecs,'');
-                    }
-                    foreach my $usec (@usecs) {
-                        my (%userroles,%newrole,%newgroups,$spec,$area);
-                        my $area = '/'.$dom.'/'.$cnum;
-                        my $spec = $role.'.'.$area;
-                        if ($usec ne '') {
-                           $spec .= '/'.$usec;
-                           $area .= '/'.$usec;
-                        }
+            } else {
+                @roles = ('cc');
+            }
+            foreach my $role (@roles) {
+                my $start = $now;
+                my $end = '0';
+                if ($role eq 'st') {
+                    if ($details->{'accessstart'} ne '') {
+                        $start = $details->{'accessstart'};
+                    }
+                    if ($details->{'accessend'} ne '') {
+                        $end = $details->{'accessend'};
+                    }
+                }
+                my @usecs;
+                if ($role ne 'cc') {
+                    if (ref($details->{'personnel'}{$owner}{$role}{'usec'}) eq 'ARRAY') {
+                        @usecs = @{$details->{'personnel'}{$owner}{$role}{'usec'}};
+                    }
+                } 
+                if ($role eq 'st') {
+                    if (@usecs > 1) {
+                        my $firstsec = $usecs[0];
+                        @usecs = ($firstsec);
+                    }
+                }
+                if (@usecs == 0) {
+                    push(@usecs,'');
+                }
+                foreach my $usec (@usecs) {
+                    my (%userroles,%newrole,%newgroups,$spec,$area);
+                    my $area = '/'.$dom.'/'.$cnum;
+                    my $spec = $role.'.'.$area;
+                    if ($usec ne '') {
+                       $spec .= '/'.$usec;
+                       $area .= '/'.$usec;
+                    }
+                    if ($role =~ /^cr\//) {
+                        &Apache::lonnet::custom_roleprivs(\%newrole,$role,$dom,
+                                                          $cnum,$spec,$area);
+                    } else {
+                        &Apache::lonnet::standard_roleprivs(\%newrole,$role,$dom,
+                                                            $spec,$cnum,$area);
+                    }
+                    &Apache::lonnet::set_userprivs(\%userroles,\%newrole,
+                                                   \%newgroups);
+                    $userroles{'user.role.'.$spec} = $start.'.'.$end;
+                    &Apache::lonnet::appenv(\%userroles,[$role,'cm']);
+                    if (($end == 0) || ($end > $now)) {
+                        my $showrole = $role;
                         if ($role =~ /^cr\//) {
-                            &Apache::lonnet::custom_roleprivs(\%newrole,$role,$dom,
-                                                              $cnum,$spec,$area);
-                        } else {
-                            &Apache::lonnet::standard_roleprivs(\%newrole,$role,$dom,
-                                                                $spec,$cnum,$area);
+                            $showrole = &Apache::lonnet::plaintext($role,$crstype);
+                        } elsif (ref($longroles) eq 'HASH') {
+                            if ($longroles->{$role} ne '') {
+                                $showrole = $longroles->{$role};
+                            }
                         }
-                        &Apache::lonnet::set_userprivs(\%userroles,\%newrole,
-                                                       \%newgroups);
-                        $userroles{'user.role.'.$spec} = $start.'.'.$end;
-                        &Apache::lonnet::appenv(\%userroles,[$role,'cm']);
-                        if (($end == 0) || ($end > $now)) {
-                            my $showrole = $role;
-                            if ($role =~ /^cr\//) {
-                                $showrole = &Apache::lonnet::plaintext($role,$crstype);
-                            } elsif (ref($longroles) eq 'HASH') {
-                                if ($longroles->{$role} ne '') {
-                                    $showrole = $longroles->{$role};
-                                }
+                        if ($start <= $now) {
+                            $active .= '<li><a href="/adm/roles?selectrole=1&'.
+                                       $spec.'=1">'.$showrole;
+                            if ($usec ne '') {
+                                $active .= ' - '.&mt('section:').' '.$usec; 
                             }
-                            if ($start <= $now) {
-                                $active .= '<li><a href="/adm/roles?selectrole=1&'.                                             $spec.'=1">'.$showrole;
-                                if ($usec ne '') {
-                                    $active .= ' - '.&mt('section:').' '.$usec; 
-                                }
-                                $active .= '</a></li>';
-                                $numactive ++;
-                            } else { 
-                                $future .= '<li>'.$showrole;
-                                if ($usec ne '') {
-                                    $future .= ' - '.&mt('section:').' '.$usec;
-                                }
-                                $future .= '</li>';
-                                $numfuture ++;
+                            $active .= '</a></li>';
+                            $numactive ++;
+                        } else { 
+                            $future .= '<li>'.$showrole;
+                            if ($usec ne '') {
+                                $future .= ' - '.&mt('section:').' '.$usec;
                             }
+                            $future .= '</li>';
+                            $numfuture ++;
                         }
                     }
                 }
@@ -3055,7 +3243,7 @@ sub check_autolimit {
     my ($uname,$udom,$dom,$crstype,$limit,$message) = @_;
     my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},
                                         'userroles',['active','future'],['cc'],[$dom]);
-    my ($types,$typename) = &course_types();
+    my ($types,$typename) = &Apache::loncommon::course_types();
     my %requests = &Apache::lonnet::dumpstore('courserequests',$udom,$uname);
     my %count;
     if (ref($types) eq 'ARRAY') {