--- loncom/interface/lonhelper.pm	2015/08/28 22:44:59	1.197
+++ loncom/interface/lonhelper.pm	2022/06/27 20:35:51	1.204
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # .helper XML handler to implement the LON-CAPA helper
 #
-# $Id: lonhelper.pm,v 1.197 2015/08/28 22:44:59 raeburn Exp $
+# $Id: lonhelper.pm,v 1.204 2022/06/27 20:35:51 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1800,7 +1800,7 @@ sub render {
 	if (lc($time) eq 'anytime') {
 	    $anytime=1;
 	    $date = &get_date_object(time);
-	    $date->min(0);
+            $date->set_minute(0);
 	} elsif (defined($time) && $time ne 0) {
 	    $date = &get_date_object($time);
 	} else {
@@ -1810,7 +1810,7 @@ sub render {
 
     if (!defined($date)) {
 	$date = &get_date_object(time);
-	$date->min(0);
+        $date->set_minute(0);
     }
 
     if ($anytime) {
@@ -2047,7 +2047,9 @@ be filtered out. The 'addstatus' attribu
 and long status display columns to the display. The 'addparts'
 attribute will add in a part selector beside problems that have more
 than 1 part. The 'includecourse' attribute if true, will include
-the toplevel default.sequence in the results.
+the toplevel default.sequence in the results. The 'modalLink' attribute,
+if true, will cause links to be launched as modal pop-ups, instead of 
+replacing the resource selection listing, currently being displayed. 
 
 =head3 SUB-TAGS
 
@@ -2159,6 +2161,9 @@ sub start_resource {
     $paramHash->{'toponly'} = $token->[2]{'toponly'};
     $paramHash->{'addstatus'} = $token->[2]{'addstatus'};
     $paramHash->{'addparts'} = $token->[2]{'addparts'};
+    $paramHash->{'modalLink'} = $token->[2]{'modallink'};
+    $paramHash->{'nocurrloc'} = $token->[2]{'nocurrloc'};
+    $paramHash->{'suppressNavmap'} = $token->[2]{'suppressNavmap'};
     if ($paramHash->{'addparts'}) {
 	$helper->declareVar($paramHash->{'variable'}.'_part');
     }
@@ -2365,6 +2370,7 @@ BUTTONS
     my $option_texts   = $self->{OPTION_TEXTS};
     my $option_types   = $self->{OPTION_TYPES};
     my $addparts       = $self->{'addparts'};
+    my $modalLink      = $self->{'modalLink'};
     my $headings_done  = 0;
 
     # Evaluate the map url as needed
@@ -2464,7 +2470,7 @@ BUTTONS
 			    $resource_name . "'/> </td>";
 		    } else {
 			$col .= 
-			    "<td align='center'><input type=$option_type name ='$option_var".
+			    "<td align='center'><input type='$option_type' name ='$option_var".
 			    "_forminput' value='".
 			    $resource_name . "' $checked /> </td>";
 		    }
@@ -2540,6 +2546,10 @@ RADIO
 	push @$cols, (Apache::lonnavmaps::part_status_summary());
 	
     }
+    my $caller;
+    if ($helper->{TITLE} eq 'Printing Helper') {
+        $caller = 'printout';
+    }
     $result .= 
         &Apache::lonnavmaps::render( { 'cols' => $cols,
                                        'showParts' => 0,
@@ -2549,7 +2559,11 @@ RADIO
                                        'suppressEmptySequences' => $self->{'suppressEmptySequences'},
 				       'include_top_level_map' => $self->{'include_top_level_map'},
                                        'iterator_map' => $mapUrl,
-                                       'map_no_edit_link' => 1, } 
+                                       'map_no_edit_link' => 1,
+                                       'modalLink' => $modalLink,
+                                       'nocurrloc' => $self->{'nocurrloc'},
+                                       'suppressNavmap' => $self->{'suppressNavmap'},
+                                       'caller' => $caller, }
                                        );
 
     $result .= $buttons;
@@ -3322,7 +3336,7 @@ sub start_group {
     if ((!$paramHash->{'grouponly'}) || (&Apache::lonnet::allowed('mdg',$Apache::lonnet::env{'request.course.id'}))) {
         %curr_groups = &Apache::longroup::coursegroups();
     } elsif ($Apache::lonnet::env{'request.course.groups'} ne '') {
-        map { $curr_groups{$_} = 1; } split(/,/,$Apache::lonnet::env{'request.course.groups'});
+        map { $curr_groups{$_} = 1; } split(/:/,$Apache::lonnet::env{'request.course.groups'});
     }
     foreach my $group_name (sort {lc($a) cmp lc($b)} (keys(%curr_groups))) {
 	push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]);
@@ -3826,38 +3840,54 @@ sub render {
     if ($vars->{GRANULARITY} eq 'whole_course') {
         $resourceString .= '<li>'.&mt('for [_1]all resources in the course[_2]','<b>','</b>').'</li>';
 	if ($vars->{TARGETS} eq 'course') {
-	    $level = 14; # general course, see lonparmset.pm perldoc
+	    $level = 18; # general course, see lonparmset.pm perldoc
 	} elsif ($vars->{TARGETS} eq 'section') {
-	    $level = 9;
+	    $level = 12;
 	} elsif ($vars->{TARGETS} eq 'group') {
-	    $level = 6;
+	    $level = 8;
 	} else {
-	    $level = 3;
+	    $level = 4;
 	}
         $affectedResourceId = "0.0";
         $symb = 'a';
         $paramlevel = 'general';
-    } elsif ($vars->{GRANULARITY} eq 'map') {
+    } elsif (($vars->{GRANULARITY} eq 'map') || ($vars->{GRANULARITY} eq 'maprecurse')) {
         my $navmap = Apache::lonnavmaps::navmap->new();
         if (defined($navmap)) {
              my $res = $navmap->getByMapPc($vars->{RESOURCE_ID});
              my $title = $res->compTitle();
              $symb = $res->symb();
-             $resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>';
+             if ($vars->{GRANULARITY} eq 'map') {
+                 $resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>';
+             } else {
+                 $resourceString .= '<li>'.&mt('for the map named [_1] (applies recursively to sub-folders)',"<b>$title</b>").'</li>';
+             }
         } else {
             $resourceString .= '<li>'.&mt('for the map ID [_1] (name unavailable)','<b>'.$vars->{RESOURCE_ID}.'</b>').'</li>';
             &Apache::lonnet::logthis('Retrieval of map title failed in lonhelper.pm - could not create navmap object for course.');
 
         }
-	if ($vars->{TARGETS} eq 'course') {
-	    $level = 13; # general course, see lonparmset.pm perldoc
-	} elsif ($vars->{TARGETS} eq 'section') {
-	    $level = 8;
-	} elsif ($vars->{TARGETS} eq 'group') {
-	    $level = 5;
-	} else {
-	    $level = 2;
-	}
+        if ($vars->{GRANULARITY} eq 'maprecurse') {
+            if ($vars->{TARGETS} eq 'course') {
+                $level = 17; # general course, see lonparmset.pm perldoc
+            } elsif ($vars->{TARGETS} eq 'section') {
+                $level = 11;
+            } elsif ($vars->{TARGETS} eq 'group') {
+                $level = 7;
+            } else {
+                $level = 3;
+            }
+        } else {
+	    if ($vars->{TARGETS} eq 'course') {
+	        $level = 16; # general course, see lonparmset.pm perldoc
+	    } elsif ($vars->{TARGETS} eq 'section') {
+	        $level = 10;
+	    } elsif ($vars->{TARGETS} eq 'group') {
+	        $level = 6;
+	    } else {
+	        $level = 2;
+	    }
+        }
         $affectedResourceId = $vars->{RESOURCE_ID};
         $paramlevel = 'map';
     } else {
@@ -3874,11 +3904,11 @@ sub render {
             &Apache::lonnet::logthis('Retrieval of resource title failed in lonhelper.pm - could not create navmap object for course.');
         }
 	if ($vars->{TARGETS} eq 'course') {
-	    $level = 10; # general course, see lonparmset.pm perldoc
+	    $level = 13; # general course, see lonparmset.pm perldoc
 	} elsif ($vars->{TARGETS} eq 'section') {
-	    $level = 7;
+	    $level = 9;
 	} elsif ($vars->{TARGETS} eq 'group') {
-	    $level = 4;
+	    $level = 5;
 	} else {
 	    $level = 1;
 	}
@@ -3894,7 +3924,7 @@ sub render {
     if ($vars->{GRANULARITY} eq 'resource') {
 	$result .= "<input type='hidden' name='symb' value='".
 	    HTML::Entities::encode($symb,"'<>&\"") . "' />\n";
-    } elsif ($vars->{GRANULARITY} eq 'map') {
+    } elsif (($vars->{GRANULARITY} eq 'map') || ($vars->{GRANULARITY} eq 'maprecurse')) {
 	$result .= "<input type='hidden' name='pschp' value='".
 	    $affectedResourceId."' />\n";
     }