--- loncom/interface/loncommon.pm	2013/01/21 02:12:51	1.1113
+++ loncom/interface/loncommon.pm	2013/04/11 15:30:37	1.1121
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.1113 2013/01/21 02:12:51 raeburn Exp $
+# $Id: loncommon.pm,v 1.1121 2013/04/11 15:30:37 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -531,7 +531,8 @@ ENDAUTHORBRW
 }
 
 sub coursebrowser_javascript {
-    my ($domainfilter,$sec_element,$formname,$role_element,$crstype) = @_;
+    my ($domainfilter,$sec_element,$formname,$role_element,$crstype,
+        $credits_element) = @_;
     my $wintitle = 'Course_Browser';
     if ($crstype eq 'Community') {
         $wintitle = 'Community_Browser';
@@ -594,8 +595,9 @@ sub coursebrowser_javascript {
     }
 $id_functions
 ENDSTDBRW
-    if (($sec_element ne '') || ($role_element ne '')) {
-        $output .= &setsec_javascript($sec_element,$formname,$role_element);
+    if (($sec_element ne '') || ($role_element ne '') || ($credits_element ne '')) {
+        $output .= &setsec_javascript($sec_element,$formname,$role_element,
+                                      $credits_element);
     }
     $output .= '
 // ]]>
@@ -752,7 +754,7 @@ ENDUSERBRW
 }
 
 sub setsec_javascript {
-    my ($sec_element,$formname,$role_element) = @_;
+    my ($sec_element,$formname,$role_element,$credits_element) = @_;
     my (@courserolenames,@communityrolenames,$rolestr,$courserolestr,
         $communityrolestr);
     if ($role_element ne '') {
@@ -847,6 +849,14 @@ function setRole(crstype) {
 }
 |;
     }
+    if ($credits_element) {
+        $setsections .= qq|
+function setCredits(defaultcredits) {
+    document.$formname.$credits_element.value = defaultcredits;
+    return;
+}
+|;
+    }
     return $setsections;
 }
 
@@ -993,7 +1003,7 @@ sub select_language {
     my ($name,$selected,$includeempty) = @_;
     my %langchoices;
     if ($includeempty) {
-        %langchoices = ('' => &mt('No language preference'));
+        %langchoices = ('' => 'No language preference');
     }
     foreach my $id (&languageids()) {
         my $code = &supportedlanguagecode($id);
@@ -1001,6 +1011,7 @@ sub select_language {
             $langchoices{$code} = &plainlanguagedescription($id);
         }
     }
+    %langchoices = &Apache::lonlocal::texthash(%langchoices);
     return &select_form($selected,$name,\%langchoices);
 }
 
@@ -1059,6 +1070,12 @@ linked_select_forms takes the following
 
 =item * $menuorder, the order of values in the first menu
 
+=item * $onchangefirst, additional javascript call to execute for an onchange
+        event for the first <select> tag
+
+=item * $onchangesecond, additional javascript call to execute for an onchange
+        event for the second <select> tag
+
 =back 
 
 Below is an example of such a hash.  Only the 'text', 'default', and 
@@ -1112,6 +1129,8 @@ sub linked_select_forms {
         $secondselectname, 
         $hashref,
         $menuorder,
+        $onchangefirst,
+        $onchangesecond
         ) = @_;
     my $second = "document.$formname.$secondselectname";
     my $first = "document.$formname.$firstselectname";
@@ -1168,7 +1187,7 @@ function select1_changed() {
 </script>
 END
     # output the initial values for the selection lists
-    $result .= "<select size=\"1\" name=\"$firstselectname\" onchange=\"select1_changed()\">\n";
+    $result .= "<select size=\"1\" name=\"$firstselectname\" onchange=\"select1_changed();$onchangefirst\">\n";
     my @order = sort(keys(%{$hashref}));
     if (ref($menuorder) eq 'ARRAY') {
         @order = @{$menuorder};
@@ -1181,7 +1200,11 @@ END
     $result .= "</select>\n";
     my %select2 = %{$hashref->{$firstdefault}->{'select2'}};
     $result .= $middletext;
-    $result .= "<select size=\"1\" name=\"$secondselectname\">\n";
+    $result .= "<select size=\"1\" name=\"$secondselectname\"";
+    if ($onchangesecond) {
+        $result .= ' onchange="'.$onchangesecond.'"';
+    }
+    $result .= ">\n";
     my $seconddefault = $hashref->{$firstdefault}->{'default'};
     
     my @secondorder = sort(keys(%select2));
@@ -2168,7 +2191,7 @@ sub select_level_form {
 
 =pod
 
-=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms)
+=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms)
 
 Returns a string containing a <select name='$name' size='1'> form to 
 allow a user to select the domain to preform an operation in.  
@@ -2181,25 +2204,31 @@ If the $showdomdesc flag is set, the dom
 
 The optional $onchange argument specifies what should occur if the domain selector is changed, e.g., 'this.form.submit()' if the form is to be automatically submitted.
 
-The optional $incdoms is a reference to an array of domains which will be the only available options. 
+The optional $incdoms is a reference to an array of domains which will be the only available options.
+
+The optional $excdoms is a reference to an array of domains which will be excluded from the available options.
 
 =cut
 
 #-------------------------------------------
 sub select_dom_form {
-    my ($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms) = @_;
+    my ($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms) = @_;
     if ($onchange) {
         $onchange = ' onchange="'.$onchange.'"';
     }
-    my @domains;
+    my (@domains,%exclude);
     if (ref($incdoms) eq 'ARRAY') {
         @domains = sort {lc($a) cmp lc($b)} (@{$incdoms});
     } else {
         @domains = sort {lc($a) cmp lc($b)} (&Apache::lonnet::all_domains());
     }
     if ($includeempty) { @domains=('',@domains); }
+    if (ref($excdoms) eq 'ARRAY') {
+        map { $exclude{$_} = 1; } @{$excdoms}; 
+    }
     my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange>\n";
     foreach my $dom (@domains) {
+        next if ($exclude{$dom});
         $selectdomain.="<option value=\"$dom\" ".
             ($dom eq $defdom ? 'selected="selected" ' : '').'>'.$dom;
         if ($showdomdesc) {
@@ -5724,7 +5753,8 @@ table.LC_nested tr.LC_empty_row td {
   padding: 8px;
 }
 
-table.LC_data_table tr.LC_empty_row td {
+table.LC_data_table tr.LC_empty_row td,
+table.LC_data_table tr.LC_footer_row td {
   background-color: $sidebg;
 }
 
@@ -6705,7 +6735,7 @@ ul#LC_secondary_menu li ul li {
   vertical-align: top;
   border-left: 1px solid black;
   border-right: 1px solid black;
-  background-color: $data_table_light
+  background-color: $data_table_light;
   list-style:none;
   float: none;
 }
@@ -8201,7 +8231,19 @@ sub get_sections {
     my %sectioncount;
     my $now = time;
 
-    if (!defined($possible_roles) || (grep(/^st$/,@$possible_roles))) {
+    my $check_students = 1;
+    my $only_students = 0;
+    if (ref($possible_roles) eq 'ARRAY') {
+        if (grep(/^st$/,@{$possible_roles})) {
+            if (@{$possible_roles} == 1) {
+                $only_students = 1;
+            }
+        } else {
+            $check_students = 0;
+        }
+    }
+
+    if ($check_students) { 
 	my ($classlist) = &Apache::loncoursedata::get_classlist($cdom,$cnum);
 	my $sec_index = &Apache::loncoursedata::CL_SECTION();
 	my $status_index = &Apache::loncoursedata::CL_STATUS();
@@ -8228,6 +8270,9 @@ sub get_sections {
 	    }
 	}
     }
+    if ($only_students) {
+        return %sectioncount;
+    }
     my %courseroles = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum);
     foreach my $user (sort(keys(%courseroles))) {
 	if ($user !~ /^(\w{2})/) { next; }
@@ -8375,7 +8420,7 @@ sub get_course_users {
                               active   => 'Active',
                               future   => 'Future',
                             );
-        my %nothide;
+        my (%nothide,@possdoms);
         if ($hidepriv) {
             my %coursehash=&Apache::lonnet::coursedescription($cdom.'_'.$cnum);
             foreach my $user (split(/\s*\,\s*/,$coursehash{'nothideprivileged'})) {
@@ -8385,6 +8430,10 @@ sub get_course_users {
                     $nothide{$user} = 1;
                 }
             }
+            my @possdoms = ($cdom);
+            if ($coursehash{'checkforpriv'}) {
+                push(@possdoms,split(/,/,$coursehash{'checkforpriv'}));
+            }
         }
         foreach my $person (sort(keys(%coursepersonnel))) {
             my $match = 0;
@@ -8420,7 +8469,7 @@ sub get_course_users {
                 }
                 if ($uname ne '' && $udom ne '') {
                     if ($hidepriv) {
-                        if ((&Apache::lonnet::privileged($uname,$udom)) &&
+                        if ((&Apache::lonnet::privileged($uname,$udom,\@possdoms)) &&
                             (!$nothide{$uname.':'.$udom})) {
                             next;
                         }
@@ -10084,7 +10133,7 @@ sub upload_embedded {
             $output .= &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1).'<br />';
             next;
         } elsif ($fname=~/\.(\d+)\.(\w+)$/) {
-            $output .= &mt('File name not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2).'<br />';
+            $output .= &mt('Filename not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2).'<br />';
             next;
         }
         $env{'form.embedded_item_'.$i.'.filename'}=$fname;
@@ -10786,8 +10835,8 @@ sub process_decompression {
     my ($docudom,$docuname,$file,$destination,$dir_root,$hiddenelem) = @_;
     my ($dir,$error,$warning,$output);
     if ($file !~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) {
-        $error = &mt('File name not a supported archive file type.').
-                 '<br />'.&mt('File name should end with one of: [_1].',
+        $error = &mt('Filename not a supported archive file type.').
+                 '<br />'.&mt('Filename should end with one of: [_1].',
                               '.zip, .tar, .bz2, .gz, .tar.gz, .tar.bz2, .tgz');
     } else {
         my $docuhome = &Apache::lonnet::homeserver($docuname,$docudom);
@@ -13175,7 +13224,7 @@ sub commit_customrole {
 }
 
 sub commit_standardrole {
-    my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_;
+    my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context,$credits) = @_;
     my ($output,$logmsg,$linefeed);
     if ($context eq 'auto') {
         $linefeed = "\n";
@@ -13184,7 +13233,7 @@ sub commit_standardrole {
     }  
     if ($three eq 'st') {
         my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end,
-                                         $one,$two,$sec,$context);
+                                         $one,$two,$sec,$context,$credits);
         if (($result =~ /^error/) || ($result eq 'not_in_class') || 
             ($result eq 'unknown_course') || ($result eq 'refused')) {
             $output = $logmsg.' '.&mt('Error: ').$result."\n"; 
@@ -13215,7 +13264,8 @@ sub commit_standardrole {
 }
 
 sub commit_studentrole {
-    my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_;
+    my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context,
+        $credits) = @_;
     my ($result,$linefeed,$oldsecurl,$newsecurl);
     if ($context eq 'auto') {
         $linefeed = "\n";
@@ -13262,7 +13312,11 @@ sub commit_studentrole {
             }
         }
         if (($expire_role_result eq 'ok') || ($secchange == 0)) {
-            $modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid,'',$context);
+            $modify_section_result = 
+                &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,
+                                                           undef,undef,undef,$sec,
+                                                           $end,$start,'','',$cid,
+                                                           '',$context,$credits);
             if ($modify_section_result =~ /^ok/) {
                 if ($secchange == 1) {
                     if ($sec eq '') {
@@ -13284,7 +13338,7 @@ sub commit_studentrole {
                     }
                 }
             } else {
-                if ($secchange) {       
+                if ($secchange) { 
                     $$logmsg .= &mt('Error when attempting section change for [_1] from old section "[_2]" to new section: "[_3]" in course [_4] -error:',$uname,$oldsec,$sec,$cid).' '.$modify_section_result.$linefeed;
                 } else {
                     $$logmsg .= &mt('Error when attempting to modify role for [_1] for section: "[_2]" in course [_3] -error:',$uname,$sec,$cid).' '.$modify_section_result.$linefeed;
@@ -13502,6 +13556,7 @@ sub construct_course {
                    'pch.users.denied',
                    'plc.users.denied',
                    'hidefromcat',
+                   'checkforpriv',
                    'categories'],
                    $$crsudom,$$crsunum);
     }
@@ -13531,6 +13586,9 @@ sub construct_course {
     } else {
         $cenv{'internal.courseowner'} = $args->{'curruser'};
     }
+    if ($args->{'defaultcredits'}) {
+        $cenv{'internal.defaultcredits'} = $args->{'defaultcredits'};
+    }
     my @badclasses = (); # Used to accumulate sections/crosslistings that did not pass classlist access check for course owner.
     if ($args->{'crssections'}) {
         $cenv{'internal.sectionnums'} = '';
@@ -13555,6 +13613,11 @@ sub construct_course {
 # do not hide course coordinator from staff listing, 
 # even if privileged
     $cenv{'nothideprivileged'}=$args->{'ccuname'}.':'.$args->{'ccdomain'};
+# add course coordinator's domain to domains to check for privileged users
+# if different to course domain
+    if ($$crsudom ne $args->{'ccdomain'}) {
+        $cenv{'checkforpriv'} = $args->{'ccdomain'};
+    }
 # add crosslistings
     if ($args->{'crsxlist'}) {
         $cenv{'internal.crosslistings'}='';