--- loncom/interface/lonprintout.pm	2009/07/03 16:13:13	1.558
+++ loncom/interface/lonprintout.pm	2009/08/17 10:48:28	1.560.2.1
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Printout
 #
-# $Id: lonprintout.pm,v 1.558 2009/07/03 16:13:13 bisitz Exp $
+# $Id: lonprintout.pm,v 1.560.2.1 2009/08/17 10:48:28 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -104,7 +104,7 @@ sub fetch_raw_resource {
 sub annotate {
     my ($symb) = @_;
 
-    my $annotation_text = &Apache::admannotations::get_annotation($symb, 1);
+    my $annotation_text = &Apache::loncommon::get_annotation($symb, 1);
 
 
     my $result = "";
@@ -197,7 +197,7 @@ sub include_pdf {
 
 
 #
-#   ssi_with_retries - Does the server side include of a resource.
+#   ssi_with_retries- Does the server side include of a resource.
 #                      if the ssi call returns an error we'll retry it up to
 #                      the number of times requested by the caller.
 #                      If we still have a proble, no text is appended to the
@@ -230,6 +230,10 @@ sub include_pdf {
 sub ssi_with_retries {
     my ($resource, $retries, %form) = @_;
 
+    my $target = $form{'grade_target'};
+    my $aom    = $form{'answer_output_mode'};
+
+
 
     my ($content, $response) = &Apache::loncommon::ssi_with_retries($resource, $retries, %form);
     if (!$response->is_success) {
@@ -944,6 +948,7 @@ sub old_character_chart {
     $result =~ s/&(rdquo|#8221);/\'\'/g;
 
 
+
     return $result;
 }
 
@@ -1305,6 +1310,180 @@ sub unsupported {
     return $result;
 }
 
+#
+#  Map from helper layout style to the book/album:
+#
+sub map_laystyle {
+    my ($laystyle) = @_;
+    if ($laystyle eq 'L') {
+	$laystyle='album';
+    } else {
+	$laystyle='book';
+    }
+    return $laystyle;
+}
+
+sub print_page_in_course {
+    my ($helper, $rparmhash, $currentURL, $resources) = @_;
+    my %parmhash       = %$rparmhash;
+    my @page_resources = @$resources;
+    my $mode = $helper->{'VARS'}->{'LATEX_TYPE'};
+    my $symb = $helper->{'VARS'}->{'symb'};
+
+
+    my $format_from_helper = $helper->{'VARS'}->{'FORMAT'};
+
+
+    my @temporary_array=split /\|/,$format_from_helper;
+    my ($laystyle,$numberofcolumns,$papersize,$pdfFormFields)=@temporary_array;
+    $laystyle = &map_laystyle($laystyle);
+    my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,
+								      $numberofcolumns);
+    my $LaTeXwidth=&recalcto_mm($textwidth); 
+
+
+    if ($mode ne '') {$mode='\\'.$mode}
+    my $result.= &print_latex_header($mode);
+    if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {
+	$currentURL=~s|^(/adm/wrapper/)?ext/|http://|;
+	my $title=&Apache::lonnet::gettitle($symb);
+	$title = &Apache::lonxml::latex_special_symbols($title);
+    } else {
+	$result.=$currentURL;
+    }
+    $result .= '\\\\';
+
+    if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
+	&Apache::lonnet::appenv({'construct.style' =>
+				$helper->{'VARS'}->{'style_file'}});
+    } elsif ($env{'construct.style'}) {
+	&Apache::lonnet::delenv('construct.style');
+    }
+
+    # First is the overall page description.  This is then followed by the 
+    # components of the page. Each of which must be printed independently.
+
+    my $the_page = shift(@page_resources); 
+
+    foreach my $resource (@page_resources) {
+	my $resource_src   = $resource->src(); # Essentially the URL of the resource.
+	$result           .= $resource->title() . '\\\\';
+
+	# Recurse if a .page:
+
+	if ($resource_src =~ /.page$/i) {
+	    my $navmap         = Apache::lonnavmaps::navmap->new();
+	    my @page_resources = $navmap->retrieveResources($resource_src);
+	    $result           .= &print_page_in_course($helper, $rparmhash, 
+						       $resource_src, \@page_resources);
+	}
+	# these resources go through the XML transformer:
+
+	elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm\xhtml|xhtm)$/)  {		
+	    my $urlp = &Apache::lonnet::clutter($resource_src);
+	    my %form;
+	    my %moreenv;
+
+	    &Apache::lonxml::remember_problem_counter();
+	    $moreenv{'request.filename'}=$urlp;
+	    if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}
+
+	    $form{'grade_target'}  = 'tex';
+	    $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
+	    $form{'pdfFormFiels'} = $pdfFormFields; # 
+	    $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};    
+	    
+	    $form{'problem_split'}=$parmhash{'problem_stream_switch'};
+	    $form{'suppress_tries'}=$parmhash{'suppress_tries'};
+	    $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
+	    $form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
+	    $form{'print_annotations'}=$helper->{'VARS'}->{'PRINT_ANNOTATIONS'};
+	    if (($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') ||
+		($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) {
+		$form{'problem_split'}='yes';
+	    }
+	    my $rndseed = time;
+	    if ($helper->{'VARS'}->{'curseed'}) {
+		$rndseed=$helper->{'VARS'}->{'curseed'};
+	    }
+	    $form{'rndseed'}=$rndseed;
+	    &Apache::lonnet::appenv(\%moreenv);
+	    
+	    &Apache::lonxml::clear_problem_counter();
+
+	    my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);
+
+	    # There seems to be an extraneous \vskip 1mm \\\\ :
+
+	    $texversion =~ s/^\\vskip 1mm \\\\\\\\//;
+
+	    # current document with answers.. no need to encap in minipage
+	    #  since there's only one answer.
+
+	    if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
+	       ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
+		my %answerform = %form;
+
+
+		$answerform{'problem_split'}=$parmhash{'problem_stream_switch'};
+		$answerform{'grade_target'}='answer';
+		$answerform{'answer_output_mode'}='tex';
+		$answerform{'rndseed'}=$rndseed;
+                if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {
+		    $answerform{'problemtype'}='exam';
+		}
+		$resources_printed .= $urlp.':';
+		my $answer=&ssi_with_retries($urlp,$ssi_retry_count, %answerform);
+
+		if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
+		    $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
+		} else {
+		    $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
+		    if ($helper->{'VARS'}->{'construction'} ne '1') {
+			my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});
+			$title = &Apache::lonxml::latex_special_symbols($title);
+			$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
+			$texversion.=&path_to_problem($urlp,$LaTeXwidth);
+		    } else {
+			$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm ';
+			my $URLpath=$urlp;
+			$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/;
+			$texversion.=&path_to_problem($URLpath,$LaTeXwidth);
+		    }
+		    $texversion.='\vskip 1 mm '.$answer.'\end{document}';
+		}
+
+
+		
+
+	    
+	    }
+	    # Print annotations.
+
+
+	    if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
+		my $annotation .= &annotate($currentURL);
+		$texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;
+	    }
+	    
+	    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,$numberofcolumns) = &page_cleanup($result);
+	    }
+	}
+    }
+
+    $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}';
+    return $result;
+}
+
 
 #
 # List of recently generated print files
@@ -1580,11 +1759,8 @@ ENDPART
     my $number_of_columns = 1; #used only for pages to determine the width of the cell
     my @temporary_array=split /\|/,$format_from_helper;
     my ($laystyle,$numberofcolumns,$papersize,$pdfFormFields)=@temporary_array;
-    if ($laystyle eq 'L') {
-	$laystyle='album';
-    } else {
-	$laystyle='book';
-    }
+
+    $laystyle = &map_laystyle($laystyle);
     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);
     my $assignment =  $env{'form.assignment'};
     my $LaTeXwidth=&recalcto_mm($textwidth); 
@@ -1733,6 +1909,8 @@ ENDPART
         } elsif ($cleanURL!~m|^/adm/|
 		 && $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') {
             #printing content of sequence from the construction space	
+
+
 	    $currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;
 #	    $result .= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
 	    $result .= &print_construction_sequence($currentURL, $helper, %form,
@@ -1768,11 +1946,24 @@ ENDPART
 	} elsif ($cleanURL =~ /\.pdf$/i) {
 	    $result .= &include_pdf($cleanURL);
 	    $result .= '\end{document}';
+	} elsif ($cleanURL =~ /\.page$/i) { #  Print page in non construction space contexts.
+
+	    # Determine the set of resources in the map of the page:
+
+	    my $navmap         =  Apache::lonnavmaps::navmap->new();
+	    my @page_resources =  $navmap->retrieveResources($cleanURL);
+	    $result           .=  &print_page_in_course($helper, $rparmhash,
+							$cleanURL, \@page_resources);
+
+       
 	} else {
+	    &Apache::lonnet::logthis("Unsupported type handler");
 	    $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},
 				  $helper->{'VARS'}->{'symb'});
 	}
     } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems')       or
+	     ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') or
+	     ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page') or
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')       or
 	     ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources')      or # BUGBUG
@@ -1781,9 +1972,13 @@ ENDPART
 
 
         #-- produce an output string
-	if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {
+	if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems')  or
+	    ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') ) {
 	    $selectionmade = 2;
-	} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') {
+	} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
+		 ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page'))
+	{
+	    &Apache::lonnet::logthis("Selectionmade => 3");
 	    $selectionmade = 3;
 	} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') 
 		 ) {
@@ -1827,7 +2022,7 @@ ENDPART
 	    $urlp=&Apache::lonnet::clutter($urlp);
 	    $form{'symb'}=$master_seq[$i];
 
-
+	    &Apache::lonnet::logthis("Element $i Sequence $sequence Middle $middle_thingy URLP $urlp");
 	    my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem
 
 	    if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;}
@@ -1835,10 +2030,13 @@ ENDPART
 	    my $texversion='';
 	    if ($urlp!~m|^/adm/|
 		&& $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
+		&Apache::lonnet::logthis("Problem");
 		$resources_printed .= $urlp.':';
 		&Apache::lonxml::remember_problem_counter();
 		$texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form);
+		&Apache::lonnet::logthis("texversion so far: $texversion");
 		if ($urlp=~/\.page$/) {
+		    &Apache::lonnet::("Special page actions");
 		    ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
 		    if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} 
 		    $texversion =~ s/\\end{document}\d*/\\end{document}/;
@@ -1860,6 +2058,7 @@ ENDPART
 			$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
 		    } else {
 			if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {
+			    &Apache::lonnet::logthis("problem printing");
 			    $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
 			    $texversion =~ s/\\begin{document}//;
 			    my $title = &Apache::lonnet::gettitle($master_seq[$i]);
@@ -1905,6 +2104,7 @@ ENDPART
 		    }			
 		}
 		$result .= $texversion;
+		&Apache::lonnet::logthis("About to set rem header true with $result");
 		$flag_latex_header_remove = 'YES';   
 	    } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { 
 		$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
@@ -2427,7 +2627,6 @@ sub print_resources {
 		if ($res_url!~m|^ext/|
 		    && $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
 		    $printed .= $curresline.':';
-
 		    &Apache::lonxml::remember_problem_counter();    
 
 		    my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
@@ -2738,6 +2937,8 @@ sub printHelper {
         $subdir = substr($helper->{VARS}->{'filename'},
                          0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
     } else {
+	# From course space:
+
 	if ($symb ne '') {
 	    ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);
 	    $helper->{VARS}->{'postdata'} = 
@@ -2745,9 +2946,9 @@ sub printHelper {
 	} else {
 	    $url = $helper->{VARS}->{'postdata'};
 	    $is_published=1;	# From resource space.
+	    &Apache::lonnet::logthis("Resource url $url");
 	}
 	$url = &Apache::lonnet::clutter($url);
-
         if (!$resourceTitle) { # if the resource doesn't have a title, use the filename
             my $postdata = $helper->{VARS}->{'postdata'};
             $resourceTitle = substr($postdata, rindex($postdata, '/') + 1);
@@ -2806,15 +3007,73 @@ sub printHelper {
 	    "<option text='".&mt('Start new page<br />before selected').
 	    "' variable='FINISHPAGE' />";
     }
+    # some debugging:
+    {
+	my $varspostdata = $helper->{VARS}->{'postdata'};
+	my $varsassignment = $helper->{VARS}->{'assignment'};
+	my $debugnavmap    = Apache::lonnavmaps::navmap->new();
+	my @dbgresources      = $debugnavmap->retrieveResources($url);
+	if(defined($dbgresources[0])) {
+	my $debugispage    = $dbgresources[0]->is_page();
+	my $debugtitle     = $dbgresources[0]->title();
+	my $resourcesymb   = $dbgresources[0]->symb();
+	my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb);
+	&Apache::lonnet::logthis("post: $varspostdata ass: $varsassignment is page: $debugispage");
+	if ($debugispage) {
+	    push @{$printChoices}, 
+	    [&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$debugtitle.'</i></b>'), 
+	     'map_problems_in_page', 
+	     'CHOOSE_PROBLEMS_PAGE'];
+	    push @{$printChoices}, 
+	         [&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$debugtitle.'</i></b>'), 
+		  'map_resources_in_page', 
+		  'CHOOSE_RESOURCES_PAGE'];
+	}
+	&Apache::lonnet::logthis("Pushing problems/resources from folder. $debugtitle");
+	&Apache::lonnet::logthis("Map url: $url");
+	&Apache::lonnet::logthis("Decoded symb: pagemap $pagemap id: $pageid url: $pageurl");
+        my $helperFragment = <<HELPERFRAGMENT;
+	<state name="CHOOSE_PROBLEMS_PAGE" title="Select Problem(s) to print">
+	    <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
+              closeallpages="1">
+	<nextstate>PAGESIZE</nextstate>
+      <filterfunc>return $isProblem;</filterfunc>
+      <mapurl>$pagemap</mapurl>
+      <valuefunc>return $symbFilter;</valuefunc>
+      $start_new_option
+      </resource>
+    </state>
+
+  <state name="CHOOSE_RESOURCES_PAGE" title="Select Resource(s) to print">
+    <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
+              closeallpages="1">
+      <nextstate>PAGESIZE</nextstate>
+      <filterfunc>return $isNotMap;</filterfunc>
+      <mapurl>$url</mapurl>
+      <valuefunc>return $symbFilter;</valuefunc>
+      $start_new_option
+      </resource>
+    </state>
+HELPERFRAGMENT
+
+	&Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
+	
+    }
+    }
 
     if (($helper->{'VARS'}->{'construction'} ne '1' ) &&
 	$helper->{VARS}->{'postdata'} &&
 	$helper->{VARS}->{'assignment'}) {
         # Allow problems from sequence
-        push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 'map_problems', 'CHOOSE_PROBLEMS'];
+        push @{$printChoices}, 
+	    [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 
+	     'map_problems', 
+	     'CHOOSE_PROBLEMS'];
         # Allow all resources from sequence
-        push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
-
+        push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 
+				'map_problems_pages', 
+				'CHOOSE_PROBLEMS_HTML'];
+	&Apache::lonnet::logthis("Map url : $map");
         my $helperFragment = <<HELPERFRAGMENT;
   <state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print">
     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
@@ -2947,6 +3206,8 @@ RESOURCE_SELECTOR
   <state name="CHOOSE_STUDENTS" title="Select Students and Resources">
       <message><b>Select sorting order of printout</b> </message>
     <choices variable='student_sort'>
+
+
       <choice computer='0'>Sort by section then student</choice>
       <choice computer='1'>Sort by students across sections.</choice>
     </choices>
@@ -3194,7 +3455,6 @@ CHOOSE_ANON2
 	    )) 
 	&& $helper->{VARS}->{'assignment'} eq ""
 	) {
-
 	my $pretty_dir = &Apache::lonnet::hreflocation($subdir);
         push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from current subdirectory [_3]','<b>','</b>','<b><i>'.$pretty_dir.'</i></b>','<b>','</b>'), 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
         my $xmlfrag = <<CHOOSE_FROM_SUBDIR;
@@ -3739,12 +3999,8 @@ sub render {
     my ($laystyle, $cols, $papersize) = split(/\|/, $format);
     ($papersize)                      = split(/ /, $papersize);
 
+    $laystyle = &Apache::lonprintout::map_laystyle($laystyle);
 
-    if ($laystyle eq 'L') {
-	$laystyle = 'album';
-    } else {
-	$laystyle = 'book';
-    }
 
 
     my %size;
@@ -3825,11 +4081,8 @@ sub preprocess {
 	($papersize)                      = split(/ /, $papersize);
 	
 	
-	if ($laystyle eq 'L') {
-	    $laystyle = 'album';
-	} else {
-	    $laystyle = 'book';
-	}
+	$laystyle = &Apache::lonprintout::map_laystyle($laystyle);
+
 	#  Figure out some good defaults for the print out and set them:
 	
 	my %size;