--- loncom/interface/loncreateuser.pm	2008/06/23 14:13:50	1.244
+++ loncom/interface/loncreateuser.pm	2008/07/13 09:53:16	1.254
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Create a user
 #
-# $Id: loncreateuser.pm,v 1.244 2008/06/23 14:13:50 bisitz Exp $
+# $Id: loncreateuser.pm,v 1.254 2008/07/13 09:53:16 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1396,18 +1396,31 @@ sub modify_login_block {
 }
 
 sub personal_data_display {
-    my ($ccuname,$ccdomain,$newuser,$context,$inst_results) = @_;
-    my ($output,$showforceid,%userenv,%canmodify);
+    my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray) = @_;
+    my ($output,$showforceid,%userenv,%canmodify,@inststatuses);
     my @userinfo = ('firstname','middlename','lastname','generation',
                     'permanentemail','id');
+    my $rowcount = 0;
+    my $editable = 0;
+    if ($context eq 'selfcreate') {
+        if (ref($inst_results) eq 'HASH') {
+            @inststatuses = &get_inststatuses($inst_results);
+            if (@inststatuses == 0) {
+                @inststatuses = ('default');
+            }
+            $rolesarray = \@inststatuses;
+        }
+    }
     if (!$newuser) {
         # Get the users information
         %userenv = &Apache::lonnet::get('environment',
                    ['firstname','middlename','lastname','generation',
                     'permanentemail','id'],$ccdomain,$ccuname);
+    }
+    if ((!$newuser) || ($context eq 'selfcreate')) {
         %canmodify =
             &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,
-                                                       \@userinfo);
+                                                       \@userinfo,$rolesarray);
     }
     my %lt=&Apache::lonlocal::texthash(
                 'pd'             => "Personal Data",
@@ -1432,40 +1445,78 @@ sub personal_data_display {
               &Apache::lonhtmlcommon::start_pick_box();
     foreach my $item (@userinfo) {
         my $rowtitle = $lt{$item};
+        my $hiderow = 0;
         if ($item eq 'generation') {
             $rowtitle = $genhelp.$rowtitle;
         }
-        $output .= &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n";
+        my $row = &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n";
         if ($newuser) {
             if (ref($inst_results) eq 'HASH') {
                 if ($inst_results->{$item} ne '') {
-                    $output .= '<input type="hidden" name="c'.$item.'" value="'.$inst_results->{$item}.'" />'.$inst_results->{$item};
+                    $row .= '<input type="hidden" name="c'.$item.'" value="'.$inst_results->{$item}.'" />'.$inst_results->{$item};
                 } else {
-                    $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
+                    if ($context eq 'selfcreate') {
+                        if ($canmodify{$item}) { 
+                            $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
+                            $editable ++;
+                        } else {
+                            $hiderow = 1;
+                        }
+                    } else {
+                        $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
+                    }
                 }
             } else {
-                $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
+                if ($context eq 'selfcreate') {
+                    if ($canmodify{$item}) {
+                        $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
+                        $editable ++;
+                    } else {
+                        $hiderow = 1;
+                    }
+                } else {
+                    $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
+                }
             }
         } else {
             if ($canmodify{$item}) {
-                $output .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="'.$userenv{$item}.'" />';
+                $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="'.$userenv{$item}.'" />';
             } else {
-                $output .= $userenv{$item};
+                $row .= $userenv{$item};
             }
             if ($item eq 'id') {
                 $showforceid = $canmodify{$item};
             }
         }
-        $output .= &Apache::lonhtmlcommon::row_closure(1);
+        $row .= &Apache::lonhtmlcommon::row_closure(1);
+        if (!$hiderow) {
+            $output .= $row;
+            $rowcount ++;
+        }
     }
     $output .= &Apache::lonhtmlcommon::end_pick_box();
     if (wantarray) {
-        return ($output,$showforceid);
+        if ($context eq 'selfcreate') {
+            return($output,$rowcount,$editable);
+        } else {
+            return ($output,$showforceid);
+        }
     } else {
         return $output;
     }
 }
 
+sub get_inststatuses {
+    my ($insthashref) = @_;
+    my @inststatuses = ();
+    if (ref($insthashref) eq 'HASH') {
+        if (ref($insthashref->{'inststatus'}) eq 'ARRAY') {
+            @inststatuses = @{$insthashref->{'inststatus'}};
+        }
+    }
+    return @inststatuses;
+}
+
 # ================================================================= Phase Three
 sub update_user_data {
     my ($r,$context) = @_; 
@@ -2069,7 +2120,10 @@ END
         if ($env{'form.popup'}) {
             $r->print('<p><a href="javascript:window.close()">'.&mt('Close window').'</a></p>');
         } else {
-            $r->print('<p><a href="javascript:backPage(document.userupdate,'."'$env{'form.prevphase'}','modify'".')">'.&mt('Modify this user: <span class="LC_cusr_emph">([_1])</span>',$userinfo).'</a>'.('&nbsp;'x5).'<a href="javascript:backPage(document.userupdate)">'.&mt('Create/Modify Another User').'</a></p>');
+            $r->print('<p><a href="javascript:backPage(document.userupdate,'."'$env{'form.prevphase'}','modify'".')">'
+                     .&mt('Modify this user: [_1]','<span class="LC_cusr_emph">'.$env{'form.ccuname'}.':'.$env{'form.ccdomain'}.' ('.$userinfo.')</span>').'</a>'
+                     .('&nbsp;'x5).'<a href="javascript:backPage(document.userupdate)">'
+                     .&mt('Create/Modify Another User').'</a></p>');
         }
     }
     $r->print(&Apache::loncommon::end_page());
@@ -3127,12 +3181,12 @@ sub print_main_menu {
                  help => 'Course_User_Logs',
                  action => 'changelogs',
                  permission => $permission->{'cusr'},
-               },
-               { text => 'View Log-in History',
-                 help => 'Course_User_Logins',
-                 action => 'logins',
-                 permission => $permission->{'cusr'},
-               });
+               },);
+#               { text => 'View Log-in History',
+#                 help => 'Course_User_Logins',
+#                 action => 'logins',
+#                 permission => $permission->{'cusr'},
+#               });
         push(@menu,@courselinks);
     }
     my $menu_html = '';
@@ -3175,8 +3229,179 @@ sub print_selfenroll_menu {
     my $groupslist = &Apache::lonuserutils::get_groupslist();
     my $setsec_js = 
         &Apache::lonuserutils::setsections_javascript($formname,$groupslist);
+    my %alerts = &Apache::lonlocal::texthash(
+        acto => 'Activation of self-enrollment was selected for the following domain(s)',
+        butn => 'but no user types have been checked.',
+        wilf => "Please uncheck 'activate' or check at least one type.",
+    );
+    my $selfenroll_js = <<"ENDSCRIPT";
+function update_types(caller,num) {
+    var delidx = getIndexByName('selfenroll_delete');
+    var actidx = getIndexByName('selfenroll_activate');
+    if (caller == 'selfenroll_all') {
+        var selall;
+        for (var i=0; i<document.$formname.selfenroll_all.length; i++) {
+            if (document.$formname.selfenroll_all[i].checked) {
+                selall = document.$formname.selfenroll_all[i].value;
+            }
+        }
+        if (selall == 1) {
+            if (delidx != -1) {
+                if (document.$formname.selfenroll_delete.length) {
+                    for (var j=0; j<document.$formname.selfenroll_delete.length; j++) {
+                        document.$formname.selfenroll_delete[j].checked = true;
+                    }
+                } else {
+                    document.$formname.elements[delidx].checked = true;
+                }
+            }
+            if (actidx != -1) {
+                if (document.$formname.selfenroll_activate.length) {
+                    for (var j=0; j<document.$formname.selfenroll_activate.length; j++) {
+                        document.$formname.selfenroll_activate[j].checked = false;
+                    }
+                } else {
+                    document.$formname.elements[actidx].checked = false;
+                }
+            }
+            document.$formname.selfenroll_newdom.selectedIndex = 0; 
+        }
+    }
+    if (caller == 'selfenroll_activate') {
+        if (document.$formname.selfenroll_activate.length) {
+            for (var j=0; j<document.$formname.selfenroll_activate.length; j++) {
+                if (document.$formname.selfenroll_activate[j].value == num) {
+                    if (document.$formname.selfenroll_activate[j].checked) {
+                        for (var i=0; i<document.$formname.selfenroll_all.length; i++) {
+                            if (document.$formname.selfenroll_all[i].value == '1') {
+                                document.$formname.selfenroll_all[i].checked = false;
+                            }
+                            if (document.$formname.selfenroll_all[i].value == '0') {
+                                document.$formname.selfenroll_all[i].checked = true;
+                            }
+                        }
+                    }
+                }
+            }
+        } else {
+            for (var i=0; i<document.$formname.selfenroll_all.length; i++) {
+                if (document.$formname.selfenroll_all[i].value == '1') {
+                    document.$formname.selfenroll_all[i].checked = false;
+                }
+                if (document.$formname.selfenroll_all[i].value == '0') {
+                    document.$formname.selfenroll_all[i].checked = true;
+                }
+            }
+        }
+    }
+    if (caller == 'selfenroll_delete') {
+        if (document.$formname.selfenroll_delete.length) {
+            for (var j=0; j<document.$formname.selfenroll_delete.length; j++) {
+                if (document.$formname.selfenroll_delete[j].value == num) {
+                    if (document.$formname.selfenroll_delete[j].checked) {
+                        var delindex = getIndexByName('selfenroll_types_'+num);
+                        if (delindex != -1) { 
+                            if (document.$formname.elements[delindex].length) {
+                                for (var k=0; k<document.$formname.elements[delindex].length; k++) {
+                                    document.$formname.elements[delindex][k].checked = false;
+                                }
+                            } else {
+                                document.$formname.elements[delindex].checked = false;
+                            }
+                        }
+                    }
+                }
+            }
+        } else {
+            if (document.$formname.selfenroll_delete.checked) {
+                var delindex = getIndexByName('selfenroll_types_'+num);
+                if (delindex != -1) {
+                    if (document.$formname.elements[delindex].length) {
+                        for (var k=0; k<document.$formname.elements[delindex].length; k++) {
+                            document.$formname.elements[delindex][k].checked = false;
+                        }
+                    } else {
+                        document.$formname.elements[delindex].checked = false;
+                    }
+                }
+            }
+        }
+    }
+    return;
+}
+
+function validate_types(form) {
+    var needaction = new Array();
+    var countfail = 0;
+    var actidx = getIndexByName('selfenroll_activate');
+    if (actidx != -1) {
+        if (document.$formname.selfenroll_activate.length) {
+            for (var j=0; j<document.$formname.selfenroll_activate.length; j++) {
+                var num = document.$formname.selfenroll_activate[j].value;
+                if (document.$formname.selfenroll_activate[j].checked) {
+                    countfail = check_types(num,countfail,needaction)
+                }
+            }
+        } else {
+            if (document.$formname.selfenroll_activate.checked) {
+                var num = document.enrollstudent.selfenroll_activate.value;
+                countfail = check_types(num,countfail,needaction)
+            }
+        }
+    }
+    if (countfail > 0) {
+        var msg = "$alerts{'acto'}\\n";
+        var loopend = needaction.length -1;
+        if (loopend > 0) {
+            for (var m=0; m<loopend; m++) {
+                msg += needaction[m]+", ";
+            }
+        }
+        msg += needaction[loopend]+"\\n$alerts{'butn'}\\n$alerts{'wilf'}";
+        alert(msg);
+        return; 
+    }
+    setSections(form);
+}
+
+function check_types(num,countfail,needaction) {
+    var typeidx = getIndexByName('selfenroll_types_'+num);
+    var count = 0;
+    if (typeidx != -1) {
+        if (document.$formname.elements[typeidx].length) {
+            for (var k=0; k<document.$formname.elements[typeidx].length; k++) {
+                if (document.$formname.elements[typeidx][k].checked) {
+                    count ++;
+                }
+            }
+        } else {
+            if (document.$formname.elements[typeidx].checked) {
+                count ++;
+            }
+        }
+        if (count == 0) {
+            var domidx = getIndexByName('selfenroll_dom_'+num);
+            if (domidx != -1) {
+                var domname = document.$formname.elements[domidx].value;
+                needaction[countfail] = domname;
+                countfail ++;
+            }
+        }
+    }
+    return countfail;
+}
+
+function getIndexByName(item) {
+    for (var i=0;i<document.$formname.elements.length;i++) {
+        if (document.$formname.elements[i].name == item) {
+            return i;
+        }
+    }
+    return -1;
+}
+ENDSCRIPT
     my $output = '<script type="text/javascript">'."\n".
-                 $setsec_js."\n".
+                 $setsec_js."\n".$selfenroll_js."\n".
                  '</script>'."\n".
                  '<h3>'.$lt->{'selfenroll'}.'</h3>'."\n".
                  '<form name="'.$formname.'" method="post" action="/adm/createuser">'."\n".
@@ -3205,14 +3430,20 @@ sub print_selfenroll_menu {
                 if ($curr_types eq '*') {
                     $output .= ' checked="checked" '; 
                 }
-                $output .= '/>'.&mt('Yes').'</label>&nbsp;&nbsp;<input type="radio" name="selfenroll_all" value="0" ';
+                $output .= 'onchange="javascript:update_types('.
+                           "'selfenroll_all'".');" />'.&mt('Yes').'</label>'.
+                           '&nbsp;&nbsp;<input type="radio" name="selfenroll_all" value="0" ';
                 if ($curr_types ne '*') {
                     $output .= ' checked="checked" ';
                 }
-                $output .= '/>'.&mt('No').'</label></td>'
-                           .&Apache::loncommon::end_data_table_row();
+                $output .= ' onchange="javascript:update_types('.
+                           "'selfenroll_all'".');"/>'.&mt('No').'</label></td>'.
+                           &Apache::loncommon::end_data_table_row().
+                           &Apache::loncommon::end_data_table().
+                           &mt('Or').'<br />'.
+                           &Apache::loncommon::start_data_table();
                 my %currdoms;
-                if (($curr_types eq '') && ($env{'form.selfenroll_newdom'} eq '')) {
+                if ($curr_types eq '') {
                     $output .= &new_selfenroll_dom_row($cdom,'0');
                 } elsif ($curr_types ne '*') {
                     my @entries = split(/;/,$curr_types);
@@ -3221,33 +3452,27 @@ sub print_selfenroll_menu {
                             my ($currdom,$typestr) = split(/:/,$entry);
                             $currdoms{$currdom} = 1;
                             my $domdesc = &Apache::lonnet::domain($currdom);
-                            my @currinsttypes = split(/,/,$typestr);
+                            my @currinsttypes = split(',',$typestr);
                             $output .= &Apache::loncommon::start_data_table_row()
                                        .'<td valign="top"><span class="LC_nobreak">'.&mt('Domain:').'<b>'
                                        .'&nbsp;'.$domdesc.' ('.$currdom.')'
                                        .'</b><input type="hidden" name="selfenroll_dom_'.$num
                                        .'" value="'.$currdom.'" /></span><br />'
                                        .'<span class="LC_nobreak"><label><input type="checkbox" '
-                                       .'name="selfenroll_delete" value="'.$num.'" />'
+                                       .'name="selfenroll_delete" value="'.$num.'" onchange="javascript:update_types('."'selfenroll_delete','$num'".');" />'
                                        .&mt('Delete').'</label></span></td>';
-                            $output .= '<td valign="top">'.&mt('User types:').'<br />'
+                            $output .= '<td valign="top">&nbsp;&nbsp;'.&mt('User types:').'<br />'
                                        .&selfenroll_inst_types($num,$currdom,\@currinsttypes).'</td>'
                                        .&Apache::loncommon::end_data_table_row();
                             $num ++;
                         }
                     }
                 }
-                if ($env{'form.selfenroll_newdom'} ne '') {
-                    if (!defined($currdoms{$env{'form.selfenroll_newdom'}})) {
-                        $output .= &new_selfenroll_dom_row($env{'form.selfenroll_newdom'},$num); 
-                        $num ++;
-                    }
-                }
-                my $add_domtitle = &mt('Additional domain:');
+                my $add_domtitle = &mt('Users in additional domain:');
                 if ($curr_types eq '*') { 
-                    $add_domtitle = &mt('Specific domain:');
+                    $add_domtitle = &mt('Users in specific domain:');
                 } elsif ($curr_types eq '') {
-                    $add_domtitle = &mt('Other domain:');
+                    $add_domtitle = &mt('Users in other domain:');
                 }
                 $output .= &Apache::loncommon::start_data_table_row()
                            .'<td colspan="2"><span class="LC_nobreak">'.$add_domtitle.'</span><br />'
@@ -3266,9 +3491,9 @@ sub print_selfenroll_menu {
                     $regoff = ' checked="checked" ';
                 }
                 $output .= '<label>'.
-                           '<input type="radio" name="registered" value="1"'.$regon.'/>'.
+                           '<input type="radio" name="selfenroll_registered" value="1"'.$regon.'/>'.
                            &mt('Yes').'</label>&nbsp;&nbsp;<label>'.
-                           '<input type="radio" name="registered" value="0"'.$regoff.'/>'.
+                           '<input type="radio" name="selfenroll_registered" value="0"'.$regoff.'/>'.
                            &mt('No').'</label>';
             } elsif ($item eq 'enroll_dates') {
                 my $starttime = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_start_date'};
@@ -3328,7 +3553,7 @@ sub print_selfenroll_menu {
     }
     $output .= &Apache::lonhtmlcommon::end_pick_box().
                '<br /><input type="button" name="selfenrollconf" value="'
-               .&mt('Save changes').'" onclick="setSections(this.form);" />'
+               .&mt('Save changes').'" onclick="validate_types(this.form);" />'
                .'<input type="hidden" name="action" value="selfenroll" /></form>';
     $r->print($output);
     return;
@@ -3342,7 +3567,12 @@ sub new_selfenroll_dom_row {
         $output .= &Apache::loncommon::start_data_table_row()
                    .'<td valign="top"><span class="LC_nobreak">'.&mt('Domain:').'&nbsp;<b>'.$domdesc
                    .' ('.$newdom.')</b><input type="hidden" name="selfenroll_dom_'.$num
-                   .'" value="'.$newdom.'" /></span></td>';
+                   .'" value="'.$newdom.'" /></span><br />'
+                   .'<span class="LC_nobreak"><label><input type="checkbox" '
+                   .'name="selfenroll_activate" value="'.$num.'" '
+                   .'onchange="javascript:update_types('
+                   ."'selfenroll_activate','$num'".');" />'
+                   .&mt('Activate').'</label></span></td>';
         my @currinsttypes;
         $output .= '<td>'.&mt('User types:').'<br />'
                    .&selfenroll_inst_types($num,$newdom,\@currinsttypes).'</td>'
@@ -3357,7 +3587,11 @@ sub selfenroll_inst_types {
     my $numinrow = 4;
     my $count = 0;
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($currdom);
+    my $othervalue = 'any';
     if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) {
+        if (keys(%{$usertypes}) > 0) {
+            $othervalue = 'other';
+        }
         $output .= '<table><tr>';
         foreach my $type (@{$types}) {
             if (($count > 0) && ($count%$numinrow == 0)) {
@@ -3368,9 +3602,13 @@ sub selfenroll_inst_types {
                            $type.'" ';
                 if (ref($currinsttypes) eq 'ARRAY') {
                     if (@{$currinsttypes} > 0) {
-                        if (grep(/^\Q$type\E$/,@{$currinsttypes})) {
+                        if (grep(/^any$/,@{$currinsttypes})) {
+                            $output .= 'checked="checked"';
+                        } elsif (grep(/^\Q$type\E$/,@{$currinsttypes})) {
                             $output .= 'checked="checked"';
                         }
+                    } else {
+                        $output .= 'checked="checked"';
                     }
                 }
                 $output .= ' name="selfenroll_types_'.$num.'" />'.$usertypes->{$type}.'</label></span></td>';
@@ -3380,13 +3618,21 @@ sub selfenroll_inst_types {
         if (($count > 0) && ($count%$numinrow == 0)) {
             $output .= '</tr><tr>';
         }
-        $output .= '<td><span class="LC_nobreak"><label><input type = "checkbox" value="other" ';
+        $output .= '<td><span class="LC_nobreak"><label><input type = "checkbox" value="'.$othervalue.'"';
         if (ref($currinsttypes) eq 'ARRAY') {
             if (@{$currinsttypes} > 0) {
-                if (grep(/^other$/,@{$currinsttypes})) {
-                    $output .= 'checked="checked" ';
+                if (grep(/^any$/,@{$currinsttypes})) { 
+                    $output .= ' checked="checked"';
+                } elsif ($othervalue eq 'other') {
+                    if (grep(/^\Q$othervalue\E$/,@{$currinsttypes})) {
+                        $output .= ' checked="checked"';
+                    }
                 }
+            } else {
+                $output .= ' checked="checked"';
             }
+        } else {
+            $output .= ' checked="checked"';
         }
         $output .= ' name="selfenroll_types_'.$num.'" />'.$othertitle.'</label></span></td></tr></table>';
     }
@@ -3449,8 +3695,9 @@ sub print_userchangelogs_display {
             $curr{$key} = $defaults{$key};
         }
     }
-    my (%whodunit,%changed);
-    $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr));
+    my (%whodunit,%changed,$version);
+    ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/);
+    $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr,$version));
     my $showntablehdr = 0;
     my $tablehdr = &Apache::loncommon::start_data_table().
                    &Apache::loncommon::start_data_table_header_row().
@@ -3567,7 +3814,7 @@ ENDSCRIPT
 }
 
 sub role_display_filter {
-    my ($formname,$cdom,$cnum,$curr) = @_;
+    my ($formname,$cdom,$cnum,$curr,$version) = @_;
     my $context = 'course';
     my $nolink = 1;
     my $output = '<table><tr><td valign="top">'.
@@ -3618,9 +3865,14 @@ sub role_display_filter {
             next if (!&Apache::lonnet::auto_run($cnum,$cdom));
         }
         $output .= '<option value="'.$chgtype.'"'.$selstr.'>'.$lt{$chgtype}.'</option>'."\n";
-    } 
+    }
     $output .= '</select></td><td>&nbsp;&nbsp;</td><td valign="middle"><input type="submit" value="'.
-               &mt('Update Display').'" /></tr></table><hr noshade><br />';
+               &mt('Update Display').'" /></tr></table>'.
+               '<span class="LC_roleslog_note">'.
+               &mt('[_1]Note:[_2] Only changes made from servers running LON-CAPA 2.6.99.0 or later are displayed.');
+    if ($version) {
+        $output .= ' '.&mt('This server is version [_3].','<b>','</b>',$version);    }
+    $output .= '</span><hr noshade><br />';
     return $output;
 }
 
@@ -4302,26 +4554,57 @@ sub update_selfenroll_config {
                     } else {
                         next;
                     }
-                } elsif ($curr_types eq '') {
-                    my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_0');
-                    if (@types > 0) {
-                        $changes{'internal.selfenroll_types'} = $env{'form.selfenroll_dom_0'}.':'.join(',',@types);
-                    }
                 } else {
+                    my %currdoms;
                     my @entries = split(/;/,$curr_types);
-                    my $num = 0;
-                    my @latesttypes;
                     my @deletedoms = &Apache::loncommon::get_env_multiple('form.selfenroll_delete');
+                    my @activations = &Apache::loncommon::get_env_multiple('form.selfenroll_activate');
                     my $newnum = 0;
-                    for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) {
-                        if (!grep(/^$j$/,@deletedoms)) {
-                            my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$j);
+                    my @latesttypes;
+                    foreach my $num (@activations) {
+                        my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$num);
+                        if (@types > 0) {
                             @types = sort(@types);
                             my $typestr = join(',',@types);
-                            $latesttypes[$newnum] = $env{'form.selfenroll_dom_'.$j}.':'.$typestr;
+                            my $typedom = $env{'form.selfenroll_dom_'.$num};
+                            $latesttypes[$newnum] = $typedom.':'.$typestr;
+                            $currdoms{$typedom} = 1;
                             $newnum ++;
                         }
                     }
+                    for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) {                        if ((!grep(/^$j$/,@deletedoms)) && (!grep(/^$j$/,@activations))) {
+                            my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$j);
+                            if (@types > 0) {
+                                @types = sort(@types);
+                                my $typestr = join(',',@types);
+                                my $typedom = $env{'form.selfenroll_dom_'.$j};
+                                $latesttypes[$newnum] = $typedom.':'.$typestr;
+                                $currdoms{$typedom} = 1;
+                                $newnum ++;
+                            }
+                        }
+                    }
+                    if ($env{'form.selfenroll_newdom'} ne '') {
+                        my $typedom = $env{'form.selfenroll_newdom'};
+                        if ((!defined($currdoms{$typedom})) && 
+                            (&Apache::lonnet::domain($typedom) ne '')) {
+                            my $typestr;
+                            my ($othertitle,$usertypes,$types) = 
+                                &Apache::loncommon::sorted_inst_types($typedom);
+                            my $othervalue = 'any';
+                            if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) {
+                                if (@{$types} > 0) {
+                                    $othervalue = 'other';
+                                    $typestr = join(',',(@{$types},$othervalue));
+                                }
+                                $typestr = $othervalue;
+                            } else {
+                                $typestr = $othervalue;
+                            } 
+                            $latesttypes[$newnum] = $typedom.':'.$typestr;
+                            $newnum ++ ;
+                        }
+                    }
                     my $selfenroll_types = join(';',@latesttypes);
                     if ($selfenroll_types ne $curr_types) {
                         $changes{'internal.selfenroll_types'} = $selfenroll_types;
@@ -4408,6 +4691,12 @@ sub update_selfenroll_config {
                                 } elsif ($newval eq '*') {
                                     $newval = &mt('Any user in any domain');
                                 }
+                            } elsif ($item eq 'registered') {
+                                if ($newval eq '1') {
+                                    $newval = &mt('Yes');
+                                } elsif ($newval eq '0') {
+                                    $newval = &mt('No');
+                                }
                             }
                             $r->print('<li>'.&mt('"[_1]" set to "[_2]".',$title,$newval).'</li>'."\n");
                         }
@@ -4423,13 +4712,10 @@ sub update_selfenroll_config {
                 $r->print(&mt('An error occurred when saving changes to self-enrollment settings in this course.').'<br />'.&mt('The error was: [_1].',$putresult));
             }
         } else {
-            $r->print(&mt('No changes were needed to the existing self-enrollment settings in this course.'));
+            $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.'));
         }
     } else {
-        $r->print(&mt('No changes were needed to the existing self-enrollment settings in this course.'));
-    }
-    if ($env{'form.selfenroll_newdom'} ne '') {
-        &print_selfenroll_menu($r,$context,$permission);
+        $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.'));
     }
     return;
 }
@@ -4438,7 +4724,7 @@ sub get_selfenroll_titles {
     my @row = ('types','registered','enroll_dates','access_dates','section');
     my %lt = &Apache::lonlocal::texthash (
                 types        => 'Users allowed to self-enroll in this course',
-                registered   => 'Restrict self-enrollment to registered students',
+                registered   => 'Restrict self-enrollment to students officially registered for the course',
                 enroll_dates => 'Dates self-enrollment available',
                 access_dates => 'Course access dates for self-enrolled users',
                 section      => 'Section assigned to self-enrolled users',