--- loncom/interface/loncoursegroups.pm	2009/02/05 12:32:26	1.92
+++ loncom/interface/loncoursegroups.pm	2023/07/29 20:33:25	1.132
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: loncoursegroups.pm,v 1.92 2009/02/05 12:32:26 schafran Exp $
+# $Id: loncoursegroups.pm,v 1.132 2023/07/29 20:33:25 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -31,11 +31,14 @@ use strict;
 use Apache::lonnet;
 use Apache::loncommon();
 use Apache::lonhtmlcommon();
+use Apache::lonhtmlgateway;
 use Apache::lonlocal;
 use Apache::lonnavmaps();
 use Apache::longroup();
 use Apache::portfolio();
+use Apache::lonuserutils();
 use Apache::Constants qw(:common :http);
+use HTML::Entities;
 use LONCAPA::map();
 use lib '/home/httpd/lib/perl/';
 use LONCAPA;
@@ -54,7 +57,7 @@ sub handler {
     if (! ($env{'request.course.fn'})) {
         # Not in a course
         $env{'user.error.msg'}=
-     "/adm/coursegroups:mdg:0:0:Cannot edit or view course groups";
+     "/adm/coursegroups:mdg:0:0:Cannot edit or view course/community groups";
         return HTTP_NOT_ACCEPTABLE;
     }
 
@@ -77,8 +80,8 @@ sub handler {
     my %functions = (
                       email => 'Send Messages', 
                       discussion => 'Discussion Boards',
-                      chat => 'Chat',
-                      files => 'File Repository',
+                      chat => 'Chat Room',
+                      files => 'Group Portfolio',
                       roster => 'Membership Roster',
                       homepage => $ucgpterm.' home page',
                     );
@@ -134,14 +137,14 @@ function changeSort(caller) {
 }
 function openGroupRoster(group,status) {
     var url = '/adm/grouproster?';
-    url += 'group='+group+'&status='+status+'&ref=popup';
-    var title = 'Group Membership';
+    url += 'group='+group+'&status='+status+'&ref=popup';
+    var title = 'Group_Membership';
     var options = 'scrollbars=1,resizable=1,menubar=0';
     options += ',width=700,height=600';
     rosterbrowser = open(url,title,options,'1');
     rosterbrowser.focus();
 }\n|;
-    $r->print(&header('Groups',$jscript,$action,$state));
+    $r->print(&header('My Space',$jscript,$action,$state));
     if ($env{'form.refpage'} eq 'cusr') {
         &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"/adm/createuser",
@@ -168,13 +171,13 @@ sub display_groups {
     my %curr_groups = ();
     my %grp_info = ();
     my %actionlinks = (
-      modify => '<a href="/adm/coursegroups?action=modify&refpage='.
-                         $env{'form.refpage'}.'&state=pick_task&groupname=',
-      view => '<a href="/adm/'.$cdom.'/'.$cnum.'/',
-      delete => '<a href="/adm/coursegroups?action=delete&refpage='.
-                         $env{'form.refpage'}.'&state=verify&groupname=',
-      reenable => '<a href="/adm/coursegroups?action=reenable&refpage='.
-                         $env{'form.refpage'}.'&state=verify&groupname=',
+      modify   => '/adm/coursegroups?action=modify&refpage='.
+                  $env{'form.refpage'}.'&state=pick_task&groupname=',
+      view     => '',
+      delete   => '/adm/coursegroups?action=delete&refpage='.
+                  $env{'form.refpage'}.'&state=verify&groupname=',
+      reenable => '/adm/coursegroups?action=reenable&refpage='.
+                  $env{'form.refpage'}.'&state=verify&groupname=',
     );
     my %lt = &Apache::lonlocal::texthash( 
                           modify => 'Modify',
@@ -188,7 +191,7 @@ sub display_groups {
                           crtd   => 'Created',
                           last   => 'Last Modified',
                           func   => 'Collaborative Tools',
-                          quot   => 'Quota (Mb)',
+                          quot   => 'Quota (MB)',
                           memb   => 'Members',
                           file   => 'Files',
                           dibd   => 'Discussion Boards',
@@ -221,6 +224,14 @@ sub display_groups {
                                                           $status);
 
         if (%curr_groups) {
+            my $navmap=Apache::lonnavmaps::navmap->new();
+            if (!defined($navmap)) {
+                $r->print('<div class="LC_error">'.
+                          &mt('An error occurred retrieving information about resources in the course.').'<br />'.
+                          &mt('It is recommended that you [_1]re-initialize the course[_2] and then return to this page.','<a href="/adm/roles?selectrole=1&amp;newrole='.$env{'request.role'}.'&amp;orgurl=%2fadm%2fcoursegroups">','</a>').
+                          '</div>');
+                return;
+            }
             if ($manage_permission) {
                 if ($action ne 'reenable') {
                     $r->print('<br /><a href="/adm/coursegroups?action=create&amp;refpage='.$env{'form.refpage'}.'">'.$lt{'crng'}.'</a>');
@@ -240,7 +251,7 @@ sub display_groups {
         <th><a href="javascript:changeSort('creator')">$lt{'crea'}</a></th>
         <th><a href="javascript:changeSort('creation')">$lt{'crtd'}</a></th>
         <th><a href="javascript:changeSort('modified')">$lt{'last'}</a></th>
-        <th>$lt{'func'}</b></td>
+        <th>$lt{'func'}</th>
         <th><a href="javascript:changeSort('quota')">$lt{'quot'}</a></th>
         <th><a href="javascript:changeSort('totalmembers')">$lt{'memb'}</a></th>
         <th><a href="javascript:changeSort('totalfiles')">$lt{'file'}</a></th>
@@ -319,23 +330,31 @@ END
                     if (!$functionality) {
                         $functionality = &mt('None available');
                     }
-                    my $link = $actionlinks{$action};
+                    my $link;
                     if ($action eq 'modify' || $action eq 'delete' || 
                         $action eq 'reenable') {
-                        $link .= $group;
+                        $link = '<a href="'.&HTML::Entities::encode($actionlinks{$action}.$group,'<>&"').
+                                '">'.$lt{$action}.'</a>';
                     } else {
-                        $link .= $group.'/smppg?ref=grouplist';
-                        if (exists($env{'form.refpage'})) {
-                            $link .= '&amp;refpage='.$env{'form.refpage'};
+                        $link =
+                            &Apache::longroup::get_group_link($cdom,$cnum,$group,$navmap,
+                                                              $view_permission);
+                        if ($link) {
+                            $link = '<a href="'.$link;
+                            $link .= (($link=~/\?/)?'&amp;':'?').'ref=grouplist';
+                            if (exists($env{'form.refpage'})) {
+                                $link .= '&amp;refpage='.$env{'form.refpage'};
+                            }
+                            $link .= '">'.$lt{$action}.'</a>';
                         }
                     }
-                    $link .= '">'.$lt{$action}.'</a>';
                     if ($action eq 'view') { 
                         if ($manage_permission) { 
-                            $link .= '&nbsp;&nbsp;'.$actionlinks{'modify'}.
-                                      $group.'">'.$lt{'modify'}.'</a>'.
-                                     '&nbsp;&nbsp;'.$actionlinks{'delete'}.
-                                      $group.'">'.$lt{'delete'}.'</a>';
+                            $link .= '&nbsp;&nbsp;<a href="'.
+                                      &HTML::Entities::encode($actionlinks{'modify'}.$group,'<>&"').
+                                      '">'.$lt{'modify'}.'</a>&nbsp;&nbsp;<a href="'.
+                                      &HTML::Entities::encode($actionlinks{'delete'}.$group,'<>&"').
+                                      '">'.$lt{'delete'}.'</a>';
                         }
                     }
                     $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').
@@ -383,19 +402,60 @@ END
     } else {
         my @coursegroups = split(/:/,$env{'request.course.groups'});
         if (@coursegroups > 0) {
+            my $numlinks = 0;
             $r->print('<br /><br />');
             my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
             if (%curr_groups) {
+                my $navmap=Apache::lonnavmaps::navmap->new();
+                if (!defined($navmap)) {
+                    $r->print('<div class="LC_error">'.
+                              &mt('An error occurred retrieving information about resources in the course.').'<br />'.
+                              &mt('It is recommended that you [_1]re-initialize the course[_2] and then return to this page.','<a href="/adm/roles?selectrole=1&amp;newrole='.$env{'request.role'}.'&amp;orgurl=%2fadm%2fcoursegroups">','</a>').
+                              '</div>');
+                    return;
+                }
                 foreach my $group (@coursegroups) {
                     my %group_info =  &Apache::longroup::get_group_settings(
                                         $curr_groups{$group});
                     my $description = &unescape(
                                         $group_info{description});
-                    $r->print('<font size="+1"><a href="/adm/'.$cdom.'/'.$cnum.'/'.$group.'/smppg?ref=grouplist">'.$group,'</a><font><br /><small>'.$description.'</small><br /><br />');
+                    my ($link,$hidden) = 
+                        &Apache::longroup::get_group_link($cdom,$cnum,$group,$navmap,
+                                                          $view_permission);
+                    if ($link) {
+                        $link .= '&amp;ref=grouplist';
+                        $r->print('<span style="font-size: larger"><a href="'.$link.'">'.
+                                  $description.'</a></span><br /><br />');
+                        $numlinks ++;
+                    } elsif ($hidden) {
+                        my $numtools = 0;
+                        my $refarg = '&amp;ref=grouplist'; 
+                        my $output =
+                            &Apache::longroup::display_group_links($r,$env{'form.grade_target'},$group,'view',
+                                                                   $refarg,\$numtools,$hidden,%group_info);
+                        if ($numtools) {
+                            $r->print('<span style="font-size: larger">'.$description.'</a></span>'.
+                                      '<br />'.$output.'<br /><br />');
+                            $numlinks ++;
+                        }
+                    }
                 }
             }
+            if (!$numlinks) {
+                $r->print(
+                    '<p class="LC_info">'
+                   .&mt('You do not currently have access to any '.$gpterm.'s'
+                   .' in this '.lc($crstype).'.')
+                   .'</p>'
+                );
+            }
         } else {
-            $r->print(&mt('You are not currently a member of any active '.$gpterm.'s in this '.lc($crstype).'.'));
+            $r->print(
+                '<p class="LC_info">'
+               .&mt('You are not currently a member of any active '.$gpterm.'s'
+                   .' in this '.lc($crstype).'.')
+               .'</p>'
+            );
         }
     }
     return;
@@ -537,7 +597,7 @@ sub group_administration {
 
     if (ref($stored{'autorole'}) eq 'ARRAY') {
         foreach my $role (@{$stored{'autorole'}}) {
-            unless ($role eq 'cc') {
+            unless (($role eq 'cc') || ($role eq 'co')) {
                 $elements{'modify'}{'change_settings'}{'sec_'.$role} = 
                                                                    'selectbox';
             }
@@ -785,7 +845,7 @@ sub group_administration {
     }
     var maxposs = '.sprintf("%.2f",$maxposs).';
     if (newquota > maxposs) {
-        alert("The file repository quota you entered for this group ("+newquota+" Mb) exceeds the maximum possible ("+maxposs+" Mb). Please enter a smaller number.");
+        alert("The group portfolio quota you entered for this group ("+newquota+" MB) exceeds the maximum possible ("+maxposs+" MB). Please enter a smaller number.");
         return;
     }
     var re_quota = '.$float_check.';
@@ -804,7 +864,7 @@ sub group_administration {
             }
         }
         if (warn_zero == 1) {
-            alert("You have indicated that the file repository should be enabled, but you have set the respository quota to 0 Mb.\nThis will prevent any upload of files.\nPlease set a value or disable the repository feature.");
+            alert("You have indicated that the group portfolio should be enabled, but you have set the repository quota to 0 MB.\nThis will prevent any upload of files.\nPlease set a value or disable the repository feature.");
             return;
         }
     } 
@@ -870,7 +930,7 @@ function changeSort(caller) {
           faq=>9,bug=>'Instructor Interface',});
         if ($action eq 'modify' || $action eq 'delete') {
             &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>"/adm/coursegroups?refpage=cusr&action=$action",
+            ({href=>"/adm/coursegroups?refpage=cusr&amp;action=$action",
               text=>"Groups",
               faq=>9,bug=>'Instructor Interface',});
         }
@@ -882,7 +942,8 @@ function changeSort(caller) {
         if ($env{'form.refpage'} eq 'grouplist') {
             &Apache::lonhtmlcommon::add_breadcrumb
              ({href=>"/adm/$cdom/$cnum/$env{'form.groupname'}/smppg?ref=grouplist",
-               text=>"Group: $description",});
+               text=>&mt('Group').": $description",
+               no_mt=>1});
         }
     }
 
@@ -916,10 +977,10 @@ function changeSort(caller) {
                           );
     my %navbuttons = &Apache::lonlocal::texthash(
                              gtns => 'Next',#'Go to next step',
-                             gtps => 'Previous',#'Go to previous step',
+                             gtps => 'Back',#'Go to previous step',
                              crgr => 'Create '.$gpterm,
                              mose => 'Save',#'Modify settings',
-                             gtpp => 'Previous',#'Go to previous page',
+                             gtpp => 'Back',#'Go to previous page',
                              adme => 'Add members',
     );
     if ((($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) &&
@@ -1086,7 +1147,7 @@ sub display_control {
             &add_members_form($r,$cdom,$cnum,$action,$state,$page,$startdate,
                               $enddate,$groupname,$description,$granularity,
                               $quota,$sectioncount,$tools,$functions,$stored,
-                              $states,$navbuttons,$gpterm,$ucgpterm);
+                              $states,$navbuttons,$gpterm,$ucgpterm,$crstype);
         } elsif ($state eq 'pick_members') {
             &choose_members_form($r,$cdom,$cnum,$action,$state,$page,
                                  $groupname,$description,$granularity,$quota,
@@ -1119,31 +1180,36 @@ sub display_control {
         my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action);
         if ($state eq 'verify') {
             &verify_delete($r,$groupname,$state,$action,$page,$states,
-                           \%stored);
+                           \%stored,$crstype);
         } elsif ($state eq 'result') {
-            &delete_group($r,$cdom,$cnum,$groupname);
+            &delete_group($r,$cdom,$cnum,$groupname,$crstype);
         }
     } elsif ($action eq 'reenable') {
         my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action);
         if ($state eq 'verify') {
             &verify_reenable($r,$groupname,$state,$action,$page,$states,
-                           \%stored);
+                           \%stored,$crstype);
         } elsif ($state eq 'result') {
-            &reenable_group($r,$cdom,$cnum,$groupname);
+            &reenable_group($r,$cdom,$cnum,$groupname,$crstype);
         }
     }
 }
 
 sub verify_delete {
-    my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_;
+    my ($r,$groupname,$formname,$action,$page,$states,$stored,$crstype) = @_;
     $r->print(&Apache::lonhtmlcommon::echo_form_input([]));
     $r->print(&mt('You have requested deletion of the group [_1].'
                  ,'<i>'.$stored->{'description'}.'</i>').
               '<br /><br />'.&mt('When a group is deleted the following occurs:').'<ul>'.
               '<li>'.&mt('All group membership is terminated.').'</li>'.
-              '<li>'.&mt('The group ceases to be available either for viewing or for modification of group settings and membership.').'</li>'.
-              '<li>'.&mt('The group folder is removed from the folder containing it - normally this is the "Course Groups" folder which contains folders for all groups in the course.').'</li>'.
-              '</ul>'.&mt('Although a deleted group is no longer accessible, the group name used for the group will be reserved, and will not be available for assignment to a new group in the same course in the future.'));
+              '<li>'.&mt('The group ceases to be available either for viewing or for modification of group settings and membership.').'</li>');
+    if ($crstype eq 'Community') {
+        $r->print( '<li>'.&mt("The group folder is removed from the folder containing it - normally this is the 'Community Groups' folder which contains folders for all groups in the community.").'</li>'.
+                   '</ul>'.&mt("Although a deleted group is no longer accessible, the group name used for the group will be reserved, and will not be available for assignment to a new group in the same community in the future."));
+    } else { 
+        $r->print( '<li>'.&mt("The group folder is removed from the folder containing it - normally this is the 'Course Groups' folder which contains folders for all groups in the course.").'</li>'.
+                   '</ul>'.&mt("Although a deleted group is no longer accessible, the group name used for the group will be reserved, and will not be available for assignment to a new group in the same course in the future."));
+    }
     my $prevtext = &mt('Go back');
     my $nexttext = &mt('Delete group');
     my $prev;
@@ -1156,7 +1222,7 @@ sub verify_delete {
 }
 
 sub delete_group {
-    my ($r,$cdom,$cnum,$groupname) = @_;
+    my ($r,$cdom,$cnum,$groupname,$crstype) = @_;
     my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
                                                            $groupname);
     my $now = time;
@@ -1198,38 +1264,45 @@ sub delete_group {
                  .&mt('Group deletion failed because deletion of [_1] out of [_2] members failed.'
                      ,$num_fail,$num_users)
                  .'</div>');
-        
     } else {
         my ($result,$message) = 
              &Apache::lonnet::toggle_coursegroup_status($cdom,$cnum,
                                                         $groupname,'delete');
         if ($result eq 'ok') {
-            my $outcome = &modify_folders($cdom,$cnum,$groupname);
+            my $outcome = &modify_folders($cdom,$cnum,$groupname,$crstype);
             if ($outcome eq '') {
-                $r->print('<div class="LC_success">'
-                         .&mt('Group successfully deleted.')
-                         .'</div>');
+                my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Group successfully deleted.'));
+                $message = &Apache::loncommon::confirmwrapper($message);
+                $r->print($message);
             } else {
-                $r->print('<div class="LC_error">'
-                         .&mt("Although the group was deleted, an error occurred when removing"
-                             ." the group's folder from the 'Course Groups' folder: [_1]",$outcome)
-                         .'</div>');
+                $r->print('<div class="LC_error">');
+                if ($crstype eq 'Community') {
+                    $r->print(&mt("Although the group was deleted, an error occurred when removing the group's folder from the 'Community Groups' folder: [_1]",$outcome));
+                } else {
+                    $r->print(&mt("Although the group was deleted, an error occurred when removing the group's folder from the 'Course Groups' folder: [_1]",$outcome));
+                }
+                $r->print('</div>');
             }
         } else {
-            $r->print('<div class="LC_error">'
-                     .&mt('Group deletion failed.')
-                     .'</div>');
+            my $msg = &Apache::lonhtmlcommon::confirm_success(&mt('Group deletion failed.'),1);
+            $msg = &Apache::loncommon::confirmwrapper($msg);
+            $r->print($msg);
         }
     }
     return;
 }
 
 sub reenable_folder {
-    my ($cdom,$cnum,$groupname,$description) = @_;
+    my ($cdom,$cnum,$groupname,$description,$crstype) = @_;
     my $outcome;
     my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
     my $allgrpsmap = $crspath.'group_allfolders.sequence';
-    my $foldertitle = &mt('Course Folder -[_1]',$description);
+    my $foldertitle;
+    if ($crstype eq 'Community') {
+        $foldertitle = &mt("Community Folder -[_1]",$description);
+    } else {
+        $foldertitle = &mt("Course Folder -[_1]",$description);
+    }
     my $mapurl = $crspath.'group_folder_'.
                    $groupname.'.sequence';
     my ($errtext,$fatal)=&LONCAPA::map::mapread($allgrpsmap);
@@ -1243,7 +1316,7 @@ sub reenable_folder {
         $LONCAPA::map::resources[$idx] = $foldertitle.':'.$mapurl.
                                          ':false:normal:res';
         $LONCAPA::map::order[1+$#LONCAPA::map::order]=$idx;
-        my ($outtext,$errtext) = &LONCAPA::map::storemap($allgrpsmap,1);
+        my ($outtext,$errtext) = &LONCAPA::map::storemap($allgrpsmap,1,1);
         if ($errtext) {
             $outcome='<div class="LC_error">'
                     .&mt('An error occurred when saving updated parent folder to group:'
@@ -1258,14 +1331,19 @@ sub reenable_folder {
 }
 
 sub modify_folders {
-    my ($cdom,$cnum,$groupname) = @_;
+    my ($cdom,$cnum,$groupname,$crstype) = @_;
     my ($outcome,$groupmap,$groupmapres,$map,$id,$src);
     my $navmap = Apache::lonnavmaps::navmap->new();
     if (!defined($navmap)) {
-        $outcome = '<div class="LC_error">'.
-                   &mt('Error reading course contents.').' '.
-                   &mt('You need to re-initialize the course.').
-                   '</div>';
+        $outcome = '<div class="LC_error">';
+        if ($crstype eq 'Community') {
+            $outcome .= &mt("Error reading community contents.").' '.
+                   &mt("You need to re-initialize the community.");
+        } else {
+            $outcome .= &mt("Error reading course contents.").' '.
+                   &mt("You need to re-initialize the course.");
+        }
+        $outcome .= '</div>';
         return $outcome;
     }
     $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'.
@@ -1303,7 +1381,7 @@ sub modify_folders {
                     $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
                 }
                 $#LONCAPA::map::order--;
-                my ($outtext,$errtext) = &LONCAPA::map::storemap($map,1);
+                my ($outtext,$errtext) = &LONCAPA::map::storemap($map,1,1);
                 if ($errtext) {
                     $outcome='<div class="LC_error">'
                             .&mt('An error occurred when saving updated parent folder to group:')
@@ -1320,13 +1398,18 @@ sub modify_folders {
 }
 
 sub verify_reenable {
-    my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_;
+    my ($r,$groupname,$formname,$action,$page,$states,$stored,$crstype) = @_;
     $r->print(&Apache::lonhtmlcommon::echo_form_input([]));
     $r->print(&mt('You have requested enabling the previously deleted group [_1].'
                  ,'<i>'.$stored->{'description'}.'</i>').
               '<br /><br />'.&mt('When a deleted group is re-enabled the following occurs:').'<ul>'.
-              '<li>'.&mt('Group settings and membership at the time the group was deleted are reinstated.').'</li>'.
-              '<li>'.&mt('A group folder is added to the "Course Groups" folder which contains folders for all groups in the course.').'</li></ul>');
+              '<li>'.&mt('Group settings and membership at the time the group was deleted are reinstated.').'</li><li>');
+    if ($crstype eq 'Community') {
+        $r->print(&mt("A group folder is added to the 'Community Groups' folder which contains folders for all groups in the community."));
+    } else {
+        $r->print(&mt("A group folder is added to the 'Course Groups' folder which contains folders for all groups in the course."));
+    }
+    $r->print('</li></ul>');
     my $prevtext = &mt('Go back');
     my $nexttext = &mt('Reenable group');
     my $prev;
@@ -1339,7 +1422,7 @@ sub verify_reenable {
 }
 
 sub reenable_group {
-    my ($r,$cdom,$cnum,$groupname) = @_;
+    my ($r,$cdom,$cnum,$groupname,$crstype) = @_;
     my %groups = 
         &Apache::longroup::coursegroups($cdom,$cnum,$groupname,
                                         'deleted_groups');
@@ -1413,20 +1496,24 @@ $context) eq 'ok') {
                      .&mt('There were no group members to reinstate, as none were removed when the group was deleted.')
                      .'</div>');
         }
-        my $outcome = &reenable_folder($cdom,$cnum,$groupname,$description);
+        my $outcome = &reenable_folder($cdom,$cnum,$groupname,$description,$crstype);
         if ($outcome eq '') {
-            $r->print('<div class="LC_success">'
-                     .&mt('Group successfully re-enabled.')
-                     .'</div>');
+            my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Group successfully re-enabled.'));
+            $message = &Apache::loncommon::confirmwrapper($message);
+            $r->print($message);
         } else {
-            $r->print('<div class="LC_error">'
-                     .&mt("Although the group was re-enabled, an error occurred when adding the group's folder to the 'Course Groups' folder: [_1]",$outcome)
-                     .'</div>');
+            $r->print('<div class="LC_error">');
+            if ($crstype eq 'Community') {
+                $r->print(&mt("Although the group was re-enabled, an error occurred when adding the group's folder to the 'Community Groups' folder: [_1]",$outcome));
+            } else {
+                $r->print(&mt("Although the group was re-enabled, an error occurred when adding the group's folder to the 'Course Groups' folder: [_1]",$outcome));
+            }
+            $r->print('</div>');
         }
     } else {
-        $r->print('<div class="LC_error">'
-                 .&mt('Re-enabling group failed.')
-                 .'</div>');
+        my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Re-enabling group failed.'),1);
+        $message = &Apache::loncommon::confirmwrapper($message);
+        $r->print($message);
     }
     return;
 }
@@ -1440,7 +1527,7 @@ sub header {
 				       {'add_entries' => $loaditems,});
     my $output = <<"END";
 $start_page
-<form method="POST" name="$state">
+<form method="post" name="$state" action="">
 
 END
     if ($action eq 'create' || $action eq 'modify') {
@@ -1500,16 +1587,19 @@ sub build_members_list {
 sub group_files {
     my ($group,$portpath,$numfiles,$numdirs) = @_;
     my $dirptr=16384;
-    my @dir_list=&Apache::portfolio::get_dir_list($portpath,undef,$group);
-    foreach my $line (@dir_list) {
-        my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);
-        if (($filename !~ /^\.\.?$/) && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/) && ($filename ne 'no_such_dir')) { 
-            if ($dirptr&$testdir) {
-                $portpath .= '/'.$filename;
-                $$numdirs ++;
-                &group_files($group,$portpath,$numfiles,$numdirs)
-            } else {
-                $$numfiles ++;
+    my ($dirlistref,$listerror) = 
+        &Apache::portfolio::get_dir_list($portpath,undef,$group);
+    if (ref($dirlistref) eq 'ARRAY') {
+        foreach my $line (@{$dirlistref}) {
+            my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);
+            if (($filename !~ /^\.\.?$/) && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/) && ($filename ne 'no_such_dir')) { 
+                if ($dirptr&$testdir) {
+                    $portpath .= '/'.$filename;
+                    $$numdirs ++;
+                    &group_files($group,$portpath,$numfiles,$numdirs)
+                } else {
+                    $$numfiles ++;
+                }
             }
         }
     }
@@ -1531,7 +1621,7 @@ sub group_members {
                          future => 0,
                        );
     my $totalmembers = 0;
-    foreach my $member (keys %memberhash) {
+    foreach my $member (keys(%memberhash)) {
         $totalmembers ++;
         my ($end,$start) = split(/:/,$memberhash{$member});
         unless ($start == -1) {
@@ -1579,7 +1669,7 @@ sub general_settings_form {
     &access_date_settings($r,$action,$formname,$stored,2,$gpterm,$ucgpterm);
     if ($action eq 'create') {
         &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,3,
-                            $gpterm,$ucgpterm);
+                            $gpterm,$ucgpterm,$crstype);
         $nexttext = $$navbuttons{'gtns'};
     } else {
         my @available = ();
@@ -1588,7 +1678,7 @@ sub general_settings_form {
         @{$tools} = sort(keys(%{$functions}));
         &privilege_specificity($r,$action,3,$tools,$stored,$toolprivs,
 			       $fixedprivs,\@available,$formname,
-			       $gpterm,$ucgpterm,$functions);
+			       $gpterm,$ucgpterm,$functions,$crstype);
         &mapping_options($r,$action,$formname,$page,$sectioncount,
                          $states,$stored,$navbuttons,4,5,
 			 $gpterm,$ucgpterm,$crstype,$cdom,$cnum);
@@ -1612,102 +1702,115 @@ sub groupsettings_options {
         'lett' => 'Letters, numbers and underscore only',
         'doyo' => 'Different subsets of the chosen collaborative tools '.
                   'for different group members?',
+        'gran' => 'Granularity',
+        'dquo' => 'Disk quota',
     );
     my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored);
-    $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'gnde'}).'
-     <table class="LC_descriptive_input">
-      <tr>
-       <td class="LC_description">'.$lt{'gnam'}.':</td>
-       <td colspan="5">
-');
+    $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'gnde'}));
+
+    # Group Name
+    $r->print(&Apache::lonhtmlcommon::start_pick_box()
+             .&Apache::lonhtmlcommon::row_title($lt{'gnam'})
+    );
     if ($action eq 'create') {
-        $r->print('<input type="text" name="groupname" size="25" />&nbsp;('.
-                  $lt{'lett'}.')');
+        $r->print('<input type="text" name="groupname" size="25" />'
+                 .' <span class="LC_nobreak">('
+                 .$lt{'lett'}.')</span>'
+        );
     } else {
         $r->print('<input type="hidden" name="groupname" value="'.
                          $env{'form.groupname'}.'" />'.$env{'form.groupname'});
     }
-    $r->print(<<"END");
-       </td>
-      <tr>
-      <tr>
-       <td class="LC_description">$lt{'desc'}:</td>
-       <td colspan="5"><input type="text" name="description" size="40"
-                                                    value="" />
-       </td>
-      <tr>
-      <tr>
-       <td class="LC_description">$lt{'func'}:</td>
-END
+    $r->print(&Apache::lonhtmlcommon::row_closure());
+
+    # Group Title
+    $r->print(&Apache::lonhtmlcommon::row_title($lt{'desc'})
+             .'<input type="text" name="description" size="40" value="" />'
+             .&Apache::lonhtmlcommon::row_closure()
+    );
+
+    # Collaborative Tools
     my $numitems = keys(%{$functions});
     my $halfnum = int($numitems/2);
     my $remnum = $numitems%2;
     if ($remnum) {
         $halfnum ++;
     }
-    my @allfunctions = sort(keys (%{$functions}));
-    for (my $i=0; $i<$halfnum; $i++) {
-        $r->print('<td><label><input type="checkbox" name="tool" value="'.
-                  $allfunctions[$i].'" />&nbsp;'.
-                   &mt($$functions{$allfunctions[$i]}).'</label></td>
-                   <td>&nbsp;</td><td>&nbsp;</td>');
-    }
-    $r->print('<td><input type="button" value="'.&mt('check all').'" '.
-              'onclick="javascript:checkAll(document.'.$formname.'.tool)" />'.
-              '</td></tr><tr><td>&nbsp;</td>');
-    for (my $j=$halfnum; $j<@allfunctions; $j++) {
-        $r->print('<td><label><input type="checkbox" name="tool" value="'.
-                  $allfunctions[$j].'" />&nbsp;'.
-                  &mt($$functions{$allfunctions[$j]}).'</label></td>
-                  <td>&nbsp;</td><td>&nbsp;</td>');
-    }
-    if ($remnum) {
-        $r->print('<td>&nbsp;</td>');
+    my @allfunctions = sort(keys(%{$functions}));
+
+    $r->print(&Apache::lonhtmlcommon::row_title($lt{'func'})
+             .'<div>'
+             .'<input type="button" value="'.&mt('check all').'"'
+             .' onclick="javascript:checkAll(document.'.$formname.'.tool)" />'
+             .'&nbsp;<input type="button" value="'.&mt('uncheck all').'"'
+             .' onclick="javascript:uncheckAll(document.'.$formname.'.tool)" />'
+             .'</div>'
+             .'<table cellpadding="5px"><tr>' # FIXME Get rid of inflexible table (-> float)
+    );
+    for (my $i=0; $i<@allfunctions; $i++) {
+        $r->print('<td><label><span class="LC_nobreak">'
+                 .'<input type="checkbox" name="tool" value="'
+                 .$allfunctions[$i].'" /> '
+                 .&mt($$functions{$allfunctions[$i]})
+                 .'</span></label></td>'
+        );
+        if ($i == $halfnum - 1) {
+            $r->print('</tr><tr>');
+        }
     }
-    $r->print('
-       <td>
-        <input type="button" value="'.&mt('uncheck all').'"
-          onclick="javascript:uncheckAll(document.'.$formname.'.tool)" />
-       </td>
-      </tr>
-      <tr>
-       <td class="LC_description">'.&mt('Granularity:').'</td>
-       <td colspan="10">'.$lt{'doyo'}.'&nbsp;<label><input type="radio" name="granularity" value="Yes" />'.&mt('Yes').'</label>&nbsp;<label><input type="radio" name="granularity" value="No" checked="checked" />'.&mt('No').'</label>');
+    $r->print('</tr></table>'
+             .&Apache::lonhtmlcommon::row_closure()
+    );
+
+    # Granularity
+    $r->print(&Apache::lonhtmlcommon::row_title($lt{'gran'})
+             .$lt{'doyo'}.'<br />'
+             .'<label>'
+             .'<input type="radio" name="granularity" value="Yes" />'.&mt('Yes')
+             .'</label>&nbsp;<label>'
+             .'<input type="radio" name="granularity" value="No" checked="checked" />'.&mt('No')
+             .'</label>'
+    );
     if ($action eq 'modify') {
-        $r->print('&nbsp;&nbsp;('.&mt('Currently set to [_1].'
-                                      ,'"'.&mt($$stored{'granularity'}).'"').')');
+        $r->print(' <span class="LC_nobreak">('
+                 .&mt('Currently set to [_1].'
+                     ,'"'.&mt($$stored{'granularity'}).'"')
+                 .')</span>'
+        );
     }
-    $r->print('
-       </td>
-      </tr>
-      <tr>
-       <td class="LC_description">'.&mt('Disk quota: ').'</td><td colspan="10">');
+    $r->print(&Apache::lonhtmlcommon::row_closure());
+
+    # Disk Quota
+    $r->print(&Apache::lonhtmlcommon::row_title($lt{'dquo'}));
     if ($action eq 'create') {
-        $r->print(&mt('If you enable the file repository for the '.$gpterm.', allocate a disk quota.'));
+        $r->print('<span class="LC_info">'
+                 .&mt('If you enable the group portfolio for the '.$gpterm
+                     .', allocate a disk quota.')
+                 .'</span>'
+        );
     } else {
-        $r->print(&mt('Quota allocated to file repository:'));
+        $r->print(&mt('Quota allocated to group portfolio:'));
     } 
-    $r->print('&nbsp;'.&mt('[_1] Mb','<input type="text" name="quota" size="4" />'));
+    $r->print(' '.&mt('[_1] MB','<input type="text" name="quota" size="4" />'));
     if ($action eq 'create') {
         $r->print('<br />'
-                 .&mt('A total of [_1] Mb can be divided amongst all '.$gpterm.'s in the '
-                     .lc($crstype).', and [_2] Mb are currently unallocated.'
+                 .&mt('A total of [_1] MB can be divided amongst all '.$gpterm.'s in the '
+                     .lc($crstype).', and [_2] MB are currently unallocated.'
                      ,$crsquota,sprintf("%.2f",$freespace))
                  );
     } else {
-        $r->print('&nbsp;&nbsp;('.&mt('The quota is currently [_1] Mb',
+        $r->print('&nbsp;&nbsp;('.&mt('The quota is currently [_1] MB',
                                       $$stored{'quota'}).').');
 
         $r->print('<br />'
-                 .&mt('The quota can be increased to [_1] Mb, '
+                 .&mt('The quota can be increased to [_1] MB, '
                  .'by adding all unallocated space for '.$gpterm.'s in the '.lc($crstype).'.'
                   ,sprintf("%.2f",$maxposs)));
     }
-    $r->print('
-       </td>
-      </tr>
-     </table>
-');
+    $r->print(&Apache::lonhtmlcommon::row_closure(1));
+
+    $r->print(&Apache::lonhtmlcommon::end_pick_box());
+
     return;
 }
 
@@ -1716,7 +1819,24 @@ sub get_quota_constraints {
     my ($crsquota,$freespace,$maxposs); 
     $crsquota = $env{'course.'.$env{'request.course.id'}.'.internal.coursequota'};
     if ($crsquota eq '') {
-        $crsquota = 20;
+        my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+        my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+        my $crstype = &Apache::loncommon::course_type();
+        my %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
+        my %coursehash = (
+            'internal.coursecode' => $env{'course.'.$env{'request.course.id'}.'.internal.coursecode'},
+            'internal.textbook'   => $env{'course.'.$env{'request.course.id'}.'.internal.textbook'},
+        );
+        my %staticdefaults = (
+                           coursequota   => 20,
+        );
+        my $quotatype = &Apache::lonuserutils::get_extended_type($cdom,$cnum,$crstype,\%coursehash);
+        if ($crsquota eq '') {
+            $crsquota = $domdefs{$quotatype.'coursequota'};
+            if ($crsquota eq '') {
+                $crsquota = $staticdefaults{'coursequota'};
+            }
+        }
     }
     $freespace = $crsquota - &Apache::longroup::sum_quotas();
     if ($action eq 'create') {
@@ -1728,38 +1848,47 @@ sub get_quota_constraints {
 }
 
 sub membership_options {
-    my ($r,$cdom,$cnum,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm)=@_;
-    my $crstype = &Apache::loncommon::course_type();
+    my ($r,$cdom,$cnum,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm,$crstype)=@_;
     my %lt = &Apache::lonlocal::texthash(
                 'pipa' => 'Build a list of users for selection of group members',
-                'gmem' => "Group membership selection list criteria:",
-                'picr' => 'Pick the criteria to use to build a list of '.
-                          lc($crstype).' users from which you will select ',
-                'meof' => "members of the new group.",
-                'admg' => "additional members of the group.",
-                'ifno' => "If you do not wish to add members when you first ".
-                          "create the group, there is no need to pick any criteria.",
-                'asub' => "A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified user role and section <i>changes</i> in the course.",
+                'gmem' => 'Group membership selection list criteria:',
+                'picr' => 'Pick the criteria to use to build a list of course users from which you will select members of the new group.',
+                'pica' => 'Pick the criteria to use to build a list of course users from which you will select additional members of the group.',
+                'ifno' => 'If you do not wish to add members when you first create the group, there is no need to pick any criteria.', 
                 'acty' => 'Access types',
-                'coro' => $crstype.' roles',
-                'cose' => $crstype.' sections',
+                'coro' => 'Course roles',
+                'cose' => 'Course sections',
              );
+    if ($crstype eq 'Community') {
+        $lt{'picr'} = &mt('Pick the criteria to use to build a list of community participants from which you will select ');
+        $lt{'asub'} = &mt('A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified user role and section [_1]changes[_2] in the course.','<i>','</i>');
+        $lt{'coro'} = &mt('Community roles');
+        $lt{'cose'} = &mt('Community sections');
+    } else {
+        $lt{'asub'} = &mt('A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified user role and section [_1]changes[_2] in the course.','<i>','</i>');
+    }
     my %status_types = (
                    active => &mt('Currently has access'),
                    previous => &mt('Previously had access'),
                    future => &mt('Will have future access'),
                    );
 
-    my @roles = ('st','cc','in','ta','ep','cr');
+    my @roles = ('st');
+    if ($crstype eq 'Community') {
+        push(@roles,'co');
+    } else {
+        push(@roles,'cc');
+    }
+    push (@roles,('in','ta','ep','ad','cr'));
 
     my @sections = keys(%{$sectioncount});
 
     $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'pipa'}).'
-     <b>'.$lt{'gmem'}.'</b><br />'.$lt{'picr'});
+     <b>'.$lt{'gmem'}.'</b><br />');
     if ($action eq 'create') {
-        $r->print($lt{'meof'}.'<br />'.$lt{'ifno'}.'<br />'.$lt{'asub'});
+        $r->print($lt{'picr'}.'<br />'.$lt{'ifno'}.'<br />'.$lt{'asub'});
     } else {
-        $r->print($lt{'admg'});
+        $r->print($lt{'pica'});
     }
     $r->print('
      <br />
@@ -1875,7 +2004,8 @@ sub choose_members_form {
         }
     }
     &privilege_specificity($r,$action,$specimg,$tools,$stored,$toolprivs,
-                          $fixedprivs,\@available,$formname,$gpterm,$ucgpterm);
+                          $fixedprivs,\@available,$formname,$gpterm,$ucgpterm,
+                          $functions,$crstype);
     my $newusers = &pick_new_members($r,$action,$formname,\@available,$idx,
 				     $stored,$memimg,$users,$userdata,
 				     $granularity,\%origmembers,$gpterm,
@@ -1938,10 +2068,10 @@ sub print_current_settings {
         dfac => 'Default access dates',
         ygrs => "Your group selections - ",
         tfwa => "The following settings will apply to the group:",
-        difn => 'Different collaborative tools<br />for different members:',
         stda => 'Start date:',
         enda => 'End date:',
     );
+    $lt{'difn'} = &mt('Different collaborative tools[_1]for different members:','<br />');
     my $showstart = &Apache::lonlocal::locallocaltime($startdate);
     my $showend;
     if ($enddate == 0) {
@@ -1972,43 +2102,26 @@ sub print_current_settings {
   <td valign="top">'.$description.'</td>
   <td>
 ');
+
     if (@{$available} > 0) {
-        $r->print('<b>'.&mt('Available for assignment to members:').'</b>'.
-                    '<table class="LC_group_priv"><tr>');
-        my $rowcell = int(@{$available}/2) + @{$available}%2;
+        $r->print('<b>'.&mt('Available for assignment to members:').'</b>');
+        $r->print('<ul>');
         for (my $i=0; $i<@{$available}; $i++) {
-            if (@{$available} > 3) {
-                if ($i==$rowcell) {
-                    $r->print('</tr><tr>');
-                }
-            }
-            $r->print('<td>'.$$functions{$$available[$i]}.
-		      '</td><td>&nbsp;</td>');
+            $r->print('<li>'.&mt($$functions{$$available[$i]}).'</li>');
         }
-        if ((@{$available} > 3) && (@{$available}%2)) {
-            $r->print('<td>&nbsp;</td><td>&nbsp;</td>');
-        }
-        $r->print('</tr></table><br />');
+        $r->print('</ul>');
     }
+
     if (@{$unavailable} > 0) {
-        $r->print('<b>'.&mt('Unavailable for assignment:').'</b>'.
-                    '<table class="LC_group_priv"><tr>');
-        my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2;
-        for (my $j=0; $j<@{$unavailable}; $j++) {
-            if (@{$unavailable} > 3) {
-                if ($j==$rowcell) {
-                    $r->print('</tr><tr>');
-                }
-            }
-            $r->print('<td>'.$$functions{$$unavailable[$j]}.
-		      '</td><td>&nbsp;</td>');
+        $r->print('<b>'.&mt('Unavailable for assignment:').'</b>');
+        $r->print('<ul>');
+        for (my $i=0; $i<@{$unavailable}; $i++) {
+            $r->print('<li>'.&mt($$functions{$$unavailable[$i]}).'</li>');
         }
-        if ((@{$unavailable} > 3) && (@{$unavailable}%2)) {
-            $r->print('<td>&nbsp;</td><td>&nbsp;</td>');
-        }
-        $r->print('</tr></table>');
+        $r->print('</ul>');
     }
-    my $quota_text=&mt('[_1] Mb',$quota);
+
+    my $quota_text=&mt('[_1] MB',$quota);
     my $granu_text=&mt($granularity);
     $r->print(<<"END");
   </td>
@@ -2070,7 +2183,7 @@ sub pick_new_members {
         &check_uncheck_buttons($r,$formname,'member',$lt{'addm'});
         if (@{$available} > 0 && $granularity eq 'Yes') {
             $r->print('<td>
-     <fieldset><legend><b>'.$lt{'setf'}.'</b></legend>
+     <fieldset><legend>'.$lt{'setf'}.'</legend>
       <span class="LC_nobreak">
       <input type="button" value="'.&mt('check all').'"
         onclick="javascript:checkAllTools(document.'.$formname.')" />
@@ -2169,7 +2282,7 @@ sub pick_new_members {
 
 sub privilege_specificity {
     my ($r,$action,$img,$tools,$stored,$toolprivs,$fixedprivs,$available,
-	$formname,$gpterm,$ucgpterm,$functions) = @_;
+	$formname,$gpterm,$ucgpterm,$functions,$crstype) = @_;
     my %lt = &Apache::lonlocal::texthash (
       'uprv' => 'User privileges for collaborative tools',
       'frty' => 'For each collaborative tool you have chosen to include, '.
@@ -2198,11 +2311,15 @@ sub privilege_specificity {
                 "for users who receive specific sections/roles in the course ",
       'asyo' => "As you have chosen not to include any collaborative tools ".
                 "in the group, no default optional privileges need to be set.",
-      'plin' => 'Indicate which <b>optional</b> privileges members '.
                 'will receive by default for a specific tool.',
       'oppr' => 'Optional privileges',
       'defp' => 'The default privileges new members will receive are:', 
     );
+    $lt{'plin'} = &mt('Indicate which [_1]optional[_2] privileges members '.
+                      'will receive by default for a specific tool.','<b>','</b>');
+    if ($crstype eq 'Community') {
+        $lt{'thes'} = &mt('These will be the privileges given to members assigned in the future via automatic group assignment for users who receive specific sections/roles in the community '); 
+    }
     my $totaloptionalprivs = 0;
     foreach my $tool (@{$tools}) {
         foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
@@ -2301,9 +2418,9 @@ sub default_privileges {
 	      &Apache::lonhtmlcommon::row_title($lt{'func'},undef,
      						'LC_groups_functionality'));
     my @tableHeader;
-    foreach my $key (sort(keys(%{$functions}))){
-        push (@tableHeader,&mt(${$functions}{$key}));
-    }   
+    if ((ref($functions) eq 'HASH') && (ref($tools) eq 'ARRAY')) {
+        @tableHeader = map { $functions->{$_}; } @{$tools};
+    }
  $r->print(join('</td><td class="LC_groups_functionality">', @tableHeader));
     $r->print(&Apache::lonhtmlcommon::row_closure(1));
     my $fixed = '';
@@ -2483,6 +2600,7 @@ sub current_membership {
                                           'actn' => 'Action?',
                                           'name' => 'Name',
                                           'usnm' => 'Username',
+                                          'stid' => 'ID',
                                           'doma' => 'Domain',
                                           'stda' => 'Start Date',
                                           'enda' => 'End Date',
@@ -2520,7 +2638,7 @@ sub current_membership {
                 $r->print('
      <td>
       <span class="LC_nobreak">
-       <fieldset><legend><b>'.$lt{'curf'}.'</b></legend>
+       <fieldset><legend>'.$lt{'curf'}.'</legend>
        <input type="button" value="'.&mt('check all').'"
        onclick="javascript:checkAllTools(document.'.$formname.')" />
        &nbsp;&nbsp;
@@ -2544,7 +2662,7 @@ END
      <th><a href="javascript:changeSort('fullname')">$lt{'name'}</a></th>
      <th><a href="javascript:changeSort('username')">$lt{'usnm'}</a></th>
      <th><a href="javascript:changeSort('domain')">$lt{'doma'}</a></th>
-     <th><a href="javascript:changeSort('id')">ID</a></th>
+     <th><a href="javascript:changeSort('id')">$lt{'ID'}</a></th>
      <th><a href="javascript:changeSort('start')">$lt{'stda'}</a></th>
      <th><a href="javascript:changeSort('end')">$lt{'enda'}</a></th>
 END
@@ -2668,7 +2786,10 @@ END
         }
         $r->print(&Apache::loncommon::end_data_table());
     } else {
-        $r->print(&mt('There are no active, future or previous group members to modify.'));
+        $r->print(
+            '<p class="LC_info">'
+           .&mt('There are no active, future or previous group members to modify.')
+           .'</p>');
     }
     return $numcurrent;
 }
@@ -2678,7 +2799,7 @@ sub check_uncheck_buttons {
     $r->print('
      <td '.$colspan.'>
        <fieldset>
-       <legend><b>'.$title.'</b></legend>
+       <legend>'.$title.'</legend>
       <span class="LC_nobreak">
        <input type="button" value="'.&mt('check all').'"
        onclick="javascript:checkAll(document.'.$formname.'.'.$field.')" />
@@ -2736,7 +2857,7 @@ sub change_privs_form {
         }
     }
     if (!$exp_or_del) {
-        $r->print($lt{'nome'}.'<br />');
+        $r->print('<p class="LC_info">'.$lt{'nome'}.'</p>');
     }
     
     $r->print(&Apache::lonhtmlcommon::topic_bar(4,&mt('Setting optional privileges for specific group members')));
@@ -2758,7 +2879,7 @@ sub change_privs_form {
 sub add_members_form {
     my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,$groupname,
         $description,$granularity,$quota,$sectioncount,$tools,$functions,
-        $stored,$states,$navbuttons,$gpterm,$ucgpterm)=@_; 
+        $stored,$states,$navbuttons,$gpterm,$ucgpterm,$crstype)=@_;
     $r->print(' <br />');
     my @available = ();
     my @unavailable = ();
@@ -2767,7 +2888,7 @@ sub add_members_form {
 			    $groupname,$description,$granularity,$quota,
 			    \@available,\@unavailable,$gpterm,$ucgpterm);
     &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,1,$gpterm,
-                        $ucgpterm);
+                        $ucgpterm,$crstype);
     my $nexttext = $$navbuttons{'gtns'};
     my $prevtext = $$navbuttons{'gtpp'};
     &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
@@ -2962,9 +3083,8 @@ sub member_privileges_form {
                     foreach my $tool (@{$tools}) {
                         if (@{$showboxes{$tool}} > 0) {
                             $r->print('<td valign="top">');
-                            $r->print('<table class="thinborder"><tr>'.
-				      '<th colspan="'.$colspan.'">'.
-                                      &mt($tool).'</th></tr><tr>');
+                            $r->print('<fieldset><legend>'.&mt($tool).'</legend>');
+                            $r->print('<table><tr>');
                             my $privcount = 0;
                             foreach my $priv (@{$showboxes{$tool}}) {
                                 $privcount ++;
@@ -2979,7 +3099,7 @@ sub member_privileges_form {
                                     $r->print('<td>');
                                 }
                                 $r->print(
- '<fieldset><legend><b>'.&mt($$toolprivs{$tool}{$priv}).'</b></legend>'
+ '<fieldset><legend>'.&mt($$toolprivs{$tool}{$priv}).'</legend>'
 .'<span class="LC_nobreak">'
 .' <input type="button" value="'.&mt('check all').'"'
 .' onclick="javascript:checkAll(document.'.$formname.'.userpriv_'.$priv.')" />'
@@ -2999,7 +3119,7 @@ sub member_privileges_form {
                                     }
                                 }
                             }
-                            $r->print('</tr></table></td><td>&nbsp;</td>');
+                            $r->print('</tr></table></fieldset></td><td>&nbsp;</td>');
                         }
                     }
                     $r->print('</tr></table>');
@@ -3099,7 +3219,7 @@ sub process_request {
         &process_membership($r,$cdom,$cnum,$action,$state,$groupname,$tools,
                             $enddate,$startdate,$userdata,$idx,$toolprivs,
                             $usertools,$specificity,\@defprivs,$memchg,$gpterm,
-                            $ucgpterm);
+                            $ucgpterm,$crstype);
     }
     return;
 }
@@ -3132,16 +3252,16 @@ sub write_group_data {
     if ($quota !~ /^\d*\.?\d*$/) {
         $quota = 0;
         $r->print('<div class="LC_warning">'
-                 .&mt('The value you entered for the quota for the file repository in this '.$gpterm
-                 .' contained invalid characters, so it has been set to 0 Mb. You can change this by'
+                 .&mt('The value you entered for the quota for the group portfolio in this '.$gpterm
+                 .' contained invalid characters, so it has been set to 0 MB. You can change this by'
                  .' modifying the '.$gpterm.' settings.')
                  .'</div>');
     }
     if ($quota > $maxposs) {
         $quota = $maxposs;
         $r->print('<div class="LC_warning">'
-                 .&mt('The value you entered for the quota for the file repository in this '.$gpterm
-                 .' exceeded the maximum possible value, so it has been set to [_1] Mb '
+                 .&mt('The value you entered for the quota for the group portfolio in this '.$gpterm
+                 .' exceeded the maximum possible value, so it has been set to [_1] MB '
                  .'(the maximum possible value).',sprintf("%.2f",$maxposs))
                  .'</div>');
     }
@@ -3209,15 +3329,15 @@ sub write_group_data {
                                            $description,$tools,\%groupinfo,
                                            $gpterm,$ucgpterm,$crstype);
             if ($result eq 'ok') {
-                $r->print('<div class="LC_success">'
-                         .&mt($ucgpterm.' [_1] was created.','<i>'.$groupname.'</i>')
-                         .'</div>');
+                my $msg = &Apache::lonhtmlcommon::confirm_success(&mt($ucgpterm.' [_1] was created.','<i>'.$groupname.'</i>'));
+                $msg = &Apache::loncommon::confirmwrapper($msg);
+                $r->print($msg);
             } else {
-                $r->print('<div class="LC_error">'
-                         .&mt('A problem occurred when creating folders for the new '.$gpterm.' [_1]:'
-                             ,'<i>'.$groupname.'</i>')
-                         .'<br />'.$result
-                         .'</div>');
+                my $msg = &Apache::lonhtmlcommon::confirm_success(&mt('A problem occurred when creating folders for the new '.$gpterm.' [_1]:'
+                                                                     ,'<i>'.$groupname.'</i>')
+                                                                     .'<br />'.$result,1);
+                $msg = &Apache::loncommon::confirmwrapper($msg);
+                $r->print($msg);
             }
         } elsif ($action eq 'modify') {
             my (@oldtools,@newtools); 
@@ -3261,25 +3381,36 @@ sub write_group_data {
                                 }
                                 undef($navmap);
                             } else {
-                                $error = &mt('An error occurred while setting parameters '.
+                                if ($crstype eq 'Community') {
+                                    $error = &mt("An error occurred while setting parameters '.
+                                             'for Discussion Boards folder: '.
+                                             'Could not retrieve community information");
+                                } else {
+                                    $error = &mt("An error occurred while setting parameters '.
                                              'for Discussion Boards folder: '.
-                                             'Could not retrieve course information' );
+                                             'Could not retrieve course information");
+                                }
                             }
                         } else {
                             $r->print($outcome);
                         }
                     }
                 } else {
-                    $error = &mt("An error occurred while retrieving the contents of the group's folder.").'<br />'.
-                             &mt('You need to re-initialize the course.');
+                    $error = &mt("An error occurred while retrieving the contents of the group's folder.").'<br />';
+                    if ($crstype eq 'Community') {
+                        $error .= &mt("You need to re-initialize the community.");
+
+                    } else {
+                        $error .= &mt("You need to re-initialize the course.");
+                    }
                 }
                 if ($error ne '') {
                     $r->print('<div class="LC_error">'.$error.'</div>');
                 }
             }
-            $r->print('<div class="LC_success">'
-                     .&mt($ucgpterm.' [_1] was updated.','<i>'.$groupname.'</i>')
-                     .'</div>');
+            my $message = &Apache::lonhtmlcommon::confirm_success(&mt($ucgpterm.' [_1] was updated.','<i>'.$groupname.'</i>'));
+            $message = &Apache::loncommon::confirmwrapper($message);
+            $r->print($message);
         }
     } else {
         my %actiontype = (
@@ -3289,10 +3420,10 @@ sub write_group_data {
         &Apache::lonnet::logthis("Failed to store $gpterm $groupname ".
                                  'in '.lc($crstype).': '.$cnum.
                                  ' in domain: '.$cdom);
-        $r->print('<div class="LC_error">'
-                 .&mt('An error occurred when [_1] the '.$gpterm.'. '
-                 .'Please try again.',$actiontype{$action})
-                 .'</div>');
+        $r->print('<p class="LC_error">'
+                 .&mt('An error occurred when '.$actiontype{$action}.' the '.$gpterm.'. '
+                 .'Please try again.')
+                 .'</p');
     }
     return $result;
 }
@@ -3300,7 +3431,7 @@ sub write_group_data {
 sub process_membership {
     my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate,
         $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg,
-        $gpterm,$ucgpterm)=@_;
+        $gpterm,$ucgpterm,$crstype)=@_;
     my %usersettings = ();
     my %added= ();
     my %failed = ();
@@ -3423,7 +3554,7 @@ sub process_membership {
                 if (grep/^$user$/,@reenable) {
                     $start = $startdate;
                     $end = $enddate;
-                    $type = 'reenabled';
+                    $type = 're-enabled';
                 }
             }
             if ($type eq '') {
@@ -3457,12 +3588,14 @@ sub process_membership {
     my $roster_result = &Apache::lonnet::modify_coursegroup_membership($cdom,
                                                        $cnum,\%usersettings);
     if ($num_ok) {
-        foreach my $type (sort(keys(%added))) { 
-            $r->print(&mt('The following users were successfully [_1]',$type));
+        my $msgall ='';
+        foreach my $type (sort(keys(%added))) {
+            my $message;
+            my $tmsg = "The following users were successfully $type"; 
             if (!($type eq 'deleted' || $type eq 'expired')) {   
-                $r->print(&mt(' with the following privileges'));
+                $tmsg .= ' with the following privileges';
             }
-            $r->print(':<br />');
+            $message .= &mt($tmsg.':').'<br/>';
             foreach my $user (@{$added{$type}}) {
                 my $privlist = '';
                 if (!($type eq 'deleted' ||  $type eq 'expired')) {
@@ -3478,10 +3611,14 @@ sub process_membership {
                     }
                     $privlist =~ s/, $//;
                 }
-                $r->print($$userdata{$user}[$$idx{fullname}].'&nbsp;-&nbsp;'.$user.$privlist.'<br />');
+                $message .= $$userdata{$user}[$$idx{fullname}].'&nbsp;-&nbsp;'.$user.$privlist.'<br />';
             }
-            $r->print('<br />');
+            $message .= '<br/>';
+            $message = &Apache::lonhtmlcommon::confirm_success($message);
+            $msgall .= $message;
         }
+        $msgall = &Apache::loncommon::confirmwrapper($msgall);
+        $r->print($msgall);
     }
     if ($num_fail) {
         foreach my $type (sort(keys(%failed))) {
@@ -3494,24 +3631,33 @@ sub process_membership {
         }
         $r->print('<br />');
     }
-    if (@unchanged > 0) {
-        $r->print(&mt('No change occurred for the following users:').'<br />');
-        foreach my $user (sort(@unchanged)) {
-            $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />');
-        }
-        $r->print('<br />');
-    }
+# Is that really needed?
+#
+#    if (@unchanged > 0) {
+#        $r->print(&mt('No change occurred for the following users:').'<br />');
+#        foreach my $user (sort(@unchanged)) {
+#            $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />');
+#        }
+#        $r->print('<br />');
+#    }
     if ($roster_result eq 'ok') {
         $r->print('<div class="LC_success">'
                  .&mt($ucgpterm.' membership list updated.')
                  .'</div>');
-	$r->print('<p class="LC_info">'
-                 .&mt('Any currently logged in course users affected by the changes you made'
+	$r->print('<p class="LC_info">');
+        if ($crstype eq 'Community') {
+            $r->print(&mt("Any currently logged in community users affected by the changes you made"
                      .' to group membership or privileges for the [_1] group will need to log out'
                      .' and log back in for their LON-CAPA sessions to reflect these changes.'
-                     ,'<i>'.$groupname.'</i>')
-                 .'</p>'
-        );
+                     ,'<i>'.$groupname.'</i>'));
+
+        } else {  
+            $r->print(&mt("Any currently logged in course users affected by the changes you made"
+                     .' to group membership or privileges for the [_1] group will need to log out'
+                     .' and log back in for their LON-CAPA sessions to reflect these changes.'
+                     ,'<i>'.$groupname.'</i>'));
+        } 
+        $r->print('</p>');
     } else {
         $r->print('<div class="LC_error">'
                  .&mt("An error occurred while updating the $gpterm membership list:")
@@ -3582,7 +3728,7 @@ sub mapping_settings {
         @sections = ('all','none');
     }
     $r->print(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'pirs'}));
-    my @roles = &standard_roles();
+    my @roles = &standard_roles($crstype);
     my %customroles = &Apache::lonhtmlcommon::course_custom_roles($cdom,$cnum);
     $r->print(&Apache::loncommon::start_data_table().
 	      &Apache::loncommon::start_data_table_header_row());
@@ -3625,10 +3771,10 @@ sub print_autorole_item {
     my ($role,$roletitle,$sections) = @_;
     my $sections_sel;
     if (@{$sections} > 0) {
-        if ($role eq 'cc') {
+        if (($role eq 'cc') || ($role eq 'co')) {
             $sections_sel = '<td align="right">'.
                             &mt('all sections').'<input type="hidden" '.
-                            'name="sec_cc" value="all" /></td>';
+                            'name="sec_'.$role.'" value="all" /></td>';
         } else {
             $sections_sel='<td align="right">'.
                           &sections_selection($sections,'sec_'.$role).
@@ -3644,43 +3790,45 @@ sub print_autorole_item {
 } 
 
 sub standard_roles {
-    my @roles = ('cc','in','ta','ep','st');
+    my ($crstype) = @_;
+    my @roles = qw(in ta ep ad st);
+    if ($crstype eq 'Community') {
+        unshift(@roles,'co');
+    } else {
+        unshift(@roles,'cc');
+    }
     return @roles;
 }
 
 sub modify_menu {
     my ($r,$groupname,$page,$gpterm) = @_;
     my @menu =
-        (
-          { text => "Modify default $gpterm settings",
-            help => 'Course_Modify_Group',
-            state => 'change_settings',
-            branch => 'settings',
+        ( { categorytitle =>'Group Actions',
+	items => [
+
+          { linktext => "Modify default $gpterm settings",
+            url => '/adm/coursegroups?action=modify&amp;refpage='.$env{'form.refpage'}.'&amp;groupname='.$groupname.'&amp;state=change_settings&amp;branch=settings',
+            icon => 'grp_settings.png',
+            alttext => "Modify default $gpterm settings",
+            permission => '1',
+            help => 'Course_Modify_Group',            
             },
-          { text => 'Modify access, tools and/or privileges for previous, '.
-                    'future, or current members',
+          { linktext => 'Modify access, tools and privileges for members',
+            url => '/adm/coursegroups?action=modify&amp;refpage='.$env{'form.refpage'}.'&amp;groupname='.$groupname.'&amp;state=change_members&amp;branch=members',
+            icon => 'grp_tools.png',
+            alttext => 'Modify access, tools and privileges for members',
+            permission => '1',
             help => 'Course_Modify_Group_Membership',
-            state => 'change_members',
-            branch => 'members',
             },
-          { text => "Add member(s) to the $gpterm",
+          { linktext => "Add member(s) to the $gpterm",
+            url => '/adm/coursegroups?action=modify&amp;refpage='.$env{'form.refpage'}.'&amp;groupname='.$groupname.'&amp;state=add_members&amp;branch=adds',
+            icon => 'grp_add.png',
+            alttext =>  "Add member(s) to the $gpterm",
+            permission => '1',
             help => 'Course_Group_Add_Members',
-            state => 'add_members',
-            branch => 'adds',
-            },
-          );
-    my $menu_html = '';
-    foreach my $menu_item (@menu) {
-        $menu_html .=
-        '<p><font size="+1"><a href="/adm/coursegroups?action=modify&refpage='.$env{'form.refpage'}.'&groupname='.$groupname.'&state='.$menu_item->{'state'}.'&branch='.$menu_item->{'branch'}.'">';
-        $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
-        if (exists($menu_item->{'help'})) {
-            $menu_html.=
-                &Apache::loncommon::help_open_topic($menu_item->{'help'});
-        }
-        $menu_html.='</p>'.$/;
-    }
-    $r->print($menu_html);
+            }]}
+          );   
+    $r->print(&Apache::lonhtmlcommon::generate_menu(@menu));
     return;
 }
 
@@ -3763,17 +3911,19 @@ sub date_setting_table {
                                                       'startdate',$starttime);
     my $endform = &Apache::lonhtmlcommon::date_setter($formname,
                                                       'enddate',$endtime);
-    my $perpetual = 
-	'<span class="LC_nobreak"><label><input type="checkbox" name="no_end_date" />'.
-	&mt('None').'</label></span>';
-    my $table = "<table class=\"LC_descriptive_input\">\n".
-	'<tr><td class="LC_description">'.&mt('Start:').'</td>'.
-        '<td>'.$startform.'</td>'.
-        '<td>&nbsp;</td>'."</tr>\n".
-	'<tr><td class="LC_description">'.&mt('End:').'</td>'.
-        '<td>'.$endform.'</td>'.
-        '<td>'.$perpetual.'</td>'."</tr>\n".
-	"</table>\n";
+    my $perpetual = ' <span class="LC_nobreak"><label>'
+                   .'<input type="checkbox" name="no_end_date" />'
+                   .&mt('No end date')
+                   .'</label></span>';
+    my $table = &Apache::lonhtmlcommon::start_pick_box()
+               .&Apache::lonhtmlcommon::row_title(&mt('Start Date'))
+               .$startform
+               .&Apache::lonhtmlcommon::row_closure()
+               .&Apache::lonhtmlcommon::row_title(&mt('End Date'))
+               .$endform
+               .$perpetual
+               .&Apache::lonhtmlcommon::row_closure(1)
+               .&Apache::lonhtmlcommon::end_pick_box();
     return $table;
 }
 
@@ -3781,9 +3931,14 @@ sub add_group_folder {
     my ($cdom,$cnum,$now,$groupname,$action,$description,$tools,$groupinfo,
         $gpterm,$ucgpterm,$crstype) = @_;
     if ($cdom eq '' || $cnum eq '') {
-        return '<span class="LC_error">'
-              .&mt('Error: invalid course domain or number - group folder creation failed.')
-              .'</span>';
+        my $error = '<span class="LC_error">';
+        if ($crstype eq 'Community') { 
+            $error .= &mt("Error: invalid community domain or number - group folder creation failed.");
+        } else {
+            $error .= &mt("Error: invalid course domain or number - group folder creation failed.");
+        }
+        $error .= '</span>';
+        return $error;
     }
     my ($outcome,$allgrpsmap,$grpmap,$boardsmap,$grppage,$warning);
     my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
@@ -3851,8 +4006,16 @@ sub add_group_folder {
     my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
     my $navmap = Apache::lonnavmaps::navmap->new();
     if (!defined($navmap)) {
-        return $warning.'<span class="LC_error">'.&mt('Error retrieving course contents').
-               ' '.&mt('You need to re-initialize the course.').'</span>';
+        $warning .= '<span class="LC_error">';
+        if ($crstype eq 'Community') {
+            $warning .= &mt("Error retrieving community contents").
+                        ' '.&mt("You need to re-initialize the community.");
+        } else {
+            $warning  .= &mt("Error retrieving course contents").
+                         ' '.&mt("You need to re-initialize the course.");
+        }
+        $warning .= '</span>';
+        return $warning;
     }
     # modify parameters
     my $parm_result;
@@ -3933,7 +4096,7 @@ sub map_updater {
         $LONCAPA::map::resources[$newidx] = $itemtitle.':'.$newmapurl.
                                                  ':false:normal:res';
         $LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
-        my ($outtext,$errtext) = &LONCAPA::map::storemap($parentmap,1);
+        my ($outtext,$errtext) = &LONCAPA::map::storemap($parentmap,1,1);
         if ($errtext) {
             $outcome = '<div class="LC_error">'
                       .&mt('Error saving updated parent folder.')." ($parentmap):  $errtext"
@@ -3957,14 +4120,18 @@ sub new_map {
 }
 
 sub parm_setter {
-    my ($navmap,$cdom,$url,$groupname) = @_;
-    my $allresults;
+    my ($navmap,$cdom,$url,$groupname,$crstype) = @_;
     if (!defined($navmap)) {
-        $allresults = '<div class="LC_warning">'.
-                      &mt('Parameters not set for [_1] because the contents of the course could not be retrieved.',$url).' '.
-                      &mt('You need to reinitialize the course.').
-                      '</div>';
-        return $allresults;
+        my $allresults;
+        if ($crstype eq 'Community') { 
+            $allresults = &mt("Parameters not set for [_1] because the contents of the community could not be retrieved.",$url).' '.
+                          &mt("You need to reinitialize the community.");
+        } else {
+            $allresults = &mt("Parameters not set for [_1] because the contents of the course could not be retrieved.",$url).' '.
+                          &mt("You need to reinitialize the course.");
+
+        }
+        return '<div class="LC_warning">'.$allresults.'</div>';
     }
     my %hide_settings = (
                            'course' =>  {
@@ -3978,6 +4145,7 @@ sub parm_setter {
                                         },
                         );
     my $res = $navmap->getResourceByUrl($url);
+    my $allresults;
     if ($res) {
         my $symb = $res->symb();
         foreach my $level (keys(%hide_settings)) {
@@ -3994,10 +4162,13 @@ sub parm_setter {
             }
         }
     } else {
-        $allresults = '<div class="LC_warning">' 
-                     .&mt('Parameters not set for [_1] because the resource was not recognized'
-                         .' as part of the course.','<tt>'.$url.'</tt>')
-                     .'</div>';
+        $allresults = '<div class="LC_warning">';
+        if ($crstype eq 'Community') {
+            $allresults .= &mt("Parameters not set for [_1] because the resource was not recognized as part of the community.",'<tt>'.$url.'</tt>');
+        } else {
+            $allresults .= &mt('Parameters not set for [_1] because the resource was not recognized as part of the course.','<tt>'.$url.'</tt>');
+        }
+        $allresults .= '</div>';
     }
     return $allresults;
 }
@@ -4006,10 +4177,9 @@ sub create_homepage {
     my ($cdom,$cnum,$name,$groupinfo,$tools,$gpterm,$ucgpterm,$now) = @_;
     my $functionality = join(',',@{$tools});
     my $content = &unescape($$groupinfo{description});
-    $content=~s/\s+$//s;
-    $content=~s/^\s+//s;
-    $content=~s/\<br\s*\/*\>$//s;
-    $content=&Apache::lonfeedback::clear_out_html($content,1);
+    chomp($content);
+    my $gateway = Apache::lonhtmlgateway->new();
+    $content = $gateway->process_incoming_html($content,1);
 
     my %pageinfo = (
                      'aaa_title' => "$ucgpterm: $name",
@@ -4069,43 +4239,40 @@ sub validate_groupname {
     }
     my %lt = &Apache::lonlocal::texthash (
                       igna => "Invalid $gpterm name",
-                      tgne => "The $gpterm name entered ",
                       grna => "$ucgpterm names and section names used in a ".
                                "$crstype must be unique.",
-                      isno => "is not a valid name.",
                       gnmo => "$ucgpterm names may only contain letters, ". 
                               "numbers or underscores.",
-                      cnnb => "can not be used as it is the name of ",
-                      inth => " in this $crstype", 
-                      thgr => "- does not correspond to the name of an ".
-                              "existing $gpterm",    
     );
 
-    my $exitmsg = '<span class="LC_error">'.$lt{'igna'}.'</span><br /><br />'.
-	$lt{'tgne'}.' "'.$groupname.'" ';
-    my $dupmsg = $lt{'grna'};
-    my $earlyout;
+    my $exitmsg = '<span class="LC_error">'.$lt{'igna'}.'</span><br /><br />';
+    my $nameshown = &Apache::loncommon::cleanup_html($groupname);
     if (($groupname eq '') || ($groupname =~ /\W/)) {
-        $earlyout = $exitmsg.$lt{'isno'}.'<br />'.$lt{'gnmo'};
-        return $earlyout;
+        return $exitmsg.
+               &mt("The $gpterm name entered '[_1]' is not a valid name.",$nameshown).
+               '<br />'.$lt{'gnmo'};
+    } elsif ($groupname eq 'syllabus') {
+        return $exitmsg.
+               &mt("The $gpterm name entered '[_1]' is reserved for use by LON-CAPA.",$nameshown);
     }
     if (exists($sectioncount{$groupname})) {
-	return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}.
-	    '<br />'.$lt{'grna'};
+	return  $exitmsg.
+                &mt("The $gpterm name entered '[_1]' can not be used as it is the name of a section in this $crstype.",$nameshown).
+	        '<br />'.$lt{'grna'};
     }
     if ($action eq 'create') { 
 	if (exists($curr_groups{$groupname})) {
-	    return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm).
-	           $lt{'inth'}.'.<br />'.$lt{'grna'};
+	    return $exitmsg.
+                   &mt("The $gpterm name entered '[_1]' can not be used as it is the name of an existing $gpterm in this $crstype.",$nameshown).
+                  '<br />'.$lt{'grna'};
         } elsif (exists($deleted_groups{$groupname})) {
-            return $exitmsg.$lt{'cnnb'}.&mt('a [_1] which previously existed',$gpterm).
-                   $lt{'inth'}.'.<br />'.$lt{'grna'};
+            return $exitmsg.
+                   &mt("The $gpterm name entered '[_1]' can not be used as it is the name of a $gpterm which previously existed in this $crstype.",$nameshown).
+                   '<br />'.$lt{'grna'};
         }
     } elsif ($action eq 'modify') {
         unless(exists($curr_groups{$groupname})) {
-            $earlyout = &mt('[_1] name:',$ucgpterm).' '.$groupname.$lt{'thgr'}.
-                        $lt{'inth'};
-            return $earlyout;
+            return &mt("$ucgpterm name: [_1] does not correspond to the name of an existing $gpterm in this $crstype.",$nameshown);
         }
     }
     return;
@@ -4150,3 +4317,4 @@ sub check_changes {
 }
 
 1;
+