--- loncom/interface/lonprintout.pm	2003/01/08 15:05:52	1.102
+++ loncom/interface/lonprintout.pm	2003/02/04 22:22:07	1.111
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Printout
 #
-# $Id: lonprintout.pm,v 1.102 2003/01/08 15:05:52 sakharuk Exp $
+# $Id: lonprintout.pm,v 1.111 2003/02/04 22:22:07 sakharuk Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -159,10 +159,18 @@ sub sequence_content_menu {
     if ($sequence[0]=~/^uploaded/) {$primary_sequence = '/'.$sequence[0];} 
       else {$primary_sequence = '/res/'.$sequence[0];} 
     my @master_seq = &coming_from_hash($primary_sequence,$sequence[0]);
-    my @master_seq_view = sort @master_seq;
-    for (my $i=0;$i<=$#master_seq_view;$i++) {
-	$master_seq_view[$i]=~/\/([^\/]+)$/;
-	$master_seq_view[$i]=$1;
+    my @titles_master_seq = &titles_coming_from_hash($primary_sequence,$sequence[0]);
+    foreach my $entity (@titles_master_seq) {$entity=~/^(.*)&&/; $entity=$1}
+    my @master_seq_view = @master_seq;
+    if ($ENV{'user.adv'}) {
+      for (my $i=0;$i<=$#master_seq_view;$i++) {
+	 $master_seq_view[$i]=~/___\d+___(.+)$/;
+	 $master_seq_view[$i]='/'.$1;
+      }
+    } else {
+      for (my $i=0;$i<=$#master_seq_view;$i++) {
+         $master_seq_view[$i]=' ';
+      }
     }
     $r->print(<<ENDMENUOUT1);
 <input type="hidden" name="url" value="$ENV{'form.url'}">
@@ -191,25 +199,28 @@ sub sequence_content_menu {
     }
 </script>
 <input type=button onClick="checkall()" value="Check All">&nbsp;
-<input type=button onClick="uncheckall()" value="Uncheck">
+<input type=button onClick="uncheckall()" value="Uncheck">&nbsp;
+<input type="submit" value="Submit">
 <p>
 ENDMENUOUT1
     my $inc=0; 
     for (my $i=0;$i<=$#master_seq_view;$i++) {
-      if ($key_to==1 && $master_seq_view[$i]=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {
-	$r->print('<br /><input type=checkbox name="whatfile'.$inc.'" value="'.$master_seq[$i].'"> '."\n".
-                  $master_seq_view[$i]);
+      if ($key_to==1 && $master_seq[$i]=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {
+	$r->print('<br /><input type=checkbox name="whatfile'.$inc.'" value="'.$master_seq[$i].'"> '."\n".'<b>'.
+                  $titles_master_seq[$i].'</b>&nbsp;&nbsp;&nbsp;<small>'.$master_seq_view[$i].'</small>');
         $inc++;
-    } elsif ($key_to==0 && $master_seq_view[$i]=~/\.(problem|exam|quiz|assess|survey|form|library|xml|htm|html|page)$/) {
-	$r->print('<br /><input type=checkbox name="whatfile'.$inc.'" value="'.$master_seq[$i].'"> '.
-                  $master_seq_view[$i]);
+    } elsif ($key_to==0 && $master_seq[$i]=~/\.(problem|exam|quiz|assess|survey|form|library|xml|htm|html|page)$/) {
+	$r->print('<br /><input type=checkbox name="whatfile'.$inc.'" value="'.$master_seq[$i].'"> '."\n".'<b>'.
+                  $titles_master_seq[$i].'</b>&nbsp;&nbsp;&nbsp;<small>'.$master_seq_view[$i].'</small>');
         $inc++;
       }
     }
     $r->print(<<ENDMENUOUT2);
-<br />
+<br /><br />
 <input type="hidden" name="numberoffiles" value="$inc">
 <input type="hidden" name="phase" value="three">
+<input type=button onClick="checkall()" value="Check All">&nbsp;
+<input type=button onClick="uncheckall()" value="Uncheck">&nbsp;
 <input type="submit" value="Submit">
 ENDMENUOUT2
 
@@ -229,7 +240,8 @@ sub problem_choice_menu {
 	@content_directory = &Apache::lonnet::dirlist($subdirtoprint,
 						      $domain, $user,'');
     } else {
-	@content_directory = &Apache::lonnet::dirlist($subdirtoprint);
+        #local library server res space (allows to print only from the own library server)
+	@content_directory = &Apache::lonnet::dirlist($subdirtoprint,$ENV{'user.domain'}, $ENV{'user.name'},'');
     }
     for (my $iy=0;$iy<=$#content_directory;$iy++) {
 	my @tempo_array = split(/&/,$content_directory[$iy]);
@@ -268,7 +280,8 @@ sub problem_choice_menu {
     }
 </script>
 <input type=button onClick="checkall()" value="Check All">&nbsp;
-<input type=button onClick="uncheckall()" value="Uncheck">
+<input type=button onClick="uncheckall()" value="Uncheck">&nbsp;
+<input type="submit" value="Submit">
 <p>
 ENDMENUOUT1
     my $i=0;
@@ -278,10 +291,12 @@ ENDMENUOUT1
 	$i++;
     }
     $r->print(<<ENDMENUOUT2);
-<br />
+<br /><br />
 <input type="hidden" name="papersize" value="$ENV{'form.papersize'}">
 <input type="hidden" name="numberofproblems" value="$i">
 <input type="hidden" name="phase" value="three">
+<input type=button onClick="checkall()" value="Check All">&nbsp;
+<input type=button onClick="uncheckall()" value="Uncheck">&nbsp;
 <input type="submit" value="Submit">
 ENDMENUOUT2
 }
@@ -444,15 +459,18 @@ ENDPART
     my $number_of_columns = 1; #used only for pages to determine the width of the cell
     my $selectionmade = '';
     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$layout,$numberofcolumns);
-    my $LaTeXwidth;
- 
+    if ($numberofcolumns == 1) {
+	$textwidth=$ENV{'form.width'};
+	$textheight=$ENV{'form.height'};
+    }
+    my $LaTeXwidth; 
     if ($textwidth=~/(\d+\s*cm)/) {
 	$LaTeXwidth = $1*10;
     } elsif ($textwidth=~/(\d+\s*mm)/) {
 	$LaTeXwidth = $1;
     }
     if ($choice eq 'Standard LaTeX output for current document') {
-      #-- single document - problem, page, html, xml  
+      #-- single document - problem, page, html, xml, ...  
       $selectionmade = 1;
       if ($ENV{'form.url'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
         my %moreenv;
@@ -492,7 +510,7 @@ ENDPART
 	my $flag_latex_header_remove = 'NO';
 	my $flag_page_in_sequence = 'NO';
 	for (my $i=0;$i<=$#master_seq;$i++) {
-           my ($urlp,$symb) = split /&&/, $master_seq[$i];		
+           my ($urlp,$symb) = split /&&/, $master_seq[$i];
 	    if ($choice eq 'Standard LaTeX output for the primary sequence') {
               $selectionmade = 2;
 	    } elsif ($choice eq 'Standard LaTeX output for whole primary sequence') {
@@ -525,14 +543,20 @@ ENDPART
     }  elsif ($choice eq 'Standard LaTeX output for the top level sequence') {
         # where is the main sequence of the course?
 	$selectionmade = 4;
-	my $main_seq = '/res/'.$ENV{'request.course.uri'};
+	my $main_seq;
+	if ($ENV{'request.course.uri'}=~/\/?uploaded\//) {
+	    $main_seq = $ENV{'request.course.uri'};
+	} else {
+	    $main_seq = '/res/'.$ENV{'request.course.uri'};
+	}
 	my @file_seq = &coming_from_hash_whole($main_seq);
 	my $flag_latex_header_remove = 'NO';
         #-- produce an output string
 	for (my $i=0;$i<=$#file_seq;$i++) {
-            my ($urlp,$symb) = split /&&/, $file_seq[$i];
-	    $urlp=~s/\/home\/httpd\/html//;	    
-            if ($urlp=~m/\.(problem|exam|quiz|assess|survey|form|library)/) {
+	   if (not $file_seq[$i]=~/^&&/) {
+	     my ($urlp,$symb) = split /&&/, $file_seq[$i];
+	     $urlp=~s/\/home\/httpd\/html//;	    
+	     if ($urlp=~m/\.(problem|exam|quiz|assess|survey|form|library)/) {
 		my %moreenv;
 		$moreenv{'form.grade_target'}='tex';
 		$moreenv{'form.textwidth'}=$LaTeXwidth;
@@ -546,7 +570,8 @@ ENDPART
 		}
 		$result .= $texversion;  
 		$flag_latex_header_remove = 'YES';
-	    }		
+	     }		
+	   }
 	}	    
 	$result .= '\end{document}';
     } elsif ($choice eq 'All class print') { 
@@ -592,7 +617,7 @@ ENDPART
 	    }
 	    if ($current_output=~/\\documentclass/) {
 		my $courseidinfo = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
-		$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm}\\setlength{\\headheight}{1cm}\\setlength{\\headsep}{0.5cm}\\pagestyle{myheadings}\\markboth{}{{$courseidinfo  - $assignment}}\\begin{document}\\noindent\\textit{\\textbf{$fullname}}\\vskip 3 mm /;
+		$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm}\\usepackage{fancyhdr}\\pagestyle{fancy}\\rhead{}\\chead{}\\lhead{$courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}  \\begin{document}\\noindent\\textit{\\textbf{$fullname}}\\vskip 3 mm /;
 	    } else {
 		my $blanspages = '';
 		for (my $j=0;$j<$ENV{'form.addedpages'};$j++) {$blanspages.='\clearpage\strut\clearpage';}
@@ -622,6 +647,8 @@ ENDPART
 		&Apache::lonnet::appenv(%moreenv);
 		if ($urlp =~ m|/home/([^/]+)/public_html|) {
 		    $urlp =~ s|/home/([^/]*)/public_html|/~$1|;
+		} else {
+		    $urlp =~ s|^/home/httpd/html||;
 		}
 		my $texversion=&Apache::lonnet::ssi($urlp);
 		&Apache::lonnet::delenv('form.grade_target','form.textwidth');
@@ -697,10 +724,11 @@ sub coming_from_hash_whole {
 	if ($hash{'src_'.$current_resource}=~/\.sequence$/) {
 	    push @resourcelist,&coming_from_hash_whole($hash{'src_'.$current_resource});
 	} else {
-            $mainsequence =~ /\/res\/(.*)$/;
-	    my $presymb = $1;
+	    my $presymb; 
+	    if ($mainsequence =~ /\/res\/(.*)$/) {$presymb = $1;} 
+              elsif ($mainsequence =~ /\/?(uploaded\/(.*))$/) {$presymb = $1;} 
 	    my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}};
-            if ($rid=~/,/) {
+	    if ($rid=~/,/) {
 		my @rid = split /,/, $rid;
 		foreach my $rid_element (@rid) {
 		    if ($rid_element =~ m/^$mapid\.(\d*)/) {
@@ -709,7 +737,33 @@ sub coming_from_hash_whole {
 		    }
 		}
 	    } else {
-		$rid =~ m/^$mapid\.(\d*)/;
+	        $rid =~ m/^$mapid\.(\d*)/;
+                $rid = $1;  
+	    }
+	    $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/;
+	    my $symb = $presymb.'___'.$rid.'___'.$1;	    
+	    push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$symb;
+	}
+	$current_resource = $hash{'goesto_'.$hash{'to_'.$current_resource}};
+    } 
+    #needs if final resource in the map (type="finish") contains something
+	if ($hash{'src_'.$current_resource}=~/\.sequence$/) {
+	    push @resourcelist,&coming_from_hash_whole($hash{'src_'.$current_resource});
+	} else {
+	    my $presymb; 
+	    if ($mainsequence =~ /\/res\/(.*)$/) {$presymb = $1;} 
+              elsif ($mainsequence =~ /\/?(uploaded\/(.*))$/) {$presymb = $1;} 
+	    my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}};
+	    if ($rid=~/,/) {
+		my @rid = split /,/, $rid;
+		foreach my $rid_element (@rid) {
+		    if ($rid_element =~ m/^$mapid\.(\d*)/) {
+			$rid = $1; 
+			last;
+		    }
+		}
+	    } else {
+	        $rid =~ m/^$mapid\.(\d*)/;
                 $rid = $1;  
 	    }
 	    $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/;
@@ -717,7 +771,6 @@ sub coming_from_hash_whole {
 	    push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$symb;
 	}
 	$current_resource = $hash{'goesto_'.$hash{'to_'.$current_resource}};
-    }
     return @resourcelist;
 }
 
@@ -786,6 +839,69 @@ sub coming_from_hash {
 }
 
 
+sub titles_coming_from_hash {
+
+    my ($mainsequence,$symb) = @_;
+    my @resourcelist = ();
+    my $mapid = $hash{'map_pc_'.$mainsequence};
+    my $mapstart = $hash{'map_start_'.$mainsequence};
+    my $mapfinish = $hash{'map_finish_'.$mainsequence};
+    my ($presymb);
+    if ($symb) {
+	($presymb)=split(/___/,$symb);
+    } else {
+	$presymb=$mainsequence;
+	$presymb=~s|^/res/||;
+    }
+    $presymb = $presymb.'___';
+    my $current_resource = $mapstart;
+    while ($current_resource ne $mapfinish) {
+	if (not $hash{'src_'.$current_resource}=~/\.sequence$/) {
+	    my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}};
+            if ($rid=~/,/) {
+		my @rid = split /,/, $rid;
+		foreach my $rid_element (@rid) {
+		    if ($rid_element =~ m/^$mapid\.(\d*)/) {
+			$rid = $1; 
+			last;
+		    }
+		}
+	    } else {
+		$rid =~ m/^$mapid\.(\d*)/;
+                $rid = $1;  
+	    }
+	    $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/;
+	    $symb = $presymb.$rid.'___'.$1;
+	    push @resourcelist,$hash{'title_'.$current_resource}.'&&'.$symb;
+	} else {
+	    push @resourcelist,&titles_coming_from_hash($hash{'src_'.$current_resource});
+	}
+	$current_resource = $hash{'goesto_'.$hash{'to_'.$current_resource}};
+    }
+    #needs if final resource in the map (type="finish") contains something
+    if (not $hash{'src_'.$current_resource}=~/\.sequence$/) {
+		    my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}};
+            if ($rid=~/,/) {
+		my @rid = split /,/, $rid;
+		foreach my $rid_element (@rid) {
+		    if ($rid_element =~ m/^$mapid\.(\d*)/) {
+			$rid = $1; 
+			last;
+		    }
+		}
+	    } else {
+		$rid =~ m/^$mapid\.(\d*)/;
+                $rid = $1;  
+	    }
+	    $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/;
+	    $symb = $presymb.$rid.'___'.$1;
+	push @resourcelist,$hash{'title_'.$current_resource}.'&&'.$symb;
+    } else {
+	push @resourcelist,&titles_coming_from_hash($hash{'src_'.$current_resource});
+    }
+    return @resourcelist;
+}
+
 sub latex_header_footer_remove {
     my $text = shift;
     $text =~ s/\\end{document}//;
@@ -1188,20 +1304,27 @@ sub character_chart {
 
 
 sub page_format_transformation {
-	my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment) = @_; 
+    my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment) = @_; 
+    my ($textwidth,$textheight,$oddoffset,$evenoffset);
 	$assignment=~s/_/ /g;
-	my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$layout,$numberofcolumns);
-	my $courseidinfo = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};	
-	if ($layout eq 'CBI') {
-	    $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}\\setlength{\\topmargin}{200pt}\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\parindent}{20pt}\\setlength{\\marginparwidth}{90pt}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm} \\begin{document}\\setcounter{page}{1}\\noindent\\parbox{\\minipagewidth}{\\noindent\\fbox{\\textbf{$ENV{'environment.firstname'} $ENV{'environment.lastname'}}} \\hfill  $courseidinfo} \\vskip 5 mm /;
-	} elsif ($layout eq 'CAPA') {
- 	    if ($choice ne 'All class print') { 
-		$text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\setlength{\\topmargin}{1cm}\\setlength{\\headheight}{1cm}\\setlength{\\headsep}{0.5cm}\\markboth{}{\\textbf{$ENV{'environment.firstname'} $ENV{'environment.lastname'}} $courseidinfo - $assignment}\\pagestyle{myheadings}\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1}/;
-	    } else {
+        if ($numberofcolumns != 1) {
+          ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$layout,$numberofcolumns);
+	} else {
+	  ($textwidth,$textheight,$oddoffset,$evenoffset) = ($ENV{'form.width'},$ENV{'form.height'},$ENV{'form.leftmargin'},$ENV{'form.leftmargin'});
+	}
+    my $firstname = &special_character_corrections(&Apache::lonnet::unescape($ENV{'environment.firstname'}));
+    my $lastname = &special_character_corrections(&Apache::lonnet::unescape($ENV{'environment.lastname'}));
+    my $courseidinfo = &special_character_corrections(&Apache::lonnet::unescape($ENV{'course.'.$ENV{'request.course.id'}.'.description'}));
+    if ($layout eq 'CBI') {
+	    $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}\\setlength{\\topmargin}{200pt}\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\parindent}{20pt}\\setlength{\\marginparwidth}{90pt}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm} \\begin{document}\\setcounter{page}{1}\\noindent\\parbox{\\minipagewidth}{\\noindent\\fbox{\\textbf{$firstname $lastname}} \\hfill  $courseidinfo} \\vskip 5 mm /;
+    } elsif ($layout eq 'CAPA') {
+	if ($choice ne 'All class print') { 
+		$text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\pagestyle{fancy}\\rhead{}\\chead{}\\lhead{\\textbf{$firstname $lastname} - $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}/;
+	} else {
 		$text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1}  \\vskip 5 mm /;
-	    }
 	}
-	return $text;
+    }
+    return $text;
 }
 
 
@@ -1244,6 +1367,15 @@ sub details_for_menu {
 }
 
 
+sub special_character_corrections {
+    my $argument = shift;
+    $argument =~ s/_/ /g;
+    $argument =~ s/\^/ /g;
+    $argument =~ s/&/\\&/g;
+    return $argument;
+}
+
+
 sub latex_corrections {
 
     my ($number_of_columns,$result) = @_;