--- loncom/interface/lonrequestcourse.pm	2009/11/04 17:42:17	1.39
+++ loncom/interface/lonrequestcourse.pm	2010/03/16 22:40:12	1.47
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Request a course
 #
-# $Id: lonrequestcourse.pm,v 1.39 2009/11/04 17:42:17 raeburn Exp $
+# $Id: lonrequestcourse.pm,v 1.47 2010/03/16 22:40:12 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',
@@ -178,7 +176,6 @@ sub handler {
         &get_breadcrumbs($dom,$action,\$state,\%states,\%trail);
     if ($action eq 'display') {
         if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {
-            my $namespace = 'courserequestqueue';
             if ($env{'form.cnum'} ne '') {
                 my $cnum = $env{'form.cnum'};
                 my $reqkey = $cnum.'_approval';
@@ -192,16 +189,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')) {
@@ -263,6 +274,9 @@ sub handler {
             $jscript = &mainmenu_javascript();
         } else {
             $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored);
+            if ($state eq 'courseinfo') {
+                $jscript .= &cloning_javascript();
+            }
         }
     }
 
@@ -287,9 +301,9 @@ 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') {
@@ -302,8 +316,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 {
@@ -342,6 +356,22 @@ function setAction(courseForm) {
 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 {
     my ($dom,$action,$state,$states,$trail) = @_;
     my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles,$description);
@@ -387,7 +417,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')) {
@@ -407,12 +437,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);
 }
@@ -450,6 +480,7 @@ sub form_elements {
             },
             courseinfo => {
                 cdescr           => 'text',
+                cloning          => 'radio', 
                 clonecrs         => 'text',
                 clonedom         => 'selectbox',
                 datemode         => 'radio',
@@ -585,7 +616,10 @@ sub onload_action {
         if ($state eq 'crstype') {
             $loaditems{'onload'} = 'javascript:setAction(document.mainmenu_action);javascript:setType(document.mainmenu_coursetype)';
         } 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;
@@ -691,8 +725,8 @@ END
                 $domaintitle = &mt('Course Domain');
             }
         } elsif ($can_request->{'community'}) {
-            $pagetitle = 'Course/Community Requests';
-            $pageinfo = &mt('Request creation of a new course or community, or review your pending requests.');
+            $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';
@@ -739,7 +773,7 @@ END
  <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_closure().
               &Apache::lonhtmlcommon::row_title(&mt('Type')).'
 <form name="mainmenu_coursetype" method="post" action="">
 <select size="1" name="crstype">');
@@ -817,7 +851,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') {
@@ -834,11 +874,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);
@@ -850,7 +905,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");
@@ -867,8 +928,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>');
@@ -917,7 +984,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.').
@@ -932,8 +1003,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());
@@ -1285,14 +1364,26 @@ sub print_request_form {
         if ($env{'form.origcnum'} =~ /^($match_courseid)$/) {
             $cnum = $env{'form.origcnum'};
         } 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,
                                                  \%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,
@@ -1457,7 +1548,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'}.
@@ -1603,10 +1694,10 @@ sub date_setting_table {
     }
 
     $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_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);
     return $table;
 }
@@ -1629,12 +1720,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";
@@ -1722,13 +1813,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;
 }
 
@@ -1800,10 +1895,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>';
@@ -1851,7 +1954,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'".')" />';
@@ -1892,8 +2001,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>';
@@ -2082,7 +2195,8 @@ sub print_review {
 
     my %ctxt = &clone_text();
     $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$/)) {
         my $canclone = &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                            $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'},
@@ -2128,15 +2242,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 '') {
@@ -2172,7 +2289,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'}; 
@@ -2261,15 +2378,35 @@ function validateForm() {
     }
     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>
 
 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().
+    my $output .= $js_validate."\n".&Apache::lonhtmlcommon::start_pick_box().
                   &Apache::lonhtmlcommon::row_headline().
                   '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Description').'&nbsp;'.$title.'</h3>'.
                   &Apache::lonhtmlcommon::row_closure(1).
@@ -2285,10 +2422,22 @@ 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.
                &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" '.
+               'onclick="javascript:toggleCloning()" />'.&mt('No').'</label>'.
+               '</h3>'.
+               &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).
-               &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n";
+               &Apache::lonhtmlcommon::end_pick_box().'</div>'.
+               &Apache::lonhtmlcommon::end_pick_box()."\n";
     return $output;
 }
 
@@ -2333,7 +2482,7 @@ sub clone_text {
 sub coursecode_form {
     my ($dom,$context,$codetitles,$cat_titles,$cat_order,$num) = @_;
     my $output;
-    my %rowtitle = (
+    my %rowtitle = &Apache::lonlocal::texthash (
                     instcode  => 'Course Category',
                     crosslist => 'Cross Listed Course',
                    );
@@ -2532,6 +2681,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)) {
@@ -2593,7 +2746,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');
@@ -2645,7 +2798,8 @@ sub print_request_outcome {
     }
     my $clonecrs = '';
     my $clonedom = '';
-    if (($env{'form.clonecrs'} =~ /^($match_courseid)$/) && 
+    if (($env{'form.cloning'}) &&
+        ($env{'form.clonecrs'} =~ /^($match_courseid)$/) && 
         ($env{'form.clonedom'} =~ /^($match_domain)$/)) {
         my $clonehome = &Apache::lonnet::homeserver($env{'form.clonecrs'},
                                                     $env{'form.clonedom'});
@@ -2686,7 +2840,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.');
@@ -2744,7 +2900,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>';
             }
@@ -2752,11 +2912,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);
             }
@@ -2768,14 +2928,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';
             }
@@ -2808,7 +2976,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 {
@@ -2819,32 +2992,22 @@ sub print_request_outcome {
                 }
             }
         }
-        my ($statusresult);
-        if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {
-            $storeresult = &Apache::lonnet::store_userdata(\%reqhash,$requestkey,
-                                                           'courserequests');
-            if ($storeresult eq 'ok') {
-                my %status = (
-                                 'status:'.$dom.':'.$cnum => $reqstatus,
-                             );
-                $statusresult = &Apache::lonnet::put('courserequests',\%status);
-            }
-        } else {
-            $storeresult = 'error: invalid requestkey format'; 
-        }
-        if ($storeresult ne 'ok') {
-            $output .=  '<span class="LC_warning">'.&mt('An error occurred saving a record of the details of your request: [_1].',$storeresult).'</span><br />';
-            &Apache::lonnet::logthis("Error saving course request - $requestkey for $env{'user.name'}:$env{'user.domain'} - $storeresult");
-        } elsif ($statusresult ne 'ok') {
-            $output .= '<span class="LC_warning">'.&mt('An error occurred saving a record of the status of your request: [_1].',$statusresult).'</span><br />';
-            &Apache::lonnet::logthis("Error saving course request status for  $requestkey (for $env{'user.name'}:$env{'user.domain'}) - $statusresult");
-        }
+        ($storeresult,my $updateresult) = 
+            &Apache::loncoursequeueadmin::update_coursereq_status(\%reqhash,$dom,
+                $cnum,$reqstatus,'request');
         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>';
+            $output .= '<p class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>';
+        }
+        if ($updateresult) {
+            $output .= $updateresult;
         }
     }
     if ($creationresult ne '') {
@@ -2861,23 +3024,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 '') {
@@ -2888,7 +3062,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'}};
                     }
@@ -2953,15 +3127,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;
 }
@@ -2997,128 +3183,43 @@ sub notification_information {
                    '</div>';
     } else {
         $output .= '<div class="LC_warning">'.
-                   &mt('Your request status is: [_1].',$disposition). 
-                   '</div>'
+                   &mt('Your request status is: [_1].',$disposition).
+                   '</div>';
     }
     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';
     }