--- loncom/interface/loncommon.pm	2004/11/13 21:06:27	1.231
+++ loncom/interface/loncommon.pm	2004/12/01 23:18:23	1.237
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.231 2004/11/13 21:06:27 albertel Exp $
+# $Id: loncommon.pm,v 1.237 2004/12/01 23:18:23 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -375,12 +375,11 @@ sub selectstudent_link {
 }
 
 sub coursebrowser_javascript {
-    my ($domainfilter,$roleelement)=@_;
+    my ($domainfilter)=@_;
    return (<<ENDSTDBRW);
 <script type="text/javascript" language="Javascript" >
-    var extra_element = "$roleelement" 
     var stdeditbrowser;
-    function opencrsbrowser(formname,uname,udom,desc) {
+    function opencrsbrowser(formname,uname,udom,desc,extra_element) {
         var url = '/adm/pickcourse?';
         var filter;
         if (filter != null) {
@@ -397,8 +396,11 @@ sub coursebrowser_javascript {
         url += 'form=' + formname + '&cnumelement='+uname+
 	                            '&cdomelement='+udom+
                                     '&cnameelement='+desc;
-        if (extra_element != '') {
-            url += '&roleelement=$roleelement';
+        if (extra_element !=null && extra_element != '' && formname == 'rolechoice') {
+            url += '&roleelement='+extra_element;
+            if (domainfilter == null || domainfilter == '') {
+                url += '&domainfilter='+extra_element;
+            }
         }
         var title = 'Course_Browser';
         var options = 'scrollbars=1,resizable=1,menubar=0';
@@ -411,9 +413,9 @@ ENDSTDBRW
 }
 
 sub selectcourse_link {
-   my ($form,$unameele,$udomele,$desc)=@_;
+   my ($form,$unameele,$udomele,$desc,$extra_element)=@_;
     return "<a href='".'javascript:opencrsbrowser("'.$form.'","'.$unameele.
-        '","'.$udomele.'","'.$desc.'");'."'>".&mt('Select Course')."</a>";
+        '","'.$udomele.'","'.$desc.'","'.$extra_element.'");'."'>".&mt('Select Course')."</a>";
 }
 
 =pod
@@ -2283,7 +2285,7 @@ sub get_student_view {
   if (defined($moreenv)) {
       %form=(%form,%{$moreenv});
   }
-  if ($target eq 'tex') {$form{'grade_target'} = 'tex';}
+  if (defined($target)) { $form{'grade_target'} = $target; }
   $feedurl=&Apache::lonnet::clutter($feedurl);
   my $userview=&Apache::lonnet::ssi_body($feedurl,%form);
   $userview=~s/\<body[^\>]*\>//gi;
@@ -2597,27 +2599,41 @@ ENDROLE
 		$font.'"><b>'.$title.'</b></font>';
         if ($customtitle) {
             $titleinfo = $customtitle;
-        } 
+        }
+
 	if ($ENV{'request.state'} eq 'construct') {
 	    my ($uname,$thisdisfn)=
 		($ENV{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|);
 	    my $formaction='/priv/'.$uname.'/'.$thisdisfn;
 	    $formaction=~s/\/+/\//g;
-	    $titleinfo = '<form name="dirs" method="post" action="'.$formaction
-		.'" target="_top">'
-		.&Apache::lonhtmlcommon::crumbs($uname.'/'.$thisdisfn,'_top','/priv','',-1,1)."<br />"
-		.&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()')
-		.'</form>'
-		.&Apache::lonmenu::constspaceform();
-
-	    &Apache::lonhtmlcommon::store_recent('construct',$formaction,$formaction);
-	    if ($thisdisfn!~m|/$|) {  $forcereg=1; }
-	}
+            unless ($customtitle) {  #this is for resources; directories have customtitle, and crumbs and select recent are created in lonpubdir.pm  
+                my $parentpath = '';
+                if ($thisdisfn =~ m-(.+/)[^/]*$-) {
+                    $parentpath = $1;
+                }
+	        $titleinfo = &Apache::loncommon::help_open_menu('','','','',3,'Authoring').
+                      '<font face="Arial, Helvetica, sans-serif"><b>Construction Space</b>:</font>&nbsp;'. 
+                      '<form name="dirs" method="post" action="'.$formaction
+		    .'" target="_top"><tt><b>'
+		    .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv','','+1',1)."</b></tt><br />"
+		    .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()')
+		    .'</form>'
+		    .&Apache::lonmenu::constspaceform();
 
-	&Apache::lonnet::logthis("hrrm");
-        return $bodytag.&Apache::lonmenu::menubuttons($forcereg,'web',
-                                                      $forcereg).
-      '<table bgcolor="'.$pgbg.'" width="100%" border="0" cellspacing="3" cellpadding="3"><tr><td rowspan="3" bgcolor="'.$tabbg.'">'.$titleinfo.'</td>'.$roleinfo.'</tr></table>';
+            }
+	    $forcereg=1;
+        }
+        my $titletable = '<table bgcolor="'.$pgbg.'" width="100%" border="0" '.
+                         'cellspacing="3" cellpadding="3">'.
+                         '<tr><td rowspan="3" bgcolor="'.$tabbg.'">'.
+                         $titleinfo.'</td>'.$roleinfo.'</tr></table>';
+        if ($ENV{'request.state'} eq 'construct') {
+            $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg,$titletable);
+	} else {
+            $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg).
+                        $titletable;
+        }
+        return $bodytag;
     }
 
 #
@@ -2684,6 +2700,76 @@ sub get_users_function {
 
 ###############################################
 
+=pod
+
+=item get_sections
+
+Determines all the sections for a course including
+sections with students and sections containing other roles.
+Incoming parameters: domain, course number, reference to 
+section hash (keys to be section/group IDs), reference to 
+array containing roles for which sections should be gathered
+(optional). If the fourth argument is undefined, sections
+are gathered for any role.
+ 
+Returns number of sections.
+
+=cut
+
+###############################################
+sub get_sections {
+    my ($cdom,$cnum,$sectioncount,$possible_roles) = @_;
+    my $cid = $cdom.'_'.$cnum;
+    my $numsections = 0;
+    if ($cdom && $cnum) {
+        if (!defined($possible_roles) || (grep/^st$/,@$possible_roles)) {
+            my ($classlist) = &Apache::loncoursedata::get_classlist($cid,$cdom,$cnum);
+            my $sec_index = &Apache::loncoursedata::CL_SECTION();
+            my $status_index = &Apache::loncoursedata::CL_STATUS();
+            while (my ($student,$data) = each %$classlist) {
+                my ($section,$status) = ($data->[$sec_index],
+                                         $data->[$status_index]);
+                unless ($section eq '' || $section =~ /^\s*$/) {
+                    if (!defined($$sectioncount{$section})) {
+                        $$sectioncount{$section} = 1;
+                        $numsections ++;
+                    } else {
+                        $$sectioncount{$section} ++;
+                    }
+                }
+            }
+        }
+        my %courseroles = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum);
+        foreach my $user (sort keys %courseroles) {
+            if ($user =~ /^(\w{2})/) {
+                my $role = $1;
+                if (!defined($possible_roles) || (grep/^$role$/,@$possible_roles)) {
+                    if ($role eq 'cr') {
+                        if ($user =~ m-^$role/[^/]*/[^/]*/[^/]*:[^:]*:[^:]*:(\w+)-) {
+                            if (!defined($$sectioncount{$1})) {
+                                $$sectioncount{$1} = 1;
+                                $numsections ++;
+                            } else {
+                                $$sectioncount{$1} ++;
+                            }
+                        }
+                    }
+                    if ($user =~ /^$role:[^:]*:[^:]*:(\w+)/) {
+                        if (!defined($$sectioncount{$1})) {
+                            $$sectioncount{$1} = 1;
+                            $numsections ++;
+                        } else {
+                            $$sectioncount{$1} ++;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return $numsections;
+}
+
+
 sub get_posted_cgi {
     my $r=shift;