--- loncom/interface/loncreateuser.pm	2008/07/13 09:53:16	1.254
+++ loncom/interface/loncreateuser.pm	2008/08/12 10:19:40	1.259
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Create a user
 #
-# $Id: loncreateuser.pm,v 1.254 2008/07/13 09:53:16 raeburn Exp $
+# $Id: loncreateuser.pm,v 1.259 2008/08/12 10:19:40 bisitz Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -967,7 +967,7 @@ sub display_existing_roles {
                 if (defined($coursedata{'description'})) {
                     $carea=$coursedata{'description'}.
                         '<br />'.&mt('Domain').': '.$coursedom.('&nbsp;'x8).
-     &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom);
+     &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom);
                     $sortkey.="\0".$coursedata{'description'};
                     $class=$coursedata{'type'};
                 } else {
@@ -1397,30 +1397,22 @@ sub modify_login_block {
 
 sub personal_data_display {
     my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray) = @_;
-    my ($output,$showforceid,%userenv,%canmodify,@inststatuses);
+    my ($output,$showforceid,%userenv,%canmodify);
     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,$rolesarray);
+    } elsif ($context eq 'selfcreate') {
+        %canmodify = &selfcreate_canmodify($context,$ccdomain,\@userinfo,
+                                           $inst_results,$rolesarray);
     }
     my %lt=&Apache::lonlocal::texthash(
                 'pd'             => "Personal Data",
@@ -1429,7 +1421,7 @@ sub personal_data_display {
                 'lastname'       => "Last Name",
                 'generation'     => "Generation",
                 'permanentemail' => "Permanent e-mail address",
-                'id'             => "ID/Student Number",
+                'id'             => "Student/Employee ID",
                 'lg'             => "Login Data"
     );
     my %textboxsize = (
@@ -1506,6 +1498,21 @@ sub personal_data_display {
     }
 }
 
+sub selfcreate_canmodify {
+    my ($context,$dom,$userinfo,$inst_results,$rolesarray) = @_;
+    if (ref($inst_results) eq 'HASH') {
+        my @inststatuses = &get_inststatuses($inst_results);
+        if (@inststatuses == 0) {
+            @inststatuses = ('default');
+        }
+        $rolesarray = \@inststatuses;
+    }
+    my %canmodify =
+        &Apache::lonuserutils::can_modify_userinfo($context,$dom,$userinfo,
+                                                   $rolesarray);
+    return %canmodify;
+}
+
 sub get_inststatuses {
     my ($insthashref) = @_;
     my @inststatuses = ();
@@ -1840,7 +1847,7 @@ sub update_user_data {
                 $env{'form.c'.$item} = $userenv{$item};
             }
         }
-        # Check to see if we can change the ID/student number
+        # Check to see if we can change the Student/Employee ID
         my $forceid = $env{'form.forceid'};
         my $recurseid = $env{'form.recurseid'};
         my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules);
@@ -1851,7 +1858,10 @@ sub update_user_data {
             (!$forceid)) {
             if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) {
                 $env{'form.cid'} = $userenv{'id'};
-                $no_forceid_alert = &mt('New student/employeeID does not match existing ID for this user.').'<br />'.&mt('Change is not permitted without checking the \'Force ID change\' checkbox on the previous page.').'<br />'."\n";        
+                $no_forceid_alert = &mt('New Student/Employee ID does not match existing ID for this user.')
+                                   .'<br />'
+                                   .&mt("Change is not permitted without checking the 'Force ID change' checkbox on the previous page.")
+                                   .'<br />'."\n";
             }
         }
         if ($env{'form.cid'} ne $userenv{'id'}) {
@@ -1965,7 +1975,7 @@ sub update_user_data {
                              'mddl' => "middle",
                              'lst'  => "last",
 			     'gen'  => "generation",
-                             'id'   => "ID/Student number",
+                             'id'   => "Student/Employee ID",
                              'mail' => "permanent e-mail",
                              'disk' => "disk space allocated to portfolio files",
                              'prvs' => "Previous",
@@ -2048,7 +2058,7 @@ END
             # They did not want to change the users name or quota but we can
             # still tell them what the name and quota are 
 	    my %lt=&Apache::lonlocal::texthash(
-                           'id'   => "ID/Student number",
+                           'id'   => "Student/Employee ID",
                            'mail' => "Permanent e-mail",
                            'disk' => "Disk space allocated to user's portfolio files",
 					       );
@@ -2091,8 +2101,10 @@ END
             $r->print('<span class="LC_cusr_emph">'.$rolestr.'</span><br />'.
                       &mt('Contact your <a href="[_1]">helpdesk</a> for more information.',"javascript:helpMenu('display')").'<br />');
         }
-        $r->print($no_forceid_alert.
-                  &Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts,\%curr_rules));
+        $r->print('<span class="LC_warning">'
+                  .$no_forceid_alert
+                  .&Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts,\%curr_rules)
+                  .'</span>');
     }
     if ($env{'form.action'} eq 'singlestudent') {
         &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context);
@@ -3400,14 +3412,32 @@ function getIndexByName(item) {
     return -1;
 }
 ENDSCRIPT
+    my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+    my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+
     my $output = '<script type="text/javascript">'."\n".
                  $setsec_js."\n".$selfenroll_js."\n".
                  '</script>'."\n".
-                 '<h3>'.$lt->{'selfenroll'}.'</h3>'."\n".
-                 '<form name="'.$formname.'" method="post" action="/adm/createuser">'."\n".
-                 &Apache::lonhtmlcommon::start_pick_box();
-    my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
-    my $cnum = $env{'course.'.$env{'request.course.id'},'.num'};
+                 '<h3>'.$lt->{'selfenroll'}.'</h3>'."\n";
+    my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);
+    if (ref($visactions) eq 'HASH') {
+        if ($visible) {
+            $output .= '<p>'.$visactions->{'vis'}.'</p>';
+        } else {
+            $output .= $visactions->{'miss'}.'<br />'.$visactions->{'yous'}.
+                       '<p>'.$visactions->{'gen'}.'<br />'.$visactions->{'coca'};
+            if (ref($vismsgs) eq 'ARRAY') {
+                $output .= '<br />'.$visactions->{'make'}.'<ul>';
+                foreach my $item (@{$vismsgs}) {
+                    $output .= '<li>'.$visactions->{$item}.'</li>';
+                }
+                $output .= '</ul>';
+            }
+            $output .= '</p>';
+        }
+    }
+    $output .= '<form name="'.$formname.'" method="post" action="/adm/createuser">'."\n".
+               &Apache::lonhtmlcommon::start_pick_box();
     if (ref($row) eq 'ARRAY') {
         foreach my $item (@{$row}) {
             my $title = $item; 
@@ -3559,6 +3589,128 @@ ENDSCRIPT
     return;
 }
 
+sub visible_in_cat {
+    my ($cdom,$cnum) = @_;
+    my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
+    my ($cathash,%settable,@vismsgs,$cansetvis);
+    my %visactions = &Apache::lonlocal::texthash(
+                   vis => 'Your course currently appears in the Course Catalog for this domain.',
+                   gen => 'Courses can be both self-cataloging, based on an institutional code (e.g., fs08phy231), or can be assigned categories from a hierarchy defined for the domain.',
+                   miss => 'Your course does not currently appear in the Course Catalog for this domain.',
+                   yous => 'You should remedy this if you plan to allow self-enrollment, otherwise students will have difficulty finding your course.',
+                   coca => 'Courses can be absent from the Catalog, because they do not have an institutional code, have no assigned category, or have been specifically excluded.',
+                   make => 'Make any changes to self-enrollment settings below, click "Save changes", then take action to include the course in the Catalog:',
+                   take => 'Take the following action to ensure the course appears in the Catalog:',
+                   dc_unhide  => 'Ask a domain coordinator to change the "Exclude from course catalog" setting.',
+                   dc_addinst => 'Ask a domain coordinator to enable display the catalog of "Official courses (with institutional codes)".',
+                   dc_instcode => 'Ask a domain coordinator to assign an institutional code (if this is an official course).',
+                   dc_catalog  => 'Ask a domain coordinator to enable or create at least one course category in the domain.',
+                   dc_categories => 'Ask a domain coordinator to create a hierarchy of categories and sub categories for courses in the domain.',
+                   dc_chgcat => 'Ask a domain coordinator to change the category assigned to the course, as the one currently assigned is no longer used in the domain',
+                   dc_addcat => 'Ask a domain coordinator to assign a category to the course.',
+    );
+    $visactions{'unhide'} = &mt('Use [_1]Set course environment[_2] to change the "Exclude from course catalog" setting.','<a href="/adm/parmset?action=crsenv">','</a>');
+    $visactions{'chgcat'} = &mt('Use [_1]Set course environment[_2] to change the category assigned to the course, as the one currently assigned is no longer used in the domain.','<a href="/adm/parmset?action=crsenv">','</a>');
+    $visactions{'addcat'} = &mt('Use [_1]Set course environment[_2] to assign a category to the course.','<a href="/adm/parmset?action=crsenv">','</a>');
+    if (ref($domconf{'coursecategories'}) eq 'HASH') {
+        if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {
+            $settable{'togglecats'} = 1;
+        }
+        if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {
+            $settable{'categorize'} = 1;
+        }
+        $cathash = $domconf{'coursecategories'}{'cats'};
+    }
+    if ($settable{'togglecats'} && $settable{'categories'}) {
+        $cansetvis = &mt('You are able to both assign a course category and choose to exclude this course from the catalog.');   
+    } elsif ($settable{'togglecats'}) {
+        $cansetvis = &mt('You are able to choose to exclude this course from the catalog, but only a Domain Coordinator may assign a course category.'); 
+    } elsif ($settable{'categories'}) {
+        $cansetvis = &mt('You may assign a course category, but only a Domain Coordinator may choose to exclude this course from the catalog.');  
+    } else {
+        $cansetvis = &mt('Only a Domain Coordinator may assign a course category or choose to exclude this course from the catalog.'); 
+    }
+     
+    my %currsettings =
+        &Apache::lonnet::get('environment',['hidefromcat','categories','internal.coursecode'],
+                             $cdom,$cnum);
+    my $visible = 0;
+    if ($currsettings{'internal.coursecode'} ne '') {
+        if (ref($domconf{'coursecategories'}) eq 'HASH') {
+            $cathash = $domconf{'coursecategories'}{'cats'};
+            if (ref($cathash) eq 'HASH') {
+                if ($cathash->{'instcode::0'} eq '') {
+                    push(@vismsgs,'dc_addinst'); 
+                } else {
+                    $visible = 1;
+                }
+            } else {
+                $visible = 1;
+            }
+        } else {
+            $visible = 1;
+        }
+    } else {
+        if (ref($cathash) eq 'HASH') {
+            if ($cathash->{'instcode::0'} ne '') {
+                push(@vismsgs,'dc_instcode');
+            }
+        } else {
+            push(@vismsgs,'dc_instcode');
+        }
+    }
+    if ($currsettings{'categories'} ne '') {
+        my $cathash;
+        if (ref($domconf{'coursecategories'}) eq 'HASH') {
+            $cathash = $domconf{'coursecategories'}{'cats'};
+            if (ref($cathash) eq 'HASH') {
+                if (keys(%{$cathash}) == 0) {
+                    push(@vismsgs,'dc_catalog');
+                } elsif ((keys(%{$cathash}) == 1) && ($cathash->{'instcode::0'} ne '')) {
+                    push(@vismsgs,'dc_categories');
+                } else {
+                    my @currcategories = split('&',$currsettings{'categories'});
+                    my $matched = 0;
+                    foreach my $cat (@currcategories) {
+                        if ($cathash->{$cat} ne '') {
+                            $visible = 1;
+                            $matched = 1;
+                            last;
+                        }
+                    }
+                    if (!$matched) {
+                        if ($settable{'categories'}) { 
+                            push(@vismsgs,'chgcat');
+                        } else {
+                            push(@vismsgs,'dc_chgcat');
+                        }
+                    }
+                }
+            }
+        }
+    } else {
+        if (ref($cathash) eq 'HASH') {
+            if ((keys(%{$cathash}) > 1) || 
+                (keys(%{$cathash}) == 1) && ($cathash->{'instcode::0'} eq '')) {
+                if ($settable{'categories'}) {
+                    push(@vismsgs,'addcat');
+                } else {
+                    push(@vismsgs,'dc_addcat');
+                }
+            }
+        }
+    }
+    if ($currsettings{'hidefromcat'} eq 'yes') {
+        $visible = 0;
+        if ($settable{'togglecats'}) {
+            unshift(@vismsgs,'unhide');
+        } else {
+            unshift(@vismsgs,'dc_unhide')
+        }
+    }
+    return ($visible,$cansetvis,\@vismsgs,\%visactions);
+}
+
 sub new_selfenroll_dom_row {
     my ($newdom,$num) = @_;
     my $domdesc = &Apache::lonnet::domain($newdom);
@@ -3598,13 +3750,14 @@ sub selfenroll_inst_types {
                 $output .= '</tr><tr>';
             }
             if (defined($usertypes->{$type})) {
+                my $esc_type = &escape($type);
                 $output .= '<td><span class="LC_nobreak"><label><input type = "checkbox" value="'.
-                           $type.'" ';
+                           $esc_type.'" ';
                 if (ref($currinsttypes) eq 'ARRAY') {
                     if (@{$currinsttypes} > 0) {
                         if (grep(/^any$/,@{$currinsttypes})) {
                             $output .= 'checked="checked"';
-                        } elsif (grep(/^\Q$type\E$/,@{$currinsttypes})) {
+                        } elsif (grep(/^\Q$esc_type\E$/,@{$currinsttypes})) {
                             $output .= 'checked="checked"';
                         }
                     } else {
@@ -3706,7 +3859,7 @@ sub print_userchangelogs_display {
                    &mt('Context').'</th><th>'.&mt('Start').'</th><th>'.&mt('End').'</th>'.
                    &Apache::loncommon::end_data_table_header_row();
     my ($minshown,$maxshown);
-    my $minshown = 1;
+    $minshown = 1;
     my $count = 0;
     if ($curr{'show'} ne &mt('all')) { 
         $maxshown = $curr{'page'} * $curr{'show'};
@@ -4594,8 +4747,9 @@ sub update_selfenroll_config {
                             my $othervalue = 'any';
                             if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) {
                                 if (@{$types} > 0) {
+                                    my @esc_types = map { &escape($_); } @{$types};
                                     $othervalue = 'other';
-                                    $typestr = join(',',(@{$types},$othervalue));
+                                    $typestr = join(',',(@esc_types,$othervalue));
                                 }
                                 $typestr = $othervalue;
                             } else {
@@ -4717,6 +4871,21 @@ sub update_selfenroll_config {
     } else {
         $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.'));
     }
+    my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);
+    if (ref($visactions) eq 'HASH') {
+        if (!$visible) {
+            $r->print('<br />'.$visactions->{'miss'}.'<br />'.$visactions->{'yous'}.
+                      '<br />');
+            if (ref($vismsgs) eq 'ARRAY') {
+                $r->print('<br />'.$visactions->{'take'}.'<ul>');
+                foreach my $item (@{$vismsgs}) {
+                    $r->print('<li>'.$visactions->{$item}.'</li>');
+                }
+                $r->print('</ul>');
+            }
+            $r->print($cansetvis);
+        }
+    } 
     return;
 }
 
@@ -4726,8 +4895,8 @@ sub get_selfenroll_titles {
                 types        => 'Users allowed to self-enroll in this course',
                 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',
+                access_dates => 'Course access dates assigned to self-enrolling users',
+                section      => 'Section assigned to self-enrolling users',
              );
     return (\@row,\%lt);
 }