--- loncom/interface/lonprintout.pm	2003/08/18 18:22:53	1.217
+++ loncom/interface/lonprintout.pm	2003/09/30 17:29:26	1.244
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Printout
 #
-# $Id: lonprintout.pm,v 1.217 2003/08/18 18:22:53 sakharuk Exp $
+# $Id: lonprintout.pm,v 1.244 2003/09/30 17:29:26 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -49,6 +49,7 @@ use Apache::grades;
 use Apache::edit;
 use Apache::File();
 use Apache::lonnavmaps;
+use Apache::lonratedt;
 use POSIX qw(strftime);
 use GDBM_File;
 
@@ -483,7 +484,7 @@ sub get_course {
 sub page_format_transformation {
     my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist) = @_; 
     my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);
-    $assignment=~s/_/ /g;
+    $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header');
     if ($numberofcolumns != 1) {
 	($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin);
     } else {
@@ -530,7 +531,7 @@ sub details_for_menu {
 
     my $name_of_resourse = $hash{'title_'.$hash{'ids_'.$ENV{'form.postdata'}}};
     my $symbolic = &Apache::lonnet::symbread($ENV{'form.postdata'});
-    my ($map,$id,$resource)=split(/___/,$symbolic);
+    my ($map,$id,$resource)=&Apache::lonnet::decode_symb($symbolic);
     $map=&Apache::lonnet::clutter($map);
     my $name_of_sequence;
     $name_of_sequence = $hash{'title_'.$hash{'ids_'.$map}};
@@ -610,6 +611,54 @@ sub IndexCreation {
     return $texversion;
 }
 
+sub print_latex_header {
+    my $mode=shift;
+    my $output='\documentclass[letterpaper]{article}';
+    if ($mode eq 'batchmode') {
+	$output.='\batchmode';
+    }
+    $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'.
+	     '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'.
+	     '\usepackage[dvips]{graphicx}\usepackage{epsfig}\usepackage{calc}'.
+	     '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'.
+	     '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'.
+	     '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'.
+	     '\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'.
+	     '\setlength{\abovedisplayshortskip}{-0.04in}'.
+	     '\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'.
+	     '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'.
+	     '\textbf{Index}} \newline \setlength{\rightmargin}{0in}'.
+	     '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'.
+	     '\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'.
+	     '\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'.
+	     '\setlength{\abovedisplayshortskip}{-0.04in}'.
+	     '\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}';
+    return $output;	     
+}
+
+sub path_to_problem {
+    my ($urlp,$LaTeXwidth)=@_;
+    my $newurlp = '';
+    $LaTeXwidth=~s/\s*mm\s*$//;
+    my $HowMany = length($urlp)*2;
+    if ($HowMany > $LaTeXwidth) {
+	my @temporrary = split '/',$urlp;
+	my $HowManyNew = 0;
+	for (my $ii=0;$ii<=$#temporrary;$ii++) {
+	    if ($temporrary[$ii] ne '') {
+		$HowManyNew += length($temporrary[$ii])*2;
+		if ($HowManyNew < $LaTeXwidth ) {
+		    $newurlp .=  '/'.$temporrary[$ii];
+		} else {
+		    $HowManyNew = 0;
+		    $newurlp .=  '|\vskip -1 mm \noindent \verb|';
+		    $ii--;
+		}
+	    }
+	}
+    }
+    return '{\small\noindent\verb|'.$newurlp.'|\vskip 0 mm}';
+}
 
 sub output_data {
     my ($r,$helper,$rparmhash) = @_;
@@ -654,45 +703,109 @@ ENDPART
 	    $currentURL=$helper->{'VARS'}->{'postdata'};
 	} else {
             #prints resource from the construction space
-	    $currentURL=$helper->{'VARS'}->{'filename'};
-	    $currentURL=~s/\/home\//\/~/;
-	    $currentURL=~s/public_html\///;
+	    $currentURL='/'.$helper->{'VARS'}->{'filename'};
 	    if ($currentURL=~/([^?]+)/) {$currentURL=$1;}
 	}
 	$selectionmade = 1;
 	if ($currentURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
-	    my %moreenv;
-	    $moreenv{'request.filename'}=$currentURL;
-	    my %form;
-	    $form{'grade_target'}='tex';
-	    $form{'textwidth'}=$LaTeXwidth;	
-	    $form{'problem_split'}=$parmhash{'problem_stream_switch'};
-	    $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
 	    my $rndseed=time;
-	    $form{'rndseed'}=$rndseed;
-	    &Apache::lonnet::appenv(%moreenv);
-	    &Apache::lonnet::delenv('form.counter');
-	    &Apache::lonxml::init_counter();
-	    my $texversion=&Apache::lonnet::ssi($currentURL,%form);
-	    &Apache::lonnet::delenv('form.counter');
-	    &Apache::lonnet::delenv('request.filename');
-	    if($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
+	    my $texversion='';
+	    if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
+		my %moreenv;
+		$moreenv{'request.filename'}=$currentURL;
+		my %form;
+		$form{'grade_target'}='tex';
+		$form{'textwidth'}=$LaTeXwidth;	
+		$form{'problem_split'}=$parmhash{'problem_stream_switch'};
+		$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
+		if ($helper->{'VARS'}->{'curseed'}) {
+		    $rndseed=$helper->{'VARS'}->{'curseed'};
+		}
+		$form{'rndseed'}=$rndseed;
+		&Apache::lonnet::appenv(%moreenv);
+		&Apache::lonnet::delenv('form.counter');
+		&Apache::lonxml::init_counter();
+		$texversion=&Apache::lonnet::ssi($currentURL,%form);
+		&Apache::lonnet::delenv('form.counter');
+		&Apache::lonnet::delenv('request.filename');
+	    }
+	    if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
+	       ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
 		my %form;
 		$form{'grade_target'}='answer';
 		$form{'answer_output_mode'}='tex';
 		$form{'rndseed'}=$rndseed;
 		my $answer=&Apache::lonnet::ssi($currentURL,%form);
-		$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
+		if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
+		    $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
+		} else {
+		    $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
+		    $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';
+		    $texversion.=&path_to_problem ($currentURL,$LaTeXwidth);
+		    $texversion.='\vskip 1 mm '.$answer.'\end{document}';
+		}
 	    }
 	    if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
 		$texversion=&IndexCreation($texversion,$currentURL);
 	    }
+	    if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {
+		$texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$currentURL| \\strut\\\\\\strut /;
+
+	    }
 	    $result .= $texversion;
 	    if ($currentURL=~m/\.page\s*$/) {
 		($result,$number_of_columns) = &page_cleanup($result);
 	    }
+        } elsif ($currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') {
+            #printing content of sequence from the construction space	
+	    my $flag_latex_header_remove = 'NO'; 
+	    my $rndseed=time;
+	    if ($helper->{'VARS'}->{'curseed'}) {
+		$rndseed=$helper->{'VARS'}->{'curseed'};
+	    }
+	    $currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;
+	    my $errtext=&Apache::lonratedt::mapread($currentURL);
+	    for (my $member=0;$member<=$#Apache::lonratedt::order;$member++) {
+		$Apache::lonratedt::resources[$Apache::lonratedt::order[$member]]=~/^([^:]*):([^:]*):/;
+		my $urlp=$2;
+		if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {
+		    my %form;
+		    $form{'grade_target'}='tex';
+		    $form{'textwidth'}=$LaTeXwidth;
+		    $form{'problem_split'}=$parmhash{'problem_stream_switch'};
+		    $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
+		    $form{'rndseed'}=$rndseed;
+		    my $texversion=&Apache::lonnet::ssi($urlp,%form);
+		    if($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
+			my %form;
+			$form{'grade_target'}='answer';
+			$form{'answer_output_mode'}='tex';
+			$form{'rndseed'}=$rndseed;
+                        if ($urlp=~/\/res\//) {$ENV{'request.state'}='published';}
+			my $answer=&Apache::lonnet::ssi($urlp,%form);
+			$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
+		    }
+		    if ($flag_latex_header_remove ne 'NO') {
+			$texversion = &latex_header_footer_remove($texversion);
+		    } else {
+			$texversion =~ s/\\end{document}//;
+		    }
+		    if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
+			$texversion=&IndexCreation($texversion,$urlp);
+		    }
+		    if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URpL'} eq 'yes') {
+			$texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /;
+		    }
+		    $result.=$texversion;
+		    $flag_latex_header_remove = 'YES';
+		} elsif ($urlp=~/\.(sequence|page)$/) {
+		    $result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent ';
+		}  
+	    }
+	    if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}
+	    $result .= '\end{document}';   
 	} else {
-	  $result='\documentclass[letterpaper]{article}\usepackage{calc}\begin{document}Printout of this type of document is currently not supported: ';
+	  $result.='\documentclass[letterpaper]{article}\usepackage{calc}\begin{document}Printout of this type of document is currently not supported: ';
 	  if ($currentURL=~/\/(aboutme|syllabus|bulletinboard|smppg)$/) {
 	      $result.=$1;
 	  } elsif ($currentURL=~/\/ext\//) {
@@ -718,8 +831,8 @@ ENDPART
 	&Apache::lonnet::delenv('form.counter');
 	&Apache::lonxml::init_counter();
 	for (my $i=0;$i<=$#master_seq;$i++) {
-	    $master_seq[$i]=~/___\d+___(.*)$/;
-	    my $urlp='/res/'.$1;
+	    my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
+	    $urlp=&Apache::lonnet::clutter($urlp);
 	    if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {
 		$selectionmade = 2;
 	    } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') {
@@ -728,8 +841,8 @@ ENDPART
 		$selectionmade = 4;
 	    }
 	    $form{'symb'}=$master_seq[$i];
-	    $master_seq[$i]=~/(.*)___\d*___/;
-	    my $assignment=&Apache::lonnet::gettitle($1); #tittle of the assignment which contains this problem
+	    my ($sequence)=&Apache::lonnet::decode_symb($master_seq[$i]);
+	    my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #tittle of the assignment which contains this problem
 	    #&Apache::lonnet::logthis("Trying to get $urlp with symb $master_seq[$i]");
 	    my $texversion=&Apache::lonnet::ssi($urlp,%form);
 	    if ($urlp=~/\.page$/) {
@@ -789,7 +902,7 @@ ENDPART
 	    &Apache::lonxml::init_counter();
 	    foreach my $curresline (@master_seq)  {
 		if ($curresline=~ m/\.(problem|exam|quiz|assess|survey|form|library)$/) {
-		    my ($map,$id,$res_url) = split(/___/,$curresline);
+		    my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);
 		    if (&Apache::lonnet::allowed('bre',$res_url)) {
 			my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,
                                                                         $ENV{'request.course.id'},'tex');
@@ -812,13 +925,13 @@ ENDPART
 	    }
 	    my $courseidinfo = &get_course();
 	    if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
-
+	    my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');
 	    if ($current_output=~/\\documentclass/) {
-		$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$helper->{VARS}->{'assignment'}}}\\vskip 3 mm /;
+		$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}}\\vskip 3 mm /;
 	    } else {
 		my $blanspages = '';
 		for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blanspages.='\clearpage\strut\clearpage';}
-		$current_output = '\strut\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blanspages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$helper->{VARS}->{'assignment'}.'}}} \vskip -5 mm '.$current_output;
+		$current_output = '\strut\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blanspages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}}} \vskip -5 mm '.$current_output;
 	    }
 	    $result .= $current_output;
 	    &Apache::lonnet::delenv('form.counter');	    
@@ -836,6 +949,9 @@ ENDPART
 	@list_of_files=sort @list_of_files;
 	my $flag_latex_header_remove = 'NO'; 
 	my $rndseed=time;
+	if ($helper->{'VARS'}->{'curseed'}) {
+	    $rndseed=$helper->{'VARS'}->{'curseed'};
+	}
 	for (my $i=0;$i<=$#list_of_files;$i++) {
 	    my $urlp = $list_of_files[$i];
 	    if ($urlp=~/\//) {
@@ -859,25 +975,8 @@ ENDPART
 		    $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
 		}
                 #this chunck is responsible for printing the path to problem
-		my $newurlp = '';
-		my $HowMany = length($urlp)*2;
-		if ($HowMany > $LaTeXwidth) {
-		    my @temporrary = split '/',$urlp;
-		    my $HowManyNew = 0;
-		    for (my $ii=0;$ii<=$#temporrary;$ii++) {
-			if ($temporrary[$ii] ne '') {
-			    $HowManyNew += length($temporrary[$ii])*2;
-			    if ($HowManyNew < $LaTeXwidth ) {
-				$newurlp .=  '/'.$temporrary[$ii];
-			    } else {
-				$HowManyNew = 0;
-				$newurlp .=  '|\vskip -1 mm \noindent \verb|';
-				$ii--;
-			    }
-			}
-		    }
-		}
-		$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 {\\small\\noindent\\verb|$newurlp\|\\vskip 0 mm}/;
+		my $newurlp=&path_to_problem($urlp,$LaTeXwidth);
+		$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/;
 		if ($flag_latex_header_remove ne 'NO') {
 		    $texversion = &latex_header_footer_remove($texversion);
 		} else {
@@ -886,6 +985,10 @@ ENDPART
 		if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
 		    $texversion=&IndexCreation($texversion,$urlp);
 		}
+		if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {
+		    $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /;
+		    
+		}
 		$result .= $texversion;
 	    }
 	    $flag_latex_header_remove = 'YES';  
@@ -907,6 +1010,7 @@ ENDPART
     if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
 	if ($selectionmade<10) {$selectionmade*=100;} else {$selectionmade*=10;}
     }
+    if ($ENV{'request.role.adv'}) {$selectionmade*=10000;}
 #-- writing .tex file in prtspool 
     my $temp_file;
     my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout_".time."_".rand(10000000).".tex";
@@ -963,6 +1067,15 @@ sub handler {
 
 use Apache::lonhelper;
 
+sub addMessage {
+    my $text = shift;
+    my $paramHash = Apache::lonhelper::getParamHash();
+    $paramHash->{MESSAGE_TEXT} = $text;
+    Apache::lonhelper::message->new();
+}
+
+use Data::Dumper;
+
 sub printHelper {
     my $r = shift;
 
@@ -973,9 +1086,9 @@ sub printHelper {
 
     if ($r->header_only) {
         if ($ENV{'browser.mathml'}) {
-            $r->content_type('text/xml');
+            &Apache::loncommon::content_type($r,'text/xml');
         } else {
-            $r->content_type('text/html');
+            &Apache::loncommon::content_type($r,'text/html');
         }
         $r->send_http_header;
         return OK;
@@ -983,9 +1096,9 @@ sub printHelper {
 
     # Send header, nocache
     if ($ENV{'browser.mathml'}) {
-        $r->content_type('text/xml');
+        &Apache::loncommon::content_type($r,'text/xml');
     } else {
-        $r->content_type('text/html');
+        &Apache::loncommon::content_type($r,'text/html');
     }
     &Apache::loncommon::no_cache($r);
     $r->send_http_header;
@@ -999,6 +1112,7 @@ sub printHelper {
     my $helper = Apache::lonhelper::helper->new("Printing Helper");
     $helper->declareVar('symb');
     $helper->declareVar('postdata');    
+    $helper->declareVar('curseed');    
     $helper->declareVar('filename');
     $helper->declareVar('construction');
     $helper->declareVar('assignment');
@@ -1007,7 +1121,7 @@ sub printHelper {
     # very first screen.
     # Detect whether we're coming from construction space
     if ($ENV{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) {
-        $helper->{VARS}->{'filename'} = "/home/$1/public_html/$2";
+        $helper->{VARS}->{'filename'} = "~$1/$2";
         $helper->{VARS}->{'construction'} = 1;
     } else {
         if ($ENV{'form.postdata'}) {
@@ -1045,17 +1159,23 @@ sub printHelper {
         $subdir = substr($helper->{VARS}->{'filename'},
                          0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
     } else {
-        ($map, $id, $url) = split(/___/, $symb);
+        ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);
         $helper->{VARS}->{'postdata'} = Apache::lonnet::clutter($url);
 
         if (!$resourceTitle) { # if the resource doesn't have a title, use the filename
-            my $url = $helper->{VARS}->{'postdata'};
-            $resourceTitle = substr($url, rindex($url, '/') + 1);
+            my $postdata = $helper->{VARS}->{'postdata'};
+            $resourceTitle = substr($postdata, rindex($postdata, '/') + 1);
         }
         $subdir = &Apache::lonnet::filelocation("", $url);
     }
+    if (!$helper->{VARS}->{'curseed'} && $ENV{'form.curseed'}) {
+	$helper->{VARS}->{'curseed'}=$ENV{'form.curseed'};
+    }
 
     my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();
+    my $userPriviledged = ($ENV{'request.role'}=~m/^cc\./ or
+			   $ENV{'request.role'}=~m/^in\./ or
+			   $ENV{'request.role'}=~m/^ta\./);
 
     Apache::lonhelper::registerHelperTags();
 
@@ -1082,42 +1202,54 @@ sub printHelper {
     my $paramHash;
 
     if ($resourceTitle) {
-        push @{$printChoices}, ["<b>$resourceTitle</b> (prints what you just saw on the screen)", 'current_document', 'PAGESIZE'];
+        push @{$printChoices}, ["<b>$resourceTitle</b> (what you just saw on the screen)", 'current_document', 'PAGESIZE'];
     }
 
 #    $r->print($helper->{VARS}->{'postdata'});
 
+    # Useful filter strings
+    my $isProblem = '$res->is_problem()';
+    $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;
+    my $isProblemOrMap = '$res->is_problem() || $res->is_map()';
+    my $isNotMap = '!$res->is_map()';
+    $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;
+    my $isMap = '$res->is_map()';
+    my $symbFilter = '$res->symb()';
+    my $urlValue = '$res->src()';
+
+    $helper->declareVar('SEQUENCE');
+
+    # Useful for debugging: Dump the help vars
+    #$r->print(Dumper($helper->{VARS}));
+    #$r->print($map);
+
     # If we're in a sequence...
-    if ($helper->{'VARS'}->{'construction'} ne '1') {
+    if (($helper->{'VARS'}->{'construction'} ne '1') &&
+	$helper->{VARS}->{'postdata'} &&
+	$helper->{VARS}->{'assignment'}) {
         # Allow problems from sequence
-        push @{$printChoices}, ["Problem(s) from <b>$sequenceTitle</b>", 'map_problems', 'CHOOSE_PROBLEMS'];
+        push @{$printChoices}, ["<b>Problems</b> in $sequenceTitle", 'map_problems', 'CHOOSE_PROBLEMS'];
         # Allow all resources from sequence
-        push @{$printChoices}, ["Everything (problem(s), page(s), html/xml file(s)) from <b>$sequenceTitle</b>", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
+        push @{$printChoices}, ["<b>Resources</b> in $sequenceTitle", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
 
-        my $isProblem = '$res->is_problem()';
-	$isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;
-        my $isProblemOrMap = '$res->is_problem() || $res->is_map()';
-        my $isNotMap = '!$res->is_map()';
-	$isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;
-        my $symb = '$res->symb()';
         my $helperFragment = <<HELPERFRAGMENT;
   <state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print">
     <message>(mark them then click "next" button) <br /></message>
-    <resource variable="RESOURCES" multichoice="1" toponly='1'>
+    <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1">
       <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isProblem;</filterfunc>
       <mapurl>$map</mapurl>
-      <valuefunc>return $symb;</valuefunc>
+      <valuefunc>return $symbFilter;</valuefunc>
       </resource>
     </state>
 
   <state name="CHOOSE_PROBLEMS_HTML" title="Select Resource(s) to print">
     <message>(mark them then click "next" button) <br /></message>
-    <resource variable="RESOURCES" multichoice="1" toponly='1'>
+    <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1">
       <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>
-      <valuefunc>return $symb;</valuefunc>
+      <valuefunc>return $symbFilter;</valuefunc>
       </resource>
     </state>
 HELPERFRAGMENT
@@ -1127,33 +1259,31 @@ HELPERFRAGMENT
 
     # If the user is priviledged, allow them to print all 
     # problems in the course, optionally for selected students
-    if (($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) and ($helper->{VARS}->{'postdata'}=~/\/res\//)) { 
-        push @{$printChoices}, ['<b>Problems</b> in this course', 'all_problems', 'ALL_PROBLEMS'];
-        push @{$printChoices}, ["Problems from <b>$sequenceTitle</b> for selected students", 'problems_for_students', 'CHOOSE_STUDENTS'];
-
-        my $isProblem = '$res->is_problem()';
-	$isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;
-        my $isProblemOrMap = '($res->is_problem() || $res->is_map())';
-	$isProblemOrMap .= ' && !$res->randomout()' if !$userCanSeeHidden;
-        my $symb = '$res->symb()';
+    if ($userPriviledged && ($helper->{VARS}->{'postdata'}=~/\/res\//)) { 
+        push @{$printChoices}, ['Problems from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];
+	if ($helper->{VARS}->{'assignment'}) {
+	    push @{$printChoices}, ["Problems from $sequenceTitle for <b>selected students</b>", 'problems_for_students', 'CHOOSE_STUDENTS'];
+	}
+
         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);
   <state name="ALL_PROBLEMS" title="Select Problem(s) to print">
     <message>(mark them then click "next" button) <br /></message>
-    <resource variable="RESOURCES" multichoice="1" suppressEmptySequences='1'>
+    <resource variable="RESOURCES" multichoice="1"
+	suppressEmptySequences='1' addstatus="1">
       <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isProblemOrMap;</filterfunc>
       <choicefunc>return $isProblem;</choicefunc>
-      <valuefunc>return $symb;</valuefunc>
+      <valuefunc>return $symbFilter;</valuefunc>
       </resource>
     </state>
 
-  <state name="CHOOSE_STUDENTS" title="Choose Students whose assignments you want to print">
+  <state name="CHOOSE_STUDENTS" title="Select Students and Resources">
     <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" />
     <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
-    <resource variable="RESOURCES" multichoice="1">
+    <resource variable="RESOURCES" multichoice="1" addstatus="1">
       <filterfunc>return $isProblem</filterfunc>
       <mapurl>$map</mapurl>
-      <valuefunc>return $symb</valuefunc>
+      <valuefunc>return $symbFilter</valuefunc>
       </resource>
     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
     <choices variable="EMPTY_PAGES">
@@ -1167,9 +1297,9 @@ CHOOSE_STUDENTS
     }
 
     # FIXME: That RE should come from a library somewhere.
-    if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $ENV{'request.role.adv'}) {    
+    if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $ENV{'request.role.adv'} and $subdir ne '/home/httpd/html/res/') {    
         push @{$printChoices}, ["Problems from current subdirectory <b>$subdir</b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
-        
+
         my $f = '$filename';
         my $xmlfrag = <<CHOOSE_FROM_SUBDIR;
   <state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$subdir</small></b> to print">
@@ -1179,9 +1309,11 @@ CHOOSE_STUDENTS
       <filechoice>return '$subdir';</filechoice>
 CHOOSE_FROM_SUBDIR
         
+        # this is broken up because I really want interpolation above,
+        # and I really DON'T want it below
         $xmlfrag .= <<'CHOOSE_FROM_SUBDIR';
-      <filefilter>return $filename =~ 
-           m/\.(problem|exam|quiz|assess|survey|form|library)$/;
+      <filefilter>return Apache::lonhelper::files::not_old_version($filename) &&
+	  $filename =~ m/\.(problem|exam|quiz|assess|survey|form|library)$/;
       </filefilter>
       </files>
     </state>
@@ -1189,8 +1321,38 @@ CHOOSE_FROM_SUBDIR
         &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
     }
 
+    # Allow the user to select any sequence in the course, feed it to
+    # another resource selector for that sequence
+    if (!$helper->{VARS}->{'construction'}) {
+	push @$printChoices, ["Resources from <b>selected sequence</b> in course",
+			      'map_problems_pages', 'CHOOSE_SEQUENCE'];
+	my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'};
+	#Escape apostrophes and backslashes for Perl
+	$escapedSequenceName =~ s/\\/\\\\/g;
+	$escapedSequenceName =~ s/'/\\'/g;
+	&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE);
+  <state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From">
+    <message>Select the sequence to print resources from:</message>
+    <resource variable="SEQUENCE">
+      <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>
+      <filterfunc>return \$res->is_sequence;</filterfunc>
+      <valuefunc>return $urlValue;</valuefunc>
+      </resource>
+    </state>
+  <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">
+    <message>(mark desired resources then click "next" button) <br /></message>
+    <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1">
+      <nextstate>PAGESIZE</nextstate>
+      <filterfunc>return $isProblem</filterfunc>
+      <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>
+      <valuefunc>return $symbFilter;</valuefunc>
+      </resource>
+    </state>
+CHOOSE_FROM_ANY_SEQUENCE
+}
+
     # Generate the first state, to select which resources get printed.
-    Apache::lonhelper::state->new("START", "What do you want to print? Make a choice.");
+    Apache::lonhelper::state->new("START", "Select Printing Options:");
     $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{MESSAGE_TEXT} = "";
     Apache::lonhelper::message->new();
@@ -1200,61 +1362,94 @@ CHOOSE_FROM_SUBDIR
     $paramHash->{CHOICES} = $printChoices;
     Apache::lonhelper::choices->new();
 
+    my $startedTable = 0; # have we started an HTML table yet? (need
+                          # to close it later)
+
     if (($ENV{'request.role.adv'} and &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) or 
 	($helper->{VARS}->{'construction'} eq '1')) {
-        $paramHash = Apache::lonhelper::getParamHash();
-        $paramHash->{MESSAGE_TEXT} = "<br /><big><b><i>Next four options are available only for advanced users:  </i></b></big><br />";
-        Apache::lonhelper::message->new();
+	addMessage("<hr width='33%' /><table><tr><td align='right'>Print: </td><td>");
         $paramHash = Apache::lonhelper::getParamHash();
 	$paramHash->{'variable'} = 'ANSWER_TYPE';   
 	$helper->declareVar('ANSWER_TYPE');         
         $paramHash->{CHOICES} = [
-                                   ['Print without answer', 'yes'],
-                                   ['Print with answers', 'no'] ];
+                                   ['Without Answers', 'yes'],
+                                   ['With Answers', 'no'],
+                                   ['Only Answers', 'only'] ];
         Apache::lonhelper::dropdown->new();
+	addMessage("</td></tr>");
+	$startedTable = 1;
     }
 
     if ($ENV{'request.role.adv'}) {
-        $paramHash = Apache::lonhelper::getParamHash();
-        $paramHash->{MESSAGE_TEXT} = "<br />";
-        Apache::lonhelper::message->new();
+	if (!$startedTable) {
+	    addMessage("<hr width='33%' /><table><tr><td align='right'>LaTeX mode: </td><td>");
+	    $startedTable = 1;
+	} else {
+	    addMessage("<tr><td align='right'>LaTeX mode: </td><td>");
+	}
         $paramHash = Apache::lonhelper::getParamHash();
 	$paramHash->{'variable'} = 'LATEX_TYPE';   
 	$helper->declareVar('LATEX_TYPE');  
 	if ($helper->{VARS}->{'construction'} eq '1') {       
 	    $paramHash->{CHOICES} = [
-				     ['Print in standard LaTeX mode', 'standard'], 
-				     ['Print in LaTeX batchmode', 'batchmode'], ];
+				     ['standard LaTeX mode', 'standard'], 
+				     ['LaTeX batchmode', 'batchmode'], ];
 	} else {
 	    $paramHash->{CHOICES} = [
-				     ['Print in LaTeX batchmode', 'batchmode'],
-				     ['Print in standard LaTeX mode', 'standard'] ];
+				     ['LaTeX batchmode', 'batchmode'],
+				     ['standard LaTeX mode', 'standard'] ];
 	}
         Apache::lonhelper::dropdown->new();
-    } 
-
-    if ($ENV{'request.role.adv'}) {
-        $paramHash = Apache::lonhelper::getParamHash();
-        $paramHash->{MESSAGE_TEXT} = "<br />";
-        Apache::lonhelper::message->new();
+ 
+	addMessage("</td></tr><tr><td align='right'>Print Table of Contents: </td><td>");
         $paramHash = Apache::lonhelper::getParamHash();
 	$paramHash->{'variable'} = 'TABLE_CONTENTS';   
 	$helper->declareVar('TABLE_CONTENTS');         
         $paramHash->{CHOICES} = [
-                                   ['Print without Table of Contents', 'no'],
-                                   ['Print with Table of Contents', 'yes'] ];
+                                   ['No', 'no'],
+                                   ['Yes', 'yes'] ];
         Apache::lonhelper::dropdown->new();
+	addMessage("</td></tr>");
         
-        $paramHash = Apache::lonhelper::getParamHash();
-        $paramHash->{MESSAGE_TEXT} = "<br />";
-        Apache::lonhelper::message->new();
-        $paramHash = Apache::lonhelper::getParamHash();
-	$paramHash->{'variable'} = 'TABLE_INDEX';   
-	$helper->declareVar('TABLE_INDEX');         
-        $paramHash->{CHOICES} = [
-                                   ['Print without Index', 'no'],
-                                   ['Print with Index', 'yes'] ];
-        Apache::lonhelper::dropdown->new();
+	if (not $helper->{VARS}->{'construction'}) {
+	    addMessage("<tr><td align='right'>Print Index: </td><td>");
+	    $paramHash = Apache::lonhelper::getParamHash();
+	    $paramHash->{'variable'} = 'TABLE_INDEX';   
+	    $helper->declareVar('TABLE_INDEX');         
+	    $paramHash->{CHOICES} = [
+				     ['No', 'no'],
+				     ['Yes', 'yes'] ];
+	    Apache::lonhelper::dropdown->new();
+	    addMessage("</td></tr>");
+	}
+
+	if ($helper->{VARS}->{'construction'}) {
+	    addMessage("<tr><td align='right'>Print With URL: </td><td>");
+	    $paramHash = Apache::lonhelper::getParamHash();
+	    $paramHash->{'variable'} = 'CONSTR_RESOURSE_URL';   
+	    $helper->declareVar('CONSTR_RESOURSE_URL');         
+	    $paramHash->{CHOICES} = [
+				     ['No', 'no'],
+				     ['Yes', 'yes'] ];
+	    Apache::lonhelper::dropdown->new();
+	    addMessage("</td></tr>");
+	}
+	if ($helper->{'VARS'}->{'construction'}) { 
+	    my $xmlfrag .= <<'RNDSEED';
+	    <message><tr><td align='right'>Use random seed: </td><td></message>
+	    <string variable="curseed" size="15" maxlength="15">
+		<defaultvalue>
+	            return $helper->{VARS}->{'curseed'};
+	        </defaultvalue>
+	     </string>
+             <message></td></tr></message>
+RNDSEED
+            &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
+	}
+    }
+
+    if ($startedTable) {
+	addMessage("</table>");
     }
 
     Apache::lonprintout::page_format_state->new("FORMAT");
@@ -1345,7 +1540,7 @@ sub render {
 
     $result .= <<STATEHTML;
 
-<p><big><i><b>What page format do you prefer?</b></i></big></p>
+<hr width="33%" />
 <table cellpadding="3">
   <tr>
     <td align="center"><b>Page layout</b></td>