--- loncom/interface/loncreateuser.pm	2004/01/01 02:16:29	1.75
+++ loncom/interface/loncreateuser.pm	2004/11/23 18:03:04	1.88
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Create a user
 #
-# $Id: loncreateuser.pm,v 1.75 2004/01/01 02:16:29 www Exp $
+# $Id: loncreateuser.pm,v 1.88 2004/11/23 18:03:04 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -123,8 +123,7 @@ sub print_username_entry_form {
     my $defdom=$ENV{'request.role.domain'};
     my @domains = &Apache::loncommon::get_domains();
     my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');
-    my $bodytag =&Apache::loncommon::bodytag(
-                                  'Create Users, Change User Privileges');
+    my $bodytag =&Apache::loncommon::bodytag('Create Users, Change User Privileges').&Apache::loncommon::help_open_menu('',undef,undef,'',282,'Instructor Interface');
     my $selscript=&Apache::loncommon::studentbrowser_javascript();
     my $sellink=&Apache::loncommon::selectstudent_link
                                         ('crtuser','ccuname','ccdomain');
@@ -140,6 +139,8 @@ sub print_username_entry_form {
                     'nr'   => "Name of Role",
                     'cre'  => "Custom Role Editor"
 				       );
+    my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');
+    my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');
     $r->print(<<"ENDDOCUMENT");
 <html>
 <head>
@@ -149,7 +150,7 @@ $selscript
 $bodytag
 <form action="/adm/createuser" method="post" name="crtuser">
 <input type="hidden" name="phase" value="get_user_info">
-<h2>$lt{siur}</h2>
+<h2>$lt{siur}$helpsiur</h2>
 <table>
 <tr><td>$lt{usr}:</td><td><input type="text" size="15" name="ccuname">
 </td><td rowspan="2">$sellink</td></tr><tr><td>
@@ -159,7 +160,7 @@ $lt{'dom'}:</td><td>$domform</td></tr>
 </form>
 <form action="/adm/createuser" method="post" name="docustom">
 <input type="hidden" name="phase" value="selected_custom_edit">
-<h2>$lt{'ecrp'}</h2>
+<h2>$lt{'ecrp'}$helpecpr</h2>
 $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />
 <input name="customeditor" type="submit" value="$lt{'cre'}" />
 </body>
@@ -173,8 +174,8 @@ sub print_user_modification_page {
     my $ccuname=$ENV{'form.ccuname'};
     my $ccdomain=$ENV{'form.ccdomain'};
 
-    $ccuname=~s/\W//gs;
-    $ccdomain=~s/\W//gs;
+    $ccuname=~s/[\W|_]//gs;
+    $ccdomain=~s/[\W|_]//gs;
 
     unless (($ccuname) && ($ccdomain)) {
 	&print_username_entry_form($r);
@@ -196,6 +197,79 @@ sub print_user_modification_page {
     $ccuname=~s/\W//g;
     $ccdomain=~s/\W//g;
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
+    my $dc_setcourse_code = '';
+    my $loaditem;
+    if ($ENV{'request.role'} =~ m-^dc\./(\w+)/$-) {
+        my $dcdom = $1;
+        $loaditem = qq|OnLoad="document.cu.coursedesc.value=''"|;
+        $dc_setcourse_code = <<"ENDSCRIPT";
+    function setCourse() {
+        var course = document.cu.dccourse.value;
+        if (course != "") {
+            if (document.cu.dcdomain.value != document.cu.origdom.value) {
+                alert("You must select a course in the current domain");
+                return;
+            } 
+            var userrole = document.cu.role.options[document.cu.role.selectedIndex].value
+            var section;
+            var numsections = 0;
+            if (document.cu.role.value != "cc") {
+                for (var i=0; i<document.cu.currsec.length; i++) {
+                    if (document.cu.currsec.options[i].selected == true ) {
+                        if (document.cu.currsec.options[i].value != "") { 
+                            if (numsections == 0) {
+                                if (document.cu.currsec.options[i].value != "") {
+                                    section = document.cu.currsec.options[i].value
+                                    numsections = 1;
+                                }
+                            }
+                            else {
+                                section = section + "," +  document.cu.currsec.options[i].value
+                                numsections ++;
+                            }
+                        }
+                    }
+                }
+                if (document.cu.newsec.value != "") {
+                    if (numsections == 0) {
+                        if (document.cu.newsec.value != "") {
+                            section = document.cu.newsec.value
+                            numsections = 1;
+                        }
+                    }
+                    else {
+                        section = section + "," +  document.cu.newsec.value
+                        numsections ++;
+                    }
+                }
+            }
+            var numcourse = getIndex(document.cu.dccourse);
+            if (numcourse == "-1") {
+                alert("There was a problem with your course selection");
+                return
+            }
+            else { 
+                var coursename = "_$dcdom"+"_"+course+"_"+userrole
+                document.cu.elements[numcourse].name = "act"+coursename
+                document.cu.elements[numcourse+4].name = "sec"+coursename
+                document.cu.elements[numcourse+4].value = section
+                document.cu.elements[numcourse+5].name = "start"+coursename
+                document.cu.elements[numcourse+6].name = "end"+coursename
+            }
+        }
+        document.cu.submit();
+    }
+
+    function getIndex(caller) {
+        for (var i=0;i<document.cu.elements.length;i++) {
+            if (document.cu.elements[i] == caller) {
+                return i;
+            }
+        }
+        return -1;
+    }
+ENDSCRIPT
+    }
     my $dochead =<<"ENDDOCHEAD";
 <html>
 <head>
@@ -209,6 +283,7 @@ sub print_user_modification_page {
     }
 
     $pjump_def
+    $dc_setcourse_code
 
     function dateset() {
         eval("document.cu."+document.cu.pres_marker.value+
@@ -220,7 +295,7 @@ sub print_user_modification_page {
 </head>
 ENDDOCHEAD
     $r->print(&Apache::loncommon::bodytag(
-                                     'Create Users, Change User Privileges'));
+                                     'Create Users, Change User Privileges',undef,$loaditem));
     my $forminfo =<<"ENDFORMINFO";
 <form action="/adm/createuser" method="post" name="cu">
 <input type="hidden" name="phase"       value="update_user_data">
@@ -246,7 +321,7 @@ ENDFORMINFO
             '<option value="default" selected>default</option>'."\n".
                 &Apache::loncommon::home_server_option_list($ccdomain);
         
-    my %lt=&Apache::lonlocal::texthash(
+	my %lt=&Apache::lonlocal::texthash(
                     'cnu'  => "Create New User",
                     'nu'   => "New User",
                     'id'   => "in domain",
@@ -259,6 +334,7 @@ ENDFORMINFO
                     'hs'   => "Home Server",
                     'lg'   => "Login Data"
 				       );
+	my $genhelp=&Apache::loncommon::help_open_topic('Generation');
 	$r->print(<<ENDNEWUSER);
 $dochead
 <h1>$lt{'cnu'}</h1>
@@ -277,7 +353,7 @@ $loginscript
     <td><input type='text' name='cmiddle' size='15' /></td></tr>
 <tr><td>$lt{'ln'}   </td>
     <td><input type='text' name='clast'   size='15' /></td></tr>
-<tr><td>$lt{'gen'}  </td>
+<tr><td>$lt{'gen'}$genhelp</td>
     <td><input type='text' name='cgen'    size='5'  /></td></tr>
 </table>
 $lt{'idsn'} <input type='text' name='cstid'   size='15' /></p>
@@ -291,7 +367,7 @@ $lt{'hs'}: <select name="hserver" size="
 <p>$authformloc </p>
 ENDNEWUSER
     } else { # user already exists
-    my %lt=&Apache::lonlocal::texthash(
+	my %lt=&Apache::lonlocal::texthash(
                     'cup'  => "Change User Privileges",
                     'usr'  => "User",                    
                     'id'   => "in domain",
@@ -340,6 +416,7 @@ END
 		    'rer'  => "Revoke Existing Roles",
                     'rev'  => "Revoke",                    
                     'del'  => "Delete",
+		    'ren'  => "Re-Enable",
                     'rol'  => "Role",
                     'ext'  => "Extent",
                     'sta'  => "Start",
@@ -348,14 +425,16 @@ END
            $r->print(<<END);
 <hr />
 <h3>$lt{'rer'}</h3>
-<table border=2>
-<tr><th>$lt{'rev'}</th><th>$lt{'del'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th>
+<table>
+<tr><th>$lt{'rev'}</th><th>$lt{'ren'}</th><th>$lt{'del'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th>
 END
+           my (%roletext,%sortrole,%roleclass);
 	   foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
 				    my $b1=join('_',(split('_',$b))[1,0]);
 				    return $a1 cmp $b1;
 				} keys(%rolesdump)) {
                next if ($area =~ /^rolesdef/);
+	       my $envkey=$area;
                my $role = $rolesdump{$area};
                my $thisrole=$area;
                $area =~ s/\_\w\w$//;
@@ -367,18 +446,24 @@ END
                my $bgcol='ffffff';
                my $allowed=0;
                my $delallowed=0;
+	       my $sortkey=$role_code;
+	       my $class='Unknown';
                if ($area =~ /^\/(\w+)\/(\d\w+)/ ) {
+		   $class='Course';
                    my ($coursedom,$coursedir) = ($1,$2);
+		   $sortkey.="\0$1";
                    # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
                    my %coursedata=
                        &Apache::lonnet::coursedescription($1.'_'.$2);
 		   my $carea;
 		   if (defined($coursedata{'description'})) {
-		       $carea=&mt('Course').': '.$coursedata{'description'}.
+		       $carea=$coursedata{'description'}.
                            '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).
      &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom);
+		       $sortkey.="\0".$coursedata{'description'};
 		   } else {
 		       $carea=&mt('Unavailable course').': '.$area;
+		       $sortkey.="\0".&mt('Unavailable course').': '.$area;
 		   }
                    $inccourses{$1.'_'.$2}=1;
                    if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
@@ -402,9 +487,11 @@ END
                    $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);
                    if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) {
                        $carea.='<br>Section/Group: '.$3;
+		       $sortkey.="\0$3";
                    }
                    $area=$carea;
                } else {
+		   $sortkey.="\0".$area;
                    # Determine if current user is able to revoke privileges
                    if ($area=~ /^\/(\w+)\//) {
                        if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||
@@ -421,6 +508,13 @@ END
                            $allowed=1;
                        }
                    }
+		   if ($role_code eq 'ca' || $role_code eq 'au') {
+		       $class='Construction Space';
+		   } elsif ($role_code eq 'su') {
+		       $class='System';
+		   } else {
+		       $class='Domain';
+		   }
                }
                if ($role_code eq 'ca') {
                    $area=~/\/(\w+)\/(\w+)/;
@@ -430,6 +524,7 @@ END
                        $allowed=0;
                    }
                }
+	       $bgcol='77FF77';
                my $row = '';
                $row.='<tr bgcolor="#'.$bgcol.'"><td>';
                my $active=1;
@@ -444,6 +539,12 @@ END
 		   }
                }
 	       $row.='</td><td>';
+               if ($allowed && !$active) {
+                   $row.= '<input type="checkbox" name="ren:'.$thisrole.'">';
+               } else {
+                   $row.='&nbsp;';
+               }
+	       $row.='</td><td>';
                if ($delallowed) {
                    $row.= '<input type="checkbox" name="del:'.$thisrole.'">';
                } else {
@@ -463,8 +564,24 @@ END
                       '</td><td>'.($role_end_time  ?localtime($role_end_time)
                                                    : '&nbsp;' )
                       ."</td></tr>\n";
-               $r->print($row);
+	       $sortrole{$sortkey}=$envkey;
+	       $roletext{$envkey}=$row;
+	       $roleclass{$envkey}=$class;
+               #$r->print($row);
            } # end of foreach        (table building loop)
+	   foreach my $type ('Construction Space','Course','Domain','System','Unknown') {
+	       my $output;
+	       foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
+		   if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) { 
+		       $output.=$roletext{$sortrole{$which}};
+		   }
+	       }
+	       if (defined($output)) {
+		   $r->print("<tr bgcolor='#BBffBB'>".
+			     "<td align='center' colspan='7'>".&mt($type)."</td>");
+	       }
+	       $r->print($output);
+	   }
 	   $r->print('</table>');
         }  # End of unless
 	my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
@@ -581,7 +698,7 @@ ENDOTHERAUTHS
                     'rol'  => "Role",
                     'ext'  => "Extent",
                     'sta'  => "Start",
-                    'end'  => "End".
+                    'end'  => "End",
                     'cau'  => "Co-Author",
                     'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"
@@ -591,13 +708,13 @@ ENDOTHERAUTHS
 <table border=2><tr><th>$lt{'act'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th>
 <th>$lt{'sta'}</th><th>$lt{'end'}</th></tr>
 <tr>
-<td><input type=checkbox name="act_$cudom\_$cuname\_ca"></td>
+<td><input type=checkbox name="act_$cudom\_$cuname\_ca" /></td>
 <td>$lt{'cau'}</td>
 <td>$cudom\_$cuname</td>
-<td><input type=hidden name="start_$cudom\_$cuname\_ca" value=''>
+<td><input type=hidden name="start_$cudom\_$cuname\_ca" value='' />
 <a href=
 "javascript:pjump('date_start','Start Date Co-Author',document.cu.start_$cudom\_$cuname\_ca.value,'start_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'ssd'}</a></td>
-<td><input type=hidden name="end_$cudom\_$cuname\_ca" value=''>
+<td><input type=hidden name="end_$cudom\_$cuname\_ca" value='' />
 <a href=
 "javascript:pjump('date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'sed'}</a></td>
 </tr>
@@ -639,8 +756,14 @@ ENDDROW
 #
 # Course level
 #
-    $r->print(&course_level_table(%inccourses));
-    $r->print("<hr /><input type=submit value=\"".&mt('Modify User')."\">\n");
+
+    if ($ENV{'request.role'} =~ m-^dc\./(\w+)/$-) {
+        $r->print(&course_level_dc($1));
+        $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()">'."\n");
+    } else {
+        $r->print(&course_level_table(%inccourses));
+        $r->print("<hr /><input type=submit value=\"".&mt('Modify User')."\">\n");
+    }
     $r->print("</form></body></html>");
 }
 
@@ -756,10 +879,10 @@ ENDNEWUSERHEAD
              $ENV{'form.cmiddle'},$ENV{'form.clast'},$ENV{'form.cgen'},
              undef,$desiredhost
 	     );
-	$r->print('Generating user: '.$result);
+	$r->print(&mt('Generating user').': '.$result);
         my $home = &Apache::lonnet::homeserver($ENV{'form.ccuname'},
                                                $ENV{'form.ccdomain'});
-        $r->print('<br />'&mt('Home server').': '.$home.' '.
+        $r->print('<br />'.&mt('Home server').': '.$home.' '.
                   $Apache::lonnet::libserv{$home});
     } elsif (($ENV{'form.login'} ne 'nochange') &&
              ($ENV{'form.login'} ne ''        )) {
@@ -919,54 +1042,14 @@ END
 	                     $ENV{'course.'.$cid.'.home'}).'</b><br>');
 		}
 	    } 
-	} elsif ($_=~/^form\.act/) {
-	    if 
-($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_cr_cr_([^\_]+)_(\w+)_([^\_]+)$/) {
-                # Activate a custom role
-		my $url='/'.$1.'/'.$2;
-		my $full=$1.'_'.$2.'_cr_cr_'.$3.'_'.$4.'_'.$5;
-		if ($ENV{'form.sec_'.$full}) {
-		    $url.='/'.$ENV{'form.sec_'.$full};
-		}
-
-		my $start = ( $ENV{'form.start_'.$full} ? 
-			      $ENV{'form.start_'.$full} : 
-			      $now );
-		my $end   = ( $ENV{'form.end_'.$full} ? 
-			      $ENV{'form.end_'.$full} :
-			      0 );
-
-    $r->print(&mt('Assigning custom role').' "'.$5.'" by '.$4.'@'.$3.' in '.$url.
-                         ($start?', '.&mt('starting').' '.localtime($start):'').
-                         ($end?', ending '.localtime($end):'').': <b>'.
-	      &Apache::lonnet::assigncustomrole(
-	$ENV{'form.ccdomain'},$ENV{'form.ccuname'},$url,$3,$4,$5,$end,$start).
-	      '</b><br>');
-	    } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_([^\_]+)$/) {
-		# Activate roles for sections with 3 id numbers
-		# set start, end times, and the url for the class
-
-		my $start = ( $ENV{'form.start_'.$1.'_'.$2.'_'.$3} ? 
-			      $ENV{'form.start_'.$1.'_'.$2.'_'.$3} : 
-			      $now );
-		my $end   = ( $ENV{'form.end_'.$1.'_'.$2.'_'.$3} ? 
-			      $ENV{'form.end_'.$1.'_'.$2.'_'.$3} :
-			      0 );
-		my $url='/'.$1.'/'.$2;
-		if ($ENV{'form.sec_'.$1.'_'.$2.'_'.$3}) {
-		    $url.='/'.$ENV{'form.sec_'.$1.'_'.$2.'_'.$3};
-		}
-		# Assign the role and report it
-		$r->print(&mt('Assigning').' '.$3.' in '.$url.
-                         ($start?', '.&mt('starting').' '.localtime($start):'').
-                         ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'.
-                          &Apache::lonnet::assignrole(
-                              $ENV{'form.ccdomain'},$ENV{'form.ccuname'},
-                              $url,$3,$end,$start).
-			  '</b><br>');
-		# Handle students differently
-		if ($3 eq 'st') {
-		    $url=~/^\/(\w+)\/(\w+)/;
+	} elsif ($_=~/^form\.ren/) {
+	    if ($_=~/^form\.ren\:([^\_]+)\_([^\_]+)$/) {
+		my $result=&Apache::lonnet::assignrole($ENV{'form.ccdomain'},
+					 $ENV{'form.ccuname'},$1,$2,0,$now);
+		$r->print(&mt('Re-Enabling [_1] in [_2]: [_3]',
+			      $2,$1,$result).'<br />');
+		if ($2 eq 'st') {
+		    $1=~/^\/(\w+)\/(\w+)/;
 		    my $cid=$1.'_'.$2;
 		    $r->print(&mt('Add to classlist').': <b>'.
 			      &Apache::lonnet::critical(
@@ -975,10 +1058,68 @@ END
                                    &Apache::lonnet::escape(
                                        $ENV{'form.ccuname'}.':'.
                                        $ENV{'form.ccdomain'} ).'='.
-                                   &Apache::lonnet::escape($end.':'.$start),
+                                   &Apache::lonnet::escape(':'.$now),
 				       $ENV{'course.'.$cid.'.home'})
 			      .'</b><br>');
 		}
+	    } 
+	} elsif ($_=~/^form\.act/) {
+	    if ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_cr_cr_([^\_]+)_(\w+)_([^\_]+)$/) {
+                # Activate a custom role
+		my ($one,$two,$three,$four,$five)=($1,$2,$3,$4,$5);
+		my $url='/'.$one.'/'.$two;
+		my $full=$one.'_'.$two.'_cr_cr_'.$three.'_'.$four.'_'.$five;
+
+                my $start = ( $ENV{'form.start_'.$full} ?
+                              $ENV{'form.start_'.$full} :
+                              $now );
+                my $end   = ( $ENV{'form.end_'.$full} ?
+                              $ENV{'form.end_'.$full} :
+                              0 );
+                                                                                     
+                # split multiple sections
+                my %sections = ();
+                my $num_sections = &build_roles($ENV{'form.sec_'.$full},\%sections);
+                if ($num_sections == 0) {
+                    $r->print(&commit_customrole($url,$three,$four,$five,$start,$end));
+                } else {
+                    foreach (sort {$a cmp $b} keys %sections) {
+                        my $securl = $url.'/'.$_;
+		        $r->print(&commit_customrole($securl,$three,$four,$five,$start,$end));
+                    }
+                }
+	    } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_([^\_]+)$/) {
+		# Activate roles for sections with 3 id numbers
+		# set start, end times, and the url for the class
+		my ($one,$two,$three)=($1,$2,$3);
+		my $start = ( $ENV{'form.start_'.$one.'_'.$two.'_'.$three} ? 
+			      $ENV{'form.start_'.$one.'_'.$two.'_'.$three} : 
+			      $now );
+		my $end   = ( $ENV{'form.end_'.$one.'_'.$two.'_'.$three} ? 
+			      $ENV{'form.end_'.$one.'_'.$two.'_'.$three} :
+			      0 );
+		my $url='/'.$one.'/'.$two;
+                my $type = 'three';
+                # split multiple sections
+                my %sections = ();
+                my $num_sections = &build_roles($ENV{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections);
+                if ($num_sections == 0) {
+                    $r->print(&commit_standardrole($url,$three,$start,$end,$one,$two));
+                } else {
+                    my $emptysec = 0;
+                    foreach my $sec (sort {$a cmp $b} keys %sections) {
+                        $sec =~ s/\W//g;
+                        if ($sec ne '') {  
+                            my $securl = $url.'/'.$sec;
+                            $r->print(&commit_standardrole($securl,$three,$start,$end,$one,$two));
+                        } else {
+                            $emptysec = 1;
+                        }
+                    }
+                    if ($emptysec) {
+                        $r->print(&commit_standardrole($url,$three,$start,$end,$one,$two));
+                    }
+                } 
 	    } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {
 		# Activate roles for sections with two id numbers
 		# set start, end times, and the url for the class
@@ -989,6 +1130,25 @@ END
 			      $ENV{'form.end_'.$1.'_'.$2} :
 			      0 );
 		my $url='/'.$1.'/';
+                # split multiple sections
+                my %sections = ();
+                my $num_sections = &build_roles($ENV{'form.sec_'.$1.'_'.$2},\%sections);
+                if ($num_sections == 0) {
+                    $r->print(&commit_standardrole($url,$2,$start,$end,$1));
+                } else {
+                    my $emptysec = 0;
+                    foreach my $sec (sort {$a cmp $b} keys %sections) {
+                        if ($sec ne '') {
+                            my $securl = $url.'/'.$sec;
+                            $r->print(&commit_standardrole($securl,$2,$start,$end,$1));
+                        } else {
+                            $emptysec = 1;
+                        }
+                    }
+                    if ($emptysec) {
+                        $r->print(&commit_standardrole($url,$2,$start,$end,$1));
+                    }
+                }
 		# Assign the role and report it.
 		$r->print(&mt('Assigning').' '.$2.' in '.$url.': '.
                          ($start?', '.&mt('starting').' '.localtime($start):'').
@@ -1007,6 +1167,73 @@ END
     $r->print('</body></html>');
 }
 
+sub commit_customrole {
+    my ($url,$three,$four,$five,$end,$start) = @_;
+    my $output = &mt('Assigning custom role').' "'.$five.'" by '.$four.'@'.$three.' in '.$url.
+                         ($start?', '.&mt('starting').' '.localtime($start):'').
+                         ($end?', ending '.localtime($end):'').': <b>'.
+              &Apache::lonnet::assigncustomrole(
+        $ENV{'form.ccdomain'},$ENV{'form.ccuname'},$url,$three,$four,$five,$end,$start).
+              '</b><br>';
+    return $output;
+}
+
+sub commit_standardrole {
+    my ($url,$three,$start,$end,$one,$two) = @_;
+    my $output = (&mt('Assigning').' '.$three.' in '.$url.
+           ($start?', '.&mt('starting').' '.localtime($start):'').
+           ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'.
+           &Apache::lonnet::assignrole(
+               $ENV{'form.ccdomain'},$ENV{'form.ccuname'},
+               $url,$three,$end,$start).
+               '</b><br>');
+
+# Handle students differently
+    if (($three eq 'st') && defined($one) && defined($two)) {
+        $url=~/^\/(\w+)\/(\w+)/;
+        my $cid=$one.'_'.$two;
+        $output .= (&mt('Add to classlist').': <b>'.
+                &Apache::lonnet::critical(
+                'put:'.$ENV{'course.'.$cid.'.domain'}.':'.
+                $ENV{'course.'.$cid.'.num'}.':classlist:'.
+                &Apache::lonnet::escape(
+                $ENV{'form.ccuname'}.':'.
+                $ENV{'form.ccdomain'} ).'='.
+                &Apache::lonnet::escape($end.':'.$start),
+                $ENV{'course.'.$cid.'.home'})
+               .'</b><br>');
+    }
+    return $output;
+}
+
+
+sub build_roles {
+    my ($sectionstr,$sections) = @_;
+    my $num_sections = 0;
+    if ($sectionstr=~ /,/) {
+        my @secnums = split/,/,$sectionstr;
+        foreach my $sec (@secnums) {
+            $sec =~ ~s/\W//g;
+            unless ($sec eq "") {
+                if (exists($$sections{$sec})) {
+                    $$sections{$sec} ++;
+                } else {
+                    $$sections{$sec} = 1;
+                    $num_sections ++;
+                }
+            }
+        }
+    } else {
+        $sectionstr=~s/\W//g;
+        unless ($sectionstr eq '') {
+            $$sections{$sectionstr} = 1;
+            $num_sections ++;
+        }
+    }
+                                                                                     
+    return $num_sections;
+}
+
 # ========================================================== Custom Role Editor
 
 sub custom_role_editor {
@@ -1231,6 +1458,7 @@ sub course_level_table {
 	my $bgcol=$thiscourse;
 	$bgcol=~s/[^7-9a-e]//g;
 	$bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);
+	my ($domain)=split(/\//,$thiscourse);
 	foreach  ('st','ta','ep','ad','in','cc') {
 	    if (&Apache::lonnet::allowed('c'.$_,$thiscourse)) {
 		my $plrole=&Apache::lonnet::plaintext($_);
@@ -1238,7 +1466,7 @@ sub course_level_table {
 <tr bgcolor="#$bgcol">
 <td><input type="checkbox" name="act_$protectedcourse\_$_"></td>
 <td>$plrole</td>
-<td>$area</td>
+<td>$area<br />Domain: $domain</td>
 ENDEXTENT
 	        if ($_ ne 'cc') {
 		    $table .= <<ENDSECTION;
@@ -1309,6 +1537,64 @@ $table
 ENDTABLE
     return $result;
 }
+
+sub course_level_dc {
+    my ($dcdom) = @_;
+    my %customroles=&my_custom_roles();
+    my $hiddenitems = '<input type="hidden" name="dcdomain" value="'.$dcdom.'" />'.
+                      '<input type="hidden" name="origdom" value="'.$dcdom.'" />'.
+                      '<input type="hidden" name="dccourse" value="" />';
+    my $courseform='<b>'.&Apache::loncommon::selectcourse_link
+                     ('cu','dccourse','dcdomain','coursedesc').'</b>';
+                                                                                      
+    my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,$dcdom);
+    my %lt=&Apache::lonlocal::texthash(
+                    'crl'  => "Course Level",
+                    'crt'  => "Course Title",
+                    'rol'  => "Role",
+                    'grs'  => "Group/Section",
+                    'exs'  => "Existing sections",
+                    'new'  => "Define new section", 
+                    'sta'  => "Start",
+                    'end'  => "End",
+                    'ssd'  => "Set Start Date",
+                    'sed'  => "Set End Date"
+                  );
+    my $header = '<h4>'.$lt{'crl'}.'</h4>'.
+                 '<table border="2"><tr><th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th></tr>';
+    my $otheritems = '<tr><td><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'".'cu'."'".','."'".'dccourse'."'".','."'".'dcdomain'."'".','."'".'coursedesc'."'".')" /></td>'.
+                     '<td><select name="role">'."\n";
+    foreach  ('st','ta','ep','ad','in','cc') {
+        my $plrole=&Apache::lonnet::plaintext($_);
+        $otheritems .= '  <option value="'.$_.'">'.$plrole;
+    }
+    if ( keys %customroles > 0) {
+        foreach (sort keys %customroles) {
+            my $custrole='cr_cr_'.$ENV{'user.domain'}.
+                    '_'.$ENV{'user.name'}.'_'.$_;
+            $otheritems .= '  <option value="'.$custrole.'">'.$_;
+        }
+    }
+    $otheritems .= '</select></td><td>'.
+                     '<table border="0" cellspacing="0" cellpadding="0">'.
+                     '<tr><td valign="top"><b>'.$lt{'exs'}.'</b><br /><select name="currsec">'.
+                     ' <option value=""><--'.&mt('Pick course first').'</select></td>'.
+                     '<td>&nbsp;&nbsp;</td>'.
+                     '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.
+                     '<input type="text" name="newsec" value="" /></td>'.
+                     '</tr></table></td>';
+    $otheritems .= <<ENDTIMEENTRY;
+<td><input type=hidden name="start" value=''>
+<a href=
+"javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td>
+<td><input type=hidden name="end" value=''>
+<a href=
+"javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td>
+ENDTIMEENTRY
+    $otheritems .= "</tr></table>\n";
+    return $cb_jscript.$header.$hiddenitems.$otheritems;
+}
+
 #---------------------------------------------- end functions for &phase_two
 
 #--------------------------------- functions for &phase_two and &phase_three