--- loncom/interface/lonrequestcourse.pm	2009/10/25 14:48:55	1.38
+++ loncom/interface/lonrequestcourse.pm	2010/01/14 20:08:13	1.43
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Request a course
 #
-# $Id: lonrequestcourse.pm,v 1.38 2009/10/25 14:48:55 raeburn Exp $
+# $Id: lonrequestcourse.pm,v 1.43 2010/01/14 20:08:13 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -94,8 +94,6 @@ described at http://www.lon-capa.org.
 
 =item print_request_outcome()
 
-=item get_processtype()
-
 =item check_autolimit()
 
 =item retrieve_settings()
@@ -157,7 +155,7 @@ sub handler {
 
     my @invalidcrosslist;
     my %trail = (
-                 crstype       => 'Course Request Action',
+                 crstype       => 'Request Action',
                  codepick      => 'Category',
                  courseinfo    => 'Description',
                  enrollment    => 'Access Dates',
@@ -192,16 +190,30 @@ sub handler {
                     if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {
                         $result = &retrieve_settings($dom,$cnum,$udom,$uname);
                     } else {
-                        $warning = &mt('Invalid username or domain for course requestor');
+                        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 {
-                    $warning = &mt('No information was found for this course request.');
+                    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 {
-            $warning = &mt('You do not have rights to view course request information.');
+            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))) {
         if (($action eq 'view') && ($state eq 'details')) {
@@ -272,13 +284,14 @@ sub handler {
 
     my $loaditems = &onload_action($action,$state);
 
-    my %can_request;
-    my $canreq = &Apache::lonnet::check_can_request($dom,\%can_request);
+    my (%can_request,%request_domains);
+    my $canreq = 
+        &Apache::lonnet::check_can_request($dom,\%can_request,\%request_domains);
     if ($action eq 'new') {
         if ($canreq) {
             if ($state eq 'crstype') {
                 &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,
-                                 $crumb);
+                                 $crumb,\%request_domains);
             } else {
                 &request_administration($r,$action,$state,$page,\%states,$dom,
                                         $jscript,$loaditems,$crumb,$newinstcode,
@@ -286,14 +299,14 @@ sub handler {
                                         \@invalidcrosslist);
             }
         } else {
-            $r->print(&header('Course Requests').$crumb.
+            $r->print(&header('Course/Community Requests').$crumb.
                       '<div class="LC_warning">'.
-                      &mt('You do not have privileges to request creation of courses.').
+                      &mt('You do not have privileges to request creation of courses or communities.').
                       '</div>'.&Apache::loncommon::end_page());
         }
     } elsif ($action eq 'view') {
         if ($state eq 'crstype') {
-            &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,$crumb);
+            &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,$crumb,\%request_domains);
         } else {
             &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                     $loaditems,$crumb);
@@ -301,8 +314,8 @@ sub handler {
     } elsif ($action eq 'display') {
         if ($warning ne '') {
             my $args = { only_body => 1 };
-            $r->print(&header('Course Requests','','',$args).$crumb.
-                      '<h3>'.&mt('Course Request Details').'</h3>'.
+            $r->print(&header('Course/Community Requests','','',$args).$crumb.
+                      '<h3>'.&mt('Course/Community Request Details').'</h3>'.
                       '<div class="LC_warning">'.$warning.'</div>'.
                       &close_popup_form());
         } else {
@@ -312,7 +325,7 @@ sub handler {
     } elsif ($action eq 'log') {
         &print_request_logs($jscript,$loaditems,$crumb);
     } else {
-        &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb);
+        &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains);
     }
     return OK;
 }
@@ -386,7 +399,7 @@ sub get_breadcrumbs {
                 if ($$state eq $states->{$action}[$i]) {
                     &Apache::lonhtmlcommon::add_breadcrumb(
                        {text=>"$trail->{$$state}"});
-                    $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');
+                    $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');
                     last;
                 } else {
                     if (($$state eq 'process') || ($$state eq 'removal')) {
@@ -406,12 +419,12 @@ sub get_breadcrumbs {
         } else {
             &Apache::lonhtmlcommon::add_breadcrumb(
                     {text=>'Pick Action'});
-            $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');
+            $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');
         }
     } else {
         &Apache::lonhtmlcommon::add_breadcrumb(
                 {text=>'Pick Action'});
-        $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');
+        $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');
     }
     return ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description);
 }
@@ -591,11 +604,11 @@ sub onload_action {
 }
 
 sub print_main_menu {
-    my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb) = @_;
+    my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb,$request_domains) = @_;
     my ($types,$typename) = &Apache::loncommon::course_types();
     my $onchange;
     unless ($env{'form.interface'} eq 'textual') {
-        $onchange = 1;
+        $onchange = 'this.form.submit()';
     }
 
     my $nextstate_setter = "\n";
@@ -635,11 +648,12 @@ function check_can_request(crschoice,act
     var unofficial = '';
     var community = '';    
 END
-
-    foreach my $item (keys(%{$can_request})) {
-            $js .= " 
+    if (ref($can_request) eq 'HASH') {
+        foreach my $item (keys(%{$can_request})) {
+                $js .= " 
         $item = 1;
 ";
+        }
     }
     my %lt = &Apache::lonlocal::texthash(
         official => 'You are not permitted to request creation of an official course in this domain.',
@@ -675,22 +689,59 @@ END
     }
     return true;
 }
-
 END
-
-    $r->print(&header('Course Requests',$js.$jscript,$loaditems).$crumb.
-             '<p>'.&mt('Request creation of a new course, or review your pending course requests.').'</p>'.
+    my ($pagetitle,$pageinfo,$domaintitle);
+    if (ref($can_request) eq 'HASH') {
+        if (($can_request->{'official'}) || ($can_request->{'unofficial'})) {
+            if ($can_request->{'community'}) {
+                $pagetitle = 'Course/Community Requests';
+                $pageinfo = &mt('Request creation of a new course or community, or review your pending requests.');
+                $domaintitle = &mt('Course/Community Domain');
+            } else {
+                $pagetitle = 'Course Requests';
+                $pageinfo = &mt('Request creation of a new course, or review your pending course requests.');
+                $domaintitle = &mt('Course Domain');
+            }
+        } elsif ($can_request->{'community'}) {
+            $pagetitle = 'Community Requests';
+            $pageinfo = &mt('Request creation of a new course, or review your pending requests.');
+            $domaintitle = &mt('Community Domain');
+        } else {
+            $pagetitle = 'Course/Community Requests';
+            $pageinfo = &mt('You do not have rights to request creation of courses in this domain; please choose a different domain.');
+            $domaintitle = &mt('Course/Community Domain');
+        }
+    }
+    my @incdoms;
+    if (ref($request_domains) eq 'HASH') {
+        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.
+             '<p>'.$pageinfo.'</p>'.
              '<div>'.
               &Apache::lonhtmlcommon::start_pick_box().
-              &Apache::lonhtmlcommon::row_title(&mt('Course Domain')).
+              &Apache::lonhtmlcommon::row_title($domaintitle).
               '<form name="domforcourse" method="post" action="/adm/requestcourse">'.
-              &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange));
+              &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,\@incdoms));
     if (!$onchange) {
         $r->print('&nbsp;<input type="submit" name="godom" value="'.
                    &mt('Change').'" />');
     }
+    unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) {
+        $r->print(&Apache::lonhtmlcommon::row_closure(1)."\n".
+                  &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".
+                  &Apache::loncommon::end_page());
+        return;
+    }
     $r->print('</form>'.&Apache::lonhtmlcommon::row_closure());
-
     my $formname = 'requestcrs';
     my $nexttext = &mt('Next');
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Action')).'
@@ -701,18 +752,29 @@ END
  <option value="log">'.&mt('View request history').'</option>
 </select></form>'.
               &Apache::lonhtmlcommon::row_closure(1).
-              &Apache::lonhtmlcommon::row_title(&mt('Course Type')).'
+              &Apache::lonhtmlcommon::row_title(&mt('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"';
+<select size="1" name="crstype">');
+    if (ref($can_request) eq 'HASH') {
+        if (keys(%{$can_request}) > 1) {
+            $r->print(' <option value="any">'.&mt('All types').'</option>');
+        }
+        if ((ref($types) eq 'ARRAY') && (ref($typename) eq 'HASH')) {
+            foreach my $type (@{$types}) {
+                next unless($can_request->{$type});
+                my $selected = '';
+                if ($env{'form.crstype'} eq '') {
+                    if ($type eq 'official') {
+                        $selected = ' selected="selected"';
+                    }
+                } else {
+                    if ($type eq $env{'form.crstype'}) {
+                        $selected = ' selected="selected"';
+                    }
+                }
+                $r->print('<option value="'.$type.'"'.$selected.'>'.&mt($typename->{$type}).
+                          '</option>'."\n");
             }
-            $r->print('<option value="'.$type.'"'.$selected.'>'.&mt($typename->{$type}).
-                      '</option>'."\n");
         }
     }
     $r->print('</select></form>'."\n".
@@ -767,7 +829,13 @@ END
         } elsif ($state eq 'personnel') {
             $js .= "\n".&section_check_javascript()."\n".&personnel_lcsec_js();
         }
-        $r->print(&header('Request a course',$js.$jscript,$loaditems,$jsextra).$crumb);
+        my $title;
+        if ($env{'form.crstype'} eq 'community') {
+            $title = 'Request a community';
+        } else {
+            $title = 'Request a course';
+        }
+        $r->print(&header($title,$js.$jscript,$loaditems,$jsextra).$crumb);
         &print_request_form($r,$action,$state,$page,$states,$dom,$newinstcode,
                             $codechk,$checkedcode,$description,$invalidcrosslist);
     } elsif ($action eq 'view') {
@@ -784,11 +852,26 @@ END
         } elsif ($state eq 'cancel') {
             $jsextra = &viewcancel_javascript($formname);
         }
-        $r->print(&header('Manage course requests',$js.$jscript.$jsextra,$loaditems).
-                  $crumb);
+        my $title;
+        if ($env{'form.crstype'} eq 'community') {
+            $title = 'Manage community requests';
+        } else {
+            $title = 'Manage course requests';
+        }
+        $r->print(&header($title,$js.$jscript.$jsextra,$loaditems).$crumb);
         my $form = '<form method="post" name="'.$formname.'" action="/adm/requestcourse" />';
         if ($state eq 'pick_request') {
-            $r->print('<h3>'.&mt('Pending course requests').'</h3><div>'."\n".$form."\n".
+            my $title;
+            if ($env{'form.crstype'} eq 'community') {
+                $title = &mt('Pending community requests');
+            } elsif ($env{'form.crstype'} eq 'official') {
+                $title = &mt('Pending requests for official courses');
+            } elsif ($env{'form.crstype'} eq 'unofficial') {
+                $title = &mt('Pending requests for unofficial courses');
+            } else {
+                $title = &mt('Pending course/community requests'); 
+            }
+            $r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n".
                       &print_request_status($dom).'</form></div>');
         } elsif ($state eq 'details') {
             my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk);
@@ -800,7 +883,13 @@ END
                 &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                          \%cat_order,\@code_order);
             }
-            $r->print('<h3>'.&mt('Course Request Details').'</h3><div>'."\n".$form."\n".
+            my $title;
+            if ($env{'form.crstype'} eq 'community') {
+                $title = &mt('Community Request Details');
+            } else {
+                $title = &mt('Course Request Details');
+            }
+            $r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n".
                       &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,
                                     \@code_order)."\n".
                       '<input name="origcnum" value="'.$origcnum.'" type="hidden" />'."\n");
@@ -817,8 +906,14 @@ END
                                 $navtxt{'next'},$state,$other,$navtxt{'other'});
             $r->print('</form>');
         } elsif ($state eq 'cancel') {
+            my $title;
+            if ($env{'form.crstype'} eq 'community') {
+                $title = &mt('Cancel community request');
+            } else {
+                $title = &mt('Cancel course request');
+            }
             my ($result,$output) = &print_cancel_request($dom,$env{'form.origcnum'});
-            $r->print('<h3>'.&mt('Cancel course request').'</h3><div>'."\n".$form."\n".
+            $r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n".
                       $output);
             my @excluded = &get_excluded_elements($dom,$states,'view','cancel');
             $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</div>');
@@ -867,7 +962,11 @@ END
                       '<input type="hidden" name="showdom" value="'.$dom.'" />'."\n".
                       '<input type="hidden" name="orignum" value="'.$cnum.'" />'."\n");
             if ($result eq 'ok') {
-                $r->print(&mt('Your course request has been cancelled.'));
+                if ($env{'form.crstype'} eq 'community') {
+                    $r->print(&mt('Your community request has been cancelled.'));
+                } else {
+                    $r->print(&mt('Your course request has been cancelled.'));
+                }
             } else {
                 $r->print('<div class="LC_error">'.
                           &mt('The request cancellation process was not complete.').
@@ -882,8 +981,16 @@ END
             &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                      \%cat_order,\@code_order);
         }
-        $r->print(&header('Course Request','','','',{ 'only_body' => 1}).
-                  $crumb."\n".'<h3>'.&mt('Course Request Details').'</h3>'.
+        my ($title,$header);
+        if ($env{'form.crstype'} eq 'community') {
+            $title = 'Community Request';
+            $header = &mt('Community Request');
+        } else {
+            $title = 'Course Request';
+            $header = &mt('Course Request');
+        }
+        $r->print(&header($title,'','','',{ 'only_body' => 1}).
+                  $crumb."\n".'<h3>'.$header.'</h3>'.
                   &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,
                                 \@code_order,$uname,$udom)."\n".'</div>'.
                   &close_popup_form());
@@ -1239,10 +1346,18 @@ sub print_request_form {
         }
         &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                  \%cat_order,\@code_order);
-        $r->print('<h3>'.&mt('Review course request details before submission').'</h3>'.
-                  &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order,'','',\@disallowed,\%disallowmsg).
+        if ($crstype eq 'community') {
+            $r->print('<h3>'.&mt('Review community request details before submission').'</h3>');
+        } else {
+            $r->print('<h3>'.&mt('Review course request details before submission').'</h3>');
+        }
+        $r->print(&print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order,'','',\@disallowed,\%disallowmsg).
                   '<input type="hidden" name="cnum" value="'.$cnum.'" />');
-        $navtxt{'next'} = &mt('Submit course request');
+        if ($crstype eq 'community') {
+            $navtxt{'next'} = &mt('Submit community request');
+        } else {
+            $navtxt{'next'} = &mt('Submit course request');
+        }
     }  elsif ($state eq 'process') {
         if ($crstype eq 'official') {
             &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
@@ -1407,7 +1522,7 @@ sub print_enrollment_menu {
             }
             if ($crosslist_form) { 
                 $crosslist_form .= 
-                    &Apache::lonhtmlcommon::row_title(&mt('Add another?')).
+                    &Apache::lonhtmlcommon::row_title(&mt('Add another')).
                     '<input name="crosslisttotal" type="hidden" value="'.$crosslisttotal.'" />'.
                     '<input name="addcrosslist" type="checkbox" value="'.$crosslisttotal.'"'.
                     ' onclick="javascript:nextPage(document.'.$formname.",'".$env{'form.state'}.
@@ -1579,12 +1694,12 @@ sub print_personnel_menu {
     }
     my @items = ('uname','dom','lastname','firstname','emailaddr','hidedom');
 
-    my $roleoptions;
-    my @roles = &Apache::lonuserutils::roles_by_context('course');
     my $type = 'Course';
     if ($crstype eq 'community') {
         $type = 'Community';
     }
+    my $roleoptions;
+    my @roles = &Apache::lonuserutils::roles_by_context('course','',$type);
     foreach my $role (@roles) {
         my $plrole = &Apache::lonnet::plaintext($role,$type);
         $roleoptions .= '  <option value="'.$role.'">'.$plrole.'</option>'."\n";
@@ -1672,13 +1787,17 @@ sub print_personnel_menu {
             &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?')).
+    $output .= &Apache::lonhtmlcommon::row_title(&mt('Add another')).
                '<input name="persontotal" type="hidden" value="'.$persontotal.'" />'.
                '<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>'.
-               '<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>';
+               &Apache::lonhtmlcommon::end_pick_box().'</div>';
+    if ($crstype eq 'community') {
+        $output .= '<p>'.&mt('You may also add users later, once the community has been created, by using the "Manage community users" link, accessible from the "Main Menu".').'</p>';
+    } else {
+        $output .= '<p>'.&mt('You may also add users later, once the course has been created, by using the "Manage course users" link, accessible from the "Main Menu".').'</p>';
+    }
     return $output;
 }
 
@@ -1750,10 +1869,18 @@ sub print_request_status {
               '<input type="hidden" name="showdom" value="" />'."\n".
               '<input type="hidden" name="cnum" value="" />'."\n";
     if (@sortedtimes > 0) {
+        my $desctitle;
+        if ($env{'form.crstype'} eq 'any') {
+            $desctitle = &mt('Course/Community Description')
+        } elsif ($env{'form.crstype'} eq 'community') {
+            $desctitle = &mt('Community Description')
+        } else {
+            $desctitle = &mt('Course Description');
+        }
         $output .= &Apache::loncommon::start_data_table().
                    &Apache::loncommon::start_data_table_header_row().
                    '<th>'.&mt('Action').'</th>'.
-                   '<th>'.&mt('Course Description').'</th>'.
+                   '<th>'.$desctitle.'</th>'.
                    '<th>'.&mt('Domain').'</th>';
         if ($env{'form.crstype'} eq 'any') {
             $output .= '<th>'.&mt('Type').'</th>';
@@ -1801,7 +1928,13 @@ sub print_request_status {
         }
         $output .= &Apache::loncommon::end_data_table();
     } else {
-        $output .= '<div>'.&mt('You have no matching course requests awaiting approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'</div>';
+        if ($env{'form.crstype'} eq 'any') {
+$output .= '<div>'.&mt('You have no matching course or community requests awaiting approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'</div>';
+        } elsif ($env{'form.crstype'} eq 'community') {
+            $output .= '<div>'.&mt('You have no matching community requests awaiting approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'</div>';
+        } else {
+            $output .= '<div>'.&mt('You have no matching course requests awaiting approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'</div>';
+        }
     }
     $output .= '
 <br /><input type="button" name="prev" value="'.&mt('Back').'" onclick="javascript:backPage(document.'.$formname.",'crstype'".')" />';
@@ -1842,8 +1975,12 @@ sub print_cancel_request {
                       '<td>'.$showtype.'</td>'.
                       &Apache::loncommon::end_data_table_row().
                       &Apache::loncommon::end_data_table().
-                      '<br /><div class="LC_warning">'.
-                      &mt('Cancelling the request will remove it from the queue of pending course requests').'</div>';
+                      '<br /><div class="LC_warning">';
+            if ($crstype eq 'community') {
+                $output .= &mt('Cancelling the request will remove it from the queue of pending community requests').'</div>';
+            } else {
+                $output .= &mt('Cancelling the request will remove it from the queue of pending course requests').'</div>';
+            }
             $result = 'ok';
         } else {
             $output = '<div class="LC_error">'.&mt('No record exists for the course ID').'</div>';
@@ -2035,7 +2172,8 @@ sub print_review {
     if (($env{'form.clonecrs'} =~ /^$match_name$/) && 
         ($env{'form.clonedom'} =~ /^$match_domain$/)) {
         my $canclone = &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'},
+                           $env{'form.crstype'});
         if ($canclone) {
             my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},
                               $env{'form.clonecrs'},('description','internal.coursecode'));
@@ -2077,15 +2215,18 @@ sub print_review {
     }
 
     my $container = 'Course';
+    my $ccrole = 'cc';
     if ($env{'form.crstype'} eq 'community') {
         $container = 'Community';
+        $ccrole = 'co';
     }
 
     $personnel_headers = '<th>'.&mt('Name').'</th><th>'.&mt('Username:Domain').
                          '</th><th>'.&mt('Role').'</th><th>'.&mt('LON-CAPA Sections').
                          '</th>';
+
     $personnel_values .= '<tr><td>'.$ownername.'</td><td>'.$owner.'</td>'.
-                         '<td>'.&Apache::lonnet::plaintext('cc',$container).'</td>'.
+                         '<td>'.&Apache::lonnet::plaintext($ccrole,$container).'</td>'.
                          '<td>'.&mt('None').'</td></tr>';
     for (my $i=0; $i<$env{'form.persontotal'}; $i++) {
         if ($env{'form.person_'.$i.'_uname'} ne '') {
@@ -2121,7 +2262,7 @@ sub print_review {
             if ($showsec eq '') {
                 $showsec = &mt('None');
             }
-            if ($env{'form.person_'.$i.'_role'} eq 'cc') {
+            if ($env{'form.person_'.$i.'_role'} eq $ccrole) {
                 $showsec = &mt('None');
             }
             my $role = $env{'form.person_'.$i.'_role'}; 
@@ -2215,8 +2356,10 @@ function validateForm() {
 
 ENDJS
     my $title = &mt('Brief Course Description');
+    my $clonetitle = &mt('Clone content and settings from an existing course?');
     if ($crstype eq 'community') {
         $title = &mt('Brief Community Description');
+        $clonetitle = &mt('Clone content and settings from an existing community?');
     }
     my $output .= $js_validate."\n".'<div>'.&Apache::lonhtmlcommon::start_pick_box().
                   &Apache::lonhtmlcommon::row_headline().
@@ -2234,7 +2377,7 @@ ENDJS
     $output .= $home_server_pick.
                &Apache::lonhtmlcommon::row_closure().
                &Apache::lonhtmlcommon::row_headline().
-               '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Clone').'&nbsp;'.&mt('Clone content and settings from an existing course?').'</h3>'. 
+               '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Clone').'&nbsp;'.$clonetitle.'</h3>'. 
                &Apache::lonhtmlcommon::row_closure(1).
                &clone_form($dom,$formname,$crstype).
                &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n";
@@ -2481,6 +2624,10 @@ sub print_request_outcome {
     }
     $now = time;
     $crstype = $env{'form.crstype'};
+    my $ccrole = 'cc';
+    if ($crstype eq 'community') {
+        $ccrole = 'co';
+    }
     my @instsections;
     if ($crstype eq 'official') {
         if (&Apache::lonnet::auto_run('',$dom)) {
@@ -2542,7 +2689,7 @@ sub print_request_outcome {
                     } else {
                         @{$personnel{$uname.':'.$udom}{'roles'}} = ($role);
                     }
-                    if ($role eq 'cc') {
+                    if ($role eq $ccrole) {
                         @{$personnel{$uname.':'.$udom}{$role}{'usec'}} = ();
                     } else {
                         my @currsec = &Apache::loncommon::get_env_multiple('form.person_'.$i.'_sec');
@@ -2601,7 +2748,8 @@ sub print_request_outcome {
         if ($clonehome ne 'no_host') {  
             my $canclone =  
                 &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);
             if ($canclone) {
                 $clonecrs = $env{'form.clonecrs'};
                 $clonedom = $env{'form.clonedom'};
@@ -2634,7 +2782,9 @@ sub print_request_outcome {
                     personnel      => \%personnel,
                   };
     my (@inststatuses,$storeresult,$creationresult);
-    my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig);
+    my $val = 
+        &Apache::loncoursequeueadmin::get_processtype($env{'user.name'},$env{'user.domain'},
+            $env{'user.adv'},$dom,$crstype,\@inststatuses,\%domconfig);
     if ($val eq '') {
         if ($crstype eq 'official') {
             $output = &mt('You are not permitted to request creation of official courses.');
@@ -2692,7 +2842,11 @@ sub print_request_outcome {
         $reqstatus = $disposition;
         my ($modified,$queued);
         if ($disposition eq 'rejected') {
-            $output = &mt('Your course request was rejected.');
+            if ($crstype eq 'community') {
+                $output = &mt('Your community request was rejected.');
+            } else {
+                $output = &mt('Your course request was rejected.');
+            }
             if ($message) {
                 $output .= '<div class="LC_warning">'.$message.'</div>';
             }
@@ -2700,11 +2854,11 @@ sub print_request_outcome {
         } elsif ($disposition eq 'process') {
             my %domdefs = &Apache::lonnet::get_domain_defaults($dom);
             my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,%longroles);
-            my @roles = &Apache::lonuserutils::roles_by_context('course');
             my $type = 'Course';
             if ($crstype eq 'community') {
                 $type = 'Community';
             }
+            my @roles = &Apache::lonuserutils::roles_by_context('course','',$type);
             foreach my $role (@roles) {
                 $longroles{$role}=&Apache::lonnet::plaintext($role,$type);
             }
@@ -2716,14 +2870,22 @@ sub print_request_outcome {
                 $reqstatus = 'created';
                 my $role_result = &update_requestors_roles($dom,$cnum,$crstype,$details,
                                                            \%longroles);
-                $output = '<p>'.&mt('Your course request has been processed and the course has been created.').
-                          '<br />'.$role_result.'</p>';
+                if ($crstype eq 'community') {
+                    $output = '<p>'.&mt('Your community request has been processed and the community has been created.');
+                } else {
+                    $output = '<p>'.&mt('Your course request has been processed and the course has been created.');
+                }
+                $output .= '<br />'.$role_result.'</p>';
                 $creationresult = 'created';
             } else {
-                $output = '<span class="LC_error">'.
-                          &mt('An error occurred when processing your course request.').
-                          '<br />'.
-                          &mt('You may want to review the request details and submit the request again.').
+                $output = '<span class="LC_error">';
+                if ($crstype eq 'community') {
+                    $output .= &mt('An error occurred when processing your community request.');
+                } else {
+                    $output .= &mt('An error occurred when processing your course request.');
+                }
+                $output .= '<br />'.
+                           &mt('You may want to review the request details and submit the request again.').
                           '</span>';
                 $creationresult = 'error';
             }
@@ -2756,7 +2918,12 @@ sub print_request_outcome {
                 my $putresult = &Apache::lonnet::newput_dom('courserequestqueue',$request,
                                                             $dom);
                 if ($putresult eq 'ok') {
-                    $output = &mt('Your course request has been recorded.').'<br />'.
+                    if ($crstype eq 'community') {
+                        $output .= &mt('Your community request has been recorded.');
+                    } else {
+                        $output .= &mt('Your course request has been recorded.') 
+                    }
+                    $output .= '<br />'.
                               &notification_information($disposition,$req_notifylist,
                                                         $cnum,$now);
                 } else {
@@ -2788,8 +2955,12 @@ sub print_request_outcome {
             &Apache::lonnet::logthis("Error saving course request status for  $requestkey (for $env{'user.name'}:$env{'user.domain'}) - $statusresult");
         }
         if ($modified && $queued && $storeresult eq 'ok') {
-            $output .= '<p>'.&mt('Your course request has been updated').'</p>'.
-                       &notification_information($disposition,$req_notifylist,$cnum,$now);
+            if ($crstype eq 'community') {
+                $output .= '<p>'.&mt('Your community request has been updated').'</p>';
+            } else {
+                $output .= '<p>'.&mt('Your course request has been updated').'</p>';
+            }
+            $output .= &notification_information($disposition,$req_notifylist,$cnum,$now);
         }
         if ($validationerror ne '') {
             $output .= '<span class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>';
@@ -2809,23 +2980,34 @@ sub update_requestors_roles {
     my $owner = $env{'user.name'}.':'.$env{'user.domain'};
     if (ref($details) eq 'HASH') {
         if (ref($details->{'personnel'}) eq 'HASH') {
+            my $ccrole = 'cc';
+            if ($crstype eq 'community') {
+                $ccrole = 'co';
+            }
             unless (ref($details->{'personnel'}{$owner}) eq 'HASH') {
                 $details->{'personnel'}{$owner} = {
-                                                    'roles' => ['cc'],
-                                                    'cc'    => { 'usec' => [] },
+                                                    'roles' => [$ccrole],
+                                                    $ccrole => { 'usec' => [] },
                                                   };
             }
             my @roles;
             if (ref($details->{'personnel'}{$owner}{'roles'}) eq 'ARRAY') {
                 @roles = sort(@{$details->{'personnel'}{$owner}{'roles'}});
-                unless (grep(/^cc$/,@roles)) {
-                    push(@roles,'cc');
+                unless (grep(/^\Q$ccrole\E$/,@roles)) {
+                    push(@roles,$ccrole);
                 }
             } else {
-                @roles = ('cc');
+                @roles = ($ccrole);
             }
             foreach my $role (@roles) {
-                my $start = $now;
+                my $refresh=$env{'user.refresh.time'};
+                if ($refresh eq '') {
+                    $refresh = $env{'user.login.time'};
+                }
+                if ($refresh eq '') {
+                    $refresh = $now;
+                }
+                my $start = $refresh-1;
                 my $end = '0';
                 if ($role eq 'st') {
                     if ($details->{'accessstart'} ne '') {
@@ -2836,7 +3018,7 @@ sub update_requestors_roles {
                     }
                 }
                 my @usecs;
-                if ($role ne 'cc') {
+                if ($role ne $ccrole) {
                     if (ref($details->{'personnel'}{$owner}{$role}{'usec'}) eq 'ARRAY') {
                         @usecs = @{$details->{'personnel'}{$owner}{$role}{'usec'}};
                     }
@@ -2901,15 +3083,27 @@ sub update_requestors_roles {
     }
     if ($active) {
         if ($numactive == 1) {
-            $output = &mt('Use the following link to enter the course:'); 
+            if ($crstype eq 'Community') {
+                $output = &mt('Use the following link to enter the community:');
+            } else {
+                $output = &mt('Use the following link to enter the course:'); 
+            }
         } else {
-            $output = &mt('Use the following links to your new roles to enter the course:');
+            if ($crstype eq 'Community') {
+                $output = &mt('Use the following links to your new roles to enter the community:');
+            } else {
+                $output = &mt('Use the following links to your new roles to enter the course:');
+            }
         }
         $output .= ' <ul>'.$active.'</ul><br />';
     }
     if ($future) {
-        $output .= &mt('The following course [quant,_1,role] will become available for selection from your [_2]roles page[_3], once the default student access start date - [_4] - has been reached:',$numfuture,'<a href="/adm/roles">','</a>',&Apache::lonlocal::locallocaltime($details->{'accessstart'})).
-                   ' <ul>'.$future.'</ul>';
+        if ($crstype eq 'Community') {
+            $output .= &mt('The following community [quant,_1,role] will become available for selection from your [_2]roles page[_3], once the default student access start date - [_4] - has been reached:',$numfuture,'<a href="/adm/roles">','</a>',&Apache::lonlocal::locallocaltime($details->{'accessstart'}))
+        } else {
+            $output .= &mt('The following course [quant,_1,role] will become available for selection from your [_2]roles page[_3], once the default student access start date - [_4] - has been reached:',$numfuture,'<a href="/adm/roles">','</a>',&Apache::lonlocal::locallocaltime($details->{'accessstart'}));
+        }
+        $output .= ' <ul>'.$future.'</ul>';
     }
     return $output;
 }
@@ -2951,122 +3145,37 @@ sub notification_information {
     return $output;
 }
 
-sub get_processtype {
-    my ($dom,$crstype,$inststatuses,$domconfig) = @_;
-    return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH'));
-    my (%userenv,%settings,$val);
-    my @options = ('autolimit','validate','approval');
-    if ($dom eq $env{'user.domain'}) {
-        %userenv = 
-            &Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'},
-                'requestcourses.'.$crstype,'inststatus');
-        if ($userenv{'requestcourses.'.$crstype}) {
-            $val = $userenv{'requestcourses.'.$crstype};
-            @{$inststatuses} = ('_custom_');
-        } else {
-            my ($task,%alltasks);
-            if (ref($domconfig->{'requestcourses'}) eq 'HASH') {
-                %settings = %{$domconfig->{'requestcourses'}};
-                if (ref($settings{$crstype}) eq 'HASH') {
-                    if (($env{'user.adv'}) && ($settings{$crstype}{'_LC_adv'} ne '')) {
-                        $val = $settings{$crstype}{'_LC_adv'};
-                        @{$inststatuses} = ('_LC_adv_');
-                    } else {
-                        if ($userenv{'inststatus'} ne '') {
-                            @{$inststatuses} = split(',',$userenv{'inststatus'});
-                        } else {
-                            @{$inststatuses} = ('default');
-                        }
-                        foreach my $status (@{$inststatuses}) {
-                            if (exists($settings{$crstype}{$status})) {
-                                my $value = $settings{$crstype}{$status};
-                                next unless ($value); 
-                                unless (exists($alltasks{$value})) {
-                                    if (ref($alltasks{$value}) eq 'ARRAY') {
-                                        unless(grep(/^\Q$status\E$/,@{$alltasks{$value}})) {
-                                            push(@{$alltasks{$value}},$status); 
-                                        }
-                                    } else {
-                                        @{$alltasks{$value}} = ($status);
-                                    }
-                                }
-                            }
-                        }
-                        my $maxlimit = 0;
-                        
-                        foreach my $key (sort(keys(%alltasks))) {
-                            if ($key =~ /^autolimit=(\d*)$/) {
-                                if ($1 eq '') {
-                                    $val ='autolimit=';
-                                    last;
-                                } elsif ($1 > $maxlimit) {
-                                    $maxlimit = $1; 
-                                }
-                            }
-                        }
-                        if ($maxlimit) {
-                            $val = 'autolimit='.$maxlimit;
-                        } else {
-                            foreach my $option (@options) {
-                                if ($alltasks{$option}) {
-                                    $val = $option;
-                                    last;  
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    } else {
-        %userenv = &Apache::lonnet::userenvironment($env{'user.domain'},
-                      $env{'user.name'},'reqcrsotherdom.'.$env{'form.crstype'});
-        if ($userenv{'reqcrsotherdom.'.$crstype}) {
-            my @doms = split(',',$userenv{'reqcrsotherdom.'.$crstype});
-            my $optregex = join('|',@options);
-            foreach my $item (@doms) {
-                my ($extdom,$extopt) = split(':',$item);
-                if ($extdom eq $dom) {  
-                    if ($extopt =~ /^($optregex)(=?\d*)$/) {
-                        $val = $1.$2;
-                    }
-                    last;
-                }
-            }
-            @{$inststatuses} = ('_external_');
-        }
-    }
-    return $val;
-}
-
 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]);
+                       'userroles',['active','future'],['cc','co'],[$dom]);
     my ($types,$typename) = &Apache::loncommon::course_types();
     my %requests = &Apache::lonnet::dumpstore('courserequests',$udom,$uname);
-    my %count;
-    if (ref($types) eq 'ARRAY') {
-        foreach my $type (@{$types}) {
-            $count{$type} = 0;
-        }
-    }
+    my $count = 0;
     foreach my $key (keys(%requests)) {
         my ($cdom,$cnum) = split('_',$key);
-        if (exists($crsroles{$cnum.':'.$cdom.':cc'})) {
-            if (ref($requests{$key}) eq 'HASH') {
-                my $type = $requests{$key}{'crstype'};
-                if ($type =~ /^official|unofficial|community$/) {
-                    $count{$type} ++;
-                }
+        if (ref($requests{$key}) eq 'HASH') {
+            next if ($requests{$key}{'crstype'} ne $crstype);
+            if (($crstype eq 'community') && 
+                (exists($crsroles{$cnum.':'.$cdom.':co'}))) {
+                $count ++;
+            } elsif ((($crstype eq 'official') || ($crstype eq 'unofficial')) &&
+                     (exists($crsroles{$cnum.':'.$cdom.':cc'}))) {
+                $count ++;
             }
         }
     }
-    if ($count{$crstype} < $limit) {
+    if ($count < $limit) {
         return 'process';
     } else {
         if (ref($typename) eq 'HASH') {
-            $$message = &mt('Your request has not been processed because you have reached the limit for the number of courses of this type.').'<br />'.&mt("Your $typename->{$crstype} limit is [_1].",$limit);
+            if ($crstype eq 'community') {
+                $$message = &mt('Your request has not been processed because you have reached the limit for the number of communities.').
+                            '<br />'.&mt("Your limit is [_1].",$limit);
+            } else {
+                $$message = &mt('Your request has not been processed because you have reached the limit for the number of courses of this type.').
+                            '<br />'.&mt("Your $typename->{$crstype} limit is [_1].",$limit);
+            }
         }
         return 'rejected';
     }