--- loncom/interface/lonuserutils.pm	2010/01/05 22:08:48	1.109.2.2
+++ loncom/interface/lonuserutils.pm	2010/02/02 05:56:09	1.115
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Utility functions for managing LON-CAPA user accounts
 #
-# $Id: lonuserutils.pm,v 1.109.2.2 2010/01/05 22:08:48 raeburn Exp $
+# $Id: lonuserutils.pm,v 1.115 2010/02/02 05:56:09 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1185,10 +1185,8 @@ sub default_role_selector {
                     'exs'  => "Existing sections",
                     'new'  => "New section",
                   );
-    $options = '<select name="defaultrole">'."\n";
-    unless (($context eq 'course') && (&Apache::loncommon::needs_gci_custom())) {
-        $options .= ' <option value="">'.&mt('Please select').'</option>'."\n";
-    }
+    $options = '<select name="defaultrole">'."\n".
+               ' <option value="">'.&mt('Please select').'</option>'."\n"; 
     if ($context eq 'course') {
         $options .= &default_course_roles($context,$checkpriv,$crstype,%customroles);
     } elsif ($context eq 'author') {
@@ -1450,8 +1448,12 @@ sub print_userlist {
     }
     if (!(($context eq 'domain') && 
           (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) {
-        $r->print('&nbsp;'.&list_submit_button(&mt('Update Display')).
-                  "\n</p>\n");
+        $r->print(
+            "\n</p>\n"
+           .'<p>'
+           .&list_submit_button(&mt('Update Display'))
+           ."</p>\n"
+        );
     }
     my ($indexhash,$keylist) = &make_keylist_array();
     my (%userlist,%userinfo,$clearcoursepick);
@@ -1690,7 +1692,7 @@ sub role_filter {
         $role_select .= '</select>';
         $output = '<label><span class="LC_nobreak">'
                  .&mt('Role: [_1]',$role_select)
-                 .'</span></label>';
+                 .'</span></label> ';
     }
     return $output;
 }
@@ -1730,7 +1732,7 @@ sub section_group_filter {
         }
         if (@options > 0) {
             my $currsel;
-            $markup = '<select name="'.$name{$item}.'" />'."\n";
+            $markup = '<select name="'.$name{$item}.'">'."\n";
             foreach my $option ('all','none',@options) { 
                 $currsel = '';
                 if ($env{'form.'.$name{$item}} eq $option) {
@@ -1745,7 +1747,9 @@ sub section_group_filter {
                 $markup .= '</option>'."\n";
             }
             $markup .= '</select>'."\n";
-            $output .= ('&nbsp;'x3).'<label>'.$title{$item}.': '.$markup.'</label>';
+            $output .= ('&nbsp;'x3).'<span class="LC_nobreak">'
+                      .'<label>'.$title{$item}.': '.$markup.'</label>'
+                      .'</span> ';
         }
     }
     return $output;
@@ -2399,7 +2403,7 @@ END
             if ($env{'form.userwin'}) {
                 $checkwin = ' checked="checked"';
             }
-            $output .= '</td><td valign="top"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>';
+            $output .= '</td><td valign="top"  style="border-left: 1px solid;"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>';
         }
         $output .= "\n".'<div class="LC_clear_float_footer">&nbsp;</div>'."\n".
                   &Apache::loncommon::start_data_table().
@@ -2939,7 +2943,7 @@ sub print_username_link {
         $output = $in->{'username'};
     } else {
         $output = '<a href="javascript:username_display_launch('.
-                  "'$in->{'username'}','$in->{'domain'}'".')" />'.
+                  "'$in->{'username'}','$in->{'domain'}'".')">'.
                   $in->{'username'}.'</a>';
     }
     return $output;
@@ -3193,7 +3197,6 @@ ENDJS
                 $date_items;
     if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') {
         my ($cnum,$cdom) = &get_course_identity();
-        my $crstype = &Apache::loncommon::course_type();
         if ($crstype eq 'Community') {
             $lt{'fors'} = &mt('For member roles changing the section, will result in a section switch as members may only be in one section of a community at a time.');
             $lt{'forn'} = &mt('For a role in a community that is not a member role, a user may have roles in more than one section of a community at a time.');
@@ -3657,7 +3660,7 @@ sub print_first_users_upload_form {
     $str .= '<input type="hidden" name="action" value="upload" />';
     $str .= '<input type="hidden" name="state"  value="got_file" />';
 
-    $str .= '<h3>'.&mt('Upload a file containing information about users').'</h3>'."\n";
+    $str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n";
 
     # Excel and CSV Help
     $str .= '<div class="LC_left_float">'
@@ -3668,8 +3671,15 @@ sub print_first_users_upload_form {
                 &mt("How do I create a CSV file from a spreadsheet"))
            .'</div><br clear="all" />'."\n";
     $str .= &Apache::lonhtmlcommon::start_pick_box()
-           .&Apache::lonhtmlcommon::row_title(&mt('File'))
-           .&Apache::loncommon::upfile_select_html()
+           .&Apache::lonhtmlcommon::row_title(&mt('File'));
+    if (&Apache::lonlocal::current_language() ne 'en') {
+        if ($context eq 'course') { 
+            $str .= '<p class="LC_info">'."\n"
+                   .&mt('Please upload an UTF8 encoded file to ensure a correct character encoding in your classlist.')."\n"
+                   .'</p>'."\n";
+        }
+    }
+    $str .= &Apache::loncommon::upfile_select_html()
            .&Apache::lonhtmlcommon::row_closure()
            .&Apache::lonhtmlcommon::row_title(
                 '<label for="noFirstLine">'
@@ -4822,16 +4832,21 @@ sub setsections_javascript {
                     plch => 'Please choose a different section name.',
                     mnot => 'may not be used as a section name, as it is the name of a course group.',
                     secn => 'Section names and group names must be distinct. Please choose a different section name.',
+                    nonw => 'Section names may only contain letters or numbers.',
                  );                
     $setsection_js .= <<"ENDSECCODE";
 
 function setSections(formname,crstype) {
     var re1 = /^currsec_/;
+    var re2 =/\\W/;
+    var trimleading = /^\\s+/;
+    var trimtrailing = /\\s+\$/;
     var groups = new Array($groupslist);
     for (var i=0;i<formname.elements.length;i++) {
         var str = formname.elements[i].name;
         var checkcurr = str.match(re1);
         if (checkcurr != null) {
+            var num = i;
             if ($checkincluded) {
                 $rolecode
                 if (role == 'cc' || role == 'co') {
@@ -4843,38 +4858,60 @@ function setSections(formname,crstype) {
                 } else {
                     var sections = '';
                     var numsec = 0;
-                    var sections;
-                    for (var j=0; j<formname.elements[i].length; j++) {
-                        if (formname.elements[i].options[j].selected == true ) {
-                            if (formname.elements[i].options[j].value != "") {
+                    var fromexisting = new Array();
+                    for (var j=0; j<formname.elements[num].length; j++) {
+                        if (formname.elements[num].options[j].selected == true ) {
+                            var addsec = formname.elements[num].options[j].value;
+                            if (addsec != "") {
+                                fromexisting.push(addsec);
                                 if (numsec == 0) {
-                                    if (formname.elements[i].options[j].value != "") {
-                                        sections = formname.elements[i].options[j].value;
-                                        numsec ++;
-                                    }
-                                }
-                                else {
-                                    sections = sections + "," +  formname.elements[i].options[j].value
-                                    numsec ++;
+                                    sections = addsec;
+                                } else {
+                                    sections = sections + "," +  addsec;
                                 }
+                                numsec ++;
                             }
                         }
                     }
-                    if (numsec > 0) {
-                        if (formname.elements[i+1].value != "" && formname.elements[i+1].value != null) {
-                            sections = sections + "," +  formname.elements[i+1].value;
-                        }
-                    }
-                    else {
-                        sections = formname.elements[i+1].value;
-                    }
-                    var newsecs = formname.elements[i+1].value;
-                    var numsplit;
+                    var newsecs = formname.elements[num+1].value;
+                    var validsecs = new Array();
+                    var validsecstr = '';
+                    var badsecs = new Array();
                     if (newsecs != null && newsecs != "") {
-                        numsplit = newsecs.split(/,/g);
-                        numsec = numsec + numsplit.length;
+                        var numsplit;
+                        if (newsecs.indexOf(',') == -1) {
+                            numsplit = new Array(newsecs);
+                        } else {
+                            numsplit = newsecs.split(/,/g);
+                        }
+                        for (var i=0; i<numsplit.length; i++) {
+                            var newsec = numsplit[i];
+                            newsec = newsec.replace(trimleading,'');
+                            newsec = newsec.replace(trimtrailing,'');
+                            if (re2.test(newsec) == true) {
+                                badsecs.push(newsec);
+                            } else {
+                                if (newsec != '') {
+                                    var isnew = 1;
+                                    if (fromexisting != null) {
+                                        for (var m=0; m<fromexisting.length; m++) {
+                                            if (newsec == fromexisting[m]) {
+                                                isnew = 0;
+                                            }
+                                        }
+                                    }
+                                    if (isnew == 1) {
+                                        validsecs.push(newsec);
+                                    }
+                                }
+                            }
+                        }
+                        if (badsecs.length > 0) {
+                            alert("$alerts{'nonw'}\\n$alerts{'plch'}");
+                            return;
+                        }
+                        numsec = numsec + validsecs.length;
                     }
-
                     if ((role == 'st') && (numsec > 1)) {
                         if (crstype == 'Community') {
                             alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");
@@ -4882,25 +4919,36 @@ function setSections(formname,crstype) {
                             alert("$alerts{'inco'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}");
                         }
                         return;
-                    }
-                    else {
-                        if (numsplit != null) {
-                            for (var j=0; j<numsplit.length; j++) {
-                                if ((numsplit[j] == 'all') ||
-                                    (numsplit[j] == 'none')) {
-                                    alert("'"+numsplit[j]+"' $alerts{'mayn'}\\n$alerts{'plch'}");
+                    } else {
+                        if (validsecs != null) {
+                            for (var j=0; j<validsecs.length; j++) {
+                                if (validsecstr == '' || validsecstr == null) {
+                                    validsecstr = validsecs[j];
+                                } else {
+                                    validsecstr += ','+validsecs[j];
+                                }
+                                if ((validsecs[j] == 'all') ||
+                                    (validsecs[j] == 'none')) {
+                                    alert("'"+validsecs[j]+"' $alerts{'mayn'}\\n$alerts{'plch'}");
                                     return;
                                 }
                                 for (var k=0; k<groups.length; k++) {
-                                    if (numsplit[j] == groups[k]) {
-                                        alert("'"+numsplit[j]+"' $alerts{'mnot'}\\n$alerts{'secn'}");
+                                    if (validsecs[j] == groups[k]) {
+                                        alert("'"+validsecs[j]+"' $alerts{'mnot'}\\n$alerts{'secn'}");
                                         return;
                                     }
                                 }
                             }
                         }
-                        formname.elements[i+2].value = sections;
                     }
+                    if ((validsecstr != '') && (validsecstr != null)) {
+                        if (numsec > 0) {
+                            sections = sections + "," + validsecstr;
+                        } else {
+                            sections = validsecstr;
+                        }
+                    }
+                    formname.elements[num+2].value = sections;
                 }
             }
         }
@@ -5025,22 +5073,14 @@ sub roles_by_context {
         if ($env{'request.role'} =~ m{^dc\./}) {
             push(@allroles,'ad');
         }
-        if (&Apache::loncommon::needs_gci_custom()) {
-            if ($crstype eq 'Community') {
-                push(@allroles,'co');
-            } else {
-                push(@allroles,'cc');
-            }
+        push(@allroles,('ta','ep','in'));
+        if ($crstype eq 'Community') {
+            push(@allroles,'co');
         } else {
-            push(@allroles,('ta','ep','in'));
-            if ($crstype eq 'Community') {
-                push(@allroles,'co');
-            } else {
-                push(@allroles,'cc');
-            }
-            if ($custom) {
-                push(@allroles,'cr');
-            }
+            push(@allroles,'cc');
+        }
+        if ($custom) {
+            push(@allroles,'cr');
         }
     } elsif ($context eq 'author') {
         @allroles = ('ca','aa');