--- rat/lonpage.pm	2007/05/23 14:57:51	1.78
+++ rat/lonpage.pm	2010/07/13 00:16:23	1.94
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Page Handler
 #
-# $Id: lonpage.pm,v 1.78 2007/05/23 14:57:51 www Exp $
+# $Id: lonpage.pm,v 1.94 2010/07/13 00:16:23 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -27,6 +27,9 @@
 #
 ###
 
+
+
+
 package Apache::lonpage;
 
 use strict;
@@ -78,7 +81,7 @@ sub tracetable {
                     my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}};
 	            $sofar=
                        &tracetable($sofar,$hash{'map_start_'.$hash{'src_'.$rid}},
-                       '&'.$frid.'&');
+                       '&'.$frid.$beenhere);
                     $sofar++;
                     if ($hash{'src_'.$frid}) {
                         my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$frid});
@@ -155,6 +158,19 @@ sub handler {
   my $number_of_columns = 1;
   my $requrl=$r->uri;  
   my $target = $env{'form.grade_target'};
+
+# Short term solution: define target as 'tex_answer' when retrieving answers
+# for resources in a .page when generating printouts.
+# A better long-term fix would be to modify the way problem rendering, and 
+# answer rendering are retrieved for individual resources when printing a .page,
+# so rendered problem and answer are sequential for individual resources in 
+# the .page
+#
+  if ($target eq 'answer') {
+      if ($env{'form.answer_output_mode'} eq 'tex') {
+          $target = 'tex_answer';
+      }
+  }
 #  &Apache::lonnet::logthis("Got a target of $target");
   if ($target eq 'meta') {
       &Apache::loncommon::content_type($r,'text/html');
@@ -206,8 +222,6 @@ sub handler {
                   my %ssivlink=();
                   my %ssialink=();
      
-                  my %metalink=();
-
                   my %cellemb=();
 
                   my $allscript='';
@@ -230,7 +244,6 @@ sub handler {
 			  if ($hash{'encrypted_'.$_}) {
 			      $src=&Apache::lonenc::encrypted($src);
 			  }
-                          $metalink{$_}=$src.'.meta';
                           $cellemb{$_}=
 			      &Apache::loncommon::fileembstyle($extension);
                           if ($cellemb{$_} eq 'ssi') {
@@ -242,12 +255,14 @@ sub handler {
                               my %posthash=('request.prefix' => $prefix,
 					    'LONCAPA_INTERNAL_no_discussion' => 'true',
 					    'symb' => $symb);
-			      if ($env{'form.grade_target'} eq 'tex') {
+			      if (($env{'form.grade_target'} eq 'tex') ||
+                                 ($env{'form.answer_output_mode'} eq 'tex')) {
 				  $posthash{'grade_target'}=$env{'form.grade_target'};
 				  $posthash{'textwidth'}=$env{'form.textwidth'};
 				  $posthash{'problem_split'}=$env{'form.problem_split'};
 				  $posthash{'latex_type'}=$env{'form.latex_type'};
 				  $posthash{'rndseed'}=$env{'form.rndseed'};
+                                  $posthash{'answer_output_mode'} = $env{'form.answer_output_mode'};
 			      }
 			      my $submitted=exists($env{'form.all_submit'});
 			      if (!$submitted) {
@@ -271,10 +286,10 @@ sub handler {
 			      }
                               my $output=Apache::lonnet::ssi($src,%posthash);
 			      $output=~s|//(\s*<!--)? BEGIN LON-CAPA Internal.+?// END LON-CAPA Internal\s*(-->)?\s||gs;
-                              if ($target eq 'tex') {
+                              if (($target eq 'tex') || ($target eq 'tex_answer')) {
 				  $output =~ s/^([^&]+)\\begin{document}//;
 				  $output =~ s/\\end{document}//;
-				  $output = '\parbox{\minipagewidth}{ '.$output.' }';
+#				  $output = '\parbox{\minipagewidth}{ '.$output.' }';
                                   #some additional cleanup necessary for LateX (due to limitations of table environment 
 				  $output =~ s/(\\vskip\s*\d+mm)\s*(\\\\)+/$1/g;
 			      }
@@ -338,11 +353,11 @@ sub handler {
                                   $output=~s/\<form[^\>]*\>//gsi;
                                   $output=~s/\<\/form[^\>]*\>//gsi;
                                   $output=~
-				      s/\<((?:input|select|button|textarea)[^\>]+)name\s*\=\s*[\'\"]*([\w\.\:]+)[\'\"]*([^\>]*)\>/\<$1 name="$prefix$2" $3\>/gsi;
+				      s/\<((?:input|select|button|textarea)[^\>]+)name\s*\=\s*[\'\"]*([^\'\"]+)[\'\"]*([^\>]*)\>/\<$1 name="$prefix$2" $3\>/gsi;
                               }
                               $thisdir=~s/\/[^\/]*$//;
 			      foreach (@rlinks) {
-				  unless (($_=~/^http:\/\//i) ||
+				  unless (($_=~/^https?\:\/\//i) ||
 					  ($_=~/^\//) ||
 					  ($_=~/^javascript:/i) ||
 					  ($_=~/^mailto:/i) ||
@@ -372,7 +387,7 @@ sub handler {
 # ------------------------------------------------------------------ Build page
 
 # ---------------------------------------------------------------- Send headers
-		      unless ($target eq 'tex') {
+		      unless (($target eq 'tex') || ($target eq 'tex_answer')) {
 			  if ($isxml) {
 			      &Apache::loncommon::content_type($r,'text/xml');
 			  } else {
@@ -381,100 +396,58 @@ sub handler {
 			  $r->send_http_header;
 # ------------------------------------------------------------------------ Head
 			  if ($allscript) {
-			      $allscript .= 
-				  "\n<script type=\"text/javascript\">\n".
-				  $allscript."\n</script>\n";
+			      $allscript = 
+				  "\n".'<script type="text/javascript">'."\n".
+				  $allscript.
+				  "\n</script>\n";
 			  }
 # ------------------------------------------------------------------ Start body
-			  $r->print(&Apache::loncommon::start_page(undef,undef,
+			  $r->print(&Apache::loncommon::start_page(undef,$allscript,
 								   {'force_register' => 1,
 								    'bgcolor'        => '#ffffff',}));
 # ------------------------------------------------------------------ Start form
 			  if ($nforms) {
-			      $r->print('<form method="post" action="'.
+			      $r->print('<form name="lonhomework" method="post"  enctype="multipart/form-data" action="'.
 					&Apache::lonenc::check_encrypt($requrl)
 					.'">');
 			  }
-		      } elsif ($target eq 'tex') {
-			  $r->print('\documentclass{article}
-                                 \newcommand{\keephidden}[1]{}           
-                                 \usepackage[dvips]{graphicx}
-                                 \usepackage{epsfig}
-                                 \usepackage{calc}
-                                 \usepackage{longtable}
-                                 \begin{document}');
+		      } elsif (($target eq 'tex') || ($target eq 'tex_answer')) {
+			  #  I think this is not needed as the header
+			  # will be put in for each of the page parts
+			  # by the londefdef.pm now that we are opening up
+			  # the parts of a page.
+			  #$r->print('\documentclass{article}
+                          #       \newcommand{\keephidden}[1]{}           
+                          #       \usepackage[dvips]{graphicx}
+                          #       \usepackage{epsfig}
+                          #       \usepackage{calc}
+                          #       \usepackage{longtable}
+                          #       \begin{document}');
 		      }
 # ----------------------------------------------------------------- Start table
-		      if ($target eq 'tex') {
-			  $r->print('\begin{longtable}INSERTTHEHEADOFLONGTABLE\endfirsthead\endhead ');
+		      if (($target eq 'tex') || ($target eq 'tex_answer')) {
+#			 #  $r->print('\begin{longtable}INSERTTHEHEADOFLONGTABLE\endfirsthead\endhead ');
 			  if ($number_of_columns le $lcm) {$number_of_columns=$lcm;};
 		      } else {
 			  $r->print('<table width="100%" cols="'.$lcm.'" border="0">');
 		      }
-# which icons do we use?
-                      my $extension='png';
-                      if ($env{'environment.icons'} eq 'classic') { $extension='gif'; }
 # generate rows
                       for ($i=0;$i<=$#rows;$i++) {
 			if ($rows[$i]) {
-			    unless ($target eq 'tex') {
+			    unless (($target eq 'tex') || ($target eq 'tex_answer')) {
 				$r->print("\n<tr>");
 			    }
                           my @colcont=split(/\&/,$rows[$i]);
                           my $avespan=$lcm/($#colcont+1);
                           for ($j=0;$j<=$#colcont;$j++) {
                               my $rid=$colcont[$j];
-                              my $metainfo = '';
-			      my $esrc=&Apache::lonnet::declutter($hash{'src_'.$rid});
-			      my ($mapid,$resid)=split(/\./,$rid);
-			      my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},$resid,$hash{'src_'.$rid});
-			      if ($hash{'encrypted_'.$rid}) {
-				  $symb=&Apache::lonenc::encrypted($symb);
-				  $esrc=&Apache::lonenc::encrypted($esrc);
-			      }
-                              unless ($hash{'src_'.$rid} =~ m-^/uploaded/-) { 
-                                  $metainfo ='<a name="'.&escape($symb).'" />'.
-                                  '<a href="'.$metalink{$rid}.'" target="LONcatInfo">'.
-                                  '<img src="/adm/lonMisc/cat_button.'.$extension.'" border=0>'.
-                                  '</img></a>';
-                              }
-                              $metainfo .= '<a href="/adm/evaluate?postdata='.
-				  &escape($esrc).
-                                  '" target="LONcatInfo">'.
-                                  '<img src="/adm/lonMisc/eval_button.'.$extension.'" border=0>'.
-                                  '</img></a>';
-                              if (
- ($hash{'src_'.$rid}=~/\.(problem|exam|quiz|assess|survey|form)$/) &&
- (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) && 
- ($hash{'src_'.$rid} !~ m-^/uploaded/-)) {
-				  my ($mapid,$resid)=split(/\./,$rid);
-                                 my $symb=
-                &Apache::lonnet::declutter($hash{'map_id_'.$mapid}).
-                '___'.$resid.'___'.
-		&Apache::lonnet::declutter($hash{'src_'.$rid});
-                                 $metainfo.=
-                  '<a href="/adm/grades?symb='.&escape($symb).
-#                 '&command=submission" target="LONcatInfo">'.
-                  '&command=submission">'.
-                          '<img src="/adm/lonMisc/subm_button.'.$extension.'" border=0>'.
-			  '</img></a>'.
-                  '<a href="/adm/grades?symb='.&escape($symb).
-#                  '&command=gradingmenu" target="LONcatInfo">'.
-                  '&command=gradingmenu">'.
-                          '<img src="/adm/lonMisc/pgrd_button.'.$extension.'" border=0>'.
-			  '</img></a>'.
-                  '<a href="/adm/parmset?symb='.&escape($symb).
-#                          '" target="LONcatInfo">'.
-                          '" >'.
-                          '<img src="/adm/lonMisc/pprm_button.'.$extension.'" border=0>'.
-			      '</img></a>';
-                              }
-                              $metainfo.='<br></br>';
-			    unless ($target eq 'tex') {
+
+			      my $metainfo =&get_buttons(\%hash,$rid).'<br />';
+			    unless (($target eq 'tex') || ($target eq 'tex_answer')) {
 				$r->print('<td colspan="'.$avespan.'"');
 			    }
                               if ($cellemb{$rid} eq 'ssi') {
-				  unless ($target eq 'tex') {
+				  unless (($target eq 'tex') || ($target eq 'tex_answer')) {
 				      if ($ssibgcolor{$rid}) {
 					  $r->print(' bgcolor="'.
 						    $ssibgcolor{$rid}.'"');
@@ -496,13 +469,13 @@ sub handler {
 				      $r->print('>');
 				  }
                                   $r->print($ssibody{$rid});	
-				  unless ($target eq 'tex') {
+				  unless (($target eq 'tex') || ($target eq 'tex_answer')) {
 				      $r->print('</font>');
                                   }
                                   if ($env{'course.'.
                                       $env{'request.course.id'}.
                                       '.pageseparators'} eq 'yes') {
-                                      unless($target eq 'tex') {
+                                      unless (($target eq 'tex') || ($target eq 'tex_answer')) {
                                           $r->print('<hr />');
                                       } 
 				  }
@@ -517,25 +490,25 @@ sub handler {
                                   &mt('It is recommended that you use an up-to-date virus scanner before handling this file.').'</p><p><table>'.
                                   &Apache::londocs::entryline(0,&mt("Click to download or use your browser's Save Link function"),'/'.&Apache::lonnet::declutter($hash{'src_'.$rid})).'</table></p><br />');
                               }
-			      unless ($target eq 'tex') {
+			      unless (($target eq 'tex') || ($target eq 'tex_answer')) {
 				  $r->print('</td>');
 			      } else {
-                                  for (my $incol=1;$incol<=$avespan;$incol++) {
-				      $r->print(' & ');
-				  }
+#                                  for (my $incol=1;$incol<=$avespan;$incol++) {
+#				      $r->print(' & ');
+#				  }
 			      }
                           }
-			      unless ($target eq 'tex') {
+			      unless (($target eq 'tex') || ($target eq 'tex_answer')) {
 				  $r->print('</tr>');
 			      } else {
-				  $r->print('REMOVETHEHEADOFLONGTABLE\\\\');
+#				  $r->print('REMOVETHEHEADOFLONGTABLE\\\\');
 			      }
 		        }
                       }
-		      unless ($target eq 'tex') {
+		      unless (($target eq 'tex') || ($target eq 'tex_answer')) {
 			  $r->print("\n</table>");
 		      } else {
-			  $r->print('\end{longtable}\strut');
+#			  $r->print('\end{longtable}\strut');
 		      }
 # ---------------------------------------------------------------- Submit, etc.
                       if ($nforms) {
@@ -543,7 +516,7 @@ sub handler {
 	                  '<input name="all_submit" value="Submit All" type="'.
 			  (($nforms>1)?'submit':'hidden').'"></input></form>');
                       }
-		      unless ($target eq 'tex') {
+		      unless (($target eq 'tex') || ($target eq 'tex_answer')) {
 			  $r->print(&Apache::loncommon::end_page({'discussion'
 								      => 1,}));
 		      } else {
@@ -577,9 +550,65 @@ sub handler {
   return OK; 
 }
 
+sub get_buttons {
+    my ($hash,$rid) = @_;
+
+    my $metainfo = '';
+    my $esrc=&Apache::lonnet::declutter($hash->{'src_'.$rid});
+    my ($mapid,$resid)=split(/\./,$rid);
+    my $symb=&Apache::lonnet::encode_symb($hash->{'map_id_'.$mapid},
+					  $resid,
+					  $hash->{'src_'.$rid});
+    if ($hash->{'encrypted_'.$rid}) {
+	$symb=&Apache::lonenc::encrypted($symb);
+	$esrc=&Apache::lonenc::encrypted($esrc);
+    }
+    if ($hash->{'src_'.$rid} !~ m-^/uploaded/-
+	&& !$env{'request.enc'}
+	&& ($env{'request.role.adv'}
+	    || !$hash->{'encrypted_'.$rid})) { 
+	$metainfo .='<a name="'.&escape($symb).'" />'.
+	    '<a href="'.$hash->{'src_'.$rid}.'.meta'.'" target="LONcatInfo">'.
+	    '<img src="/adm/lonMisc/cat_button.png" class="LC_icon" />'.
+	    '</a>';
+    }
+    $metainfo .= '<a href="/adm/evaluate?postdata='.
+	&escape($esrc).
+	'" target="LONcatInfo">'.
+	'<img src="/adm/lonMisc/eval_button.png" class="LC_icon" />'.
+	'</a>';
+    if (($hash->{'src_'.$rid}=~/\.(problem|exam|quiz|assess|survey|form)$/) &&
+	($hash->{'src_'.$rid} !~ m-^/uploaded/-)) {
+
+	if (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) {
+	    $metainfo.=
+		'<a href="/adm/grades?symb='.&escape($symb).
+#               '&command=submission" target="LONcatInfo">'.
+		'&command=submission">'.
+		'<img src="/adm/lonMisc/subm_button.png" class="LC_icon" />'.
+		'</a>'.
+		'<a href="/adm/grades?symb='.&escape($symb).
+#               '&command=gradingmenu" target="LONcatInfo">'.
+		'&command=gradingmenu">'.
+		'<img src="/adm/lonMisc/pgrd_button.png" class="LC_icon" />'.
+		'</a>';
+	}
+	if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) {
+	    $metainfo.=
+		'<a href="/adm/parmset?symb='.&escape($symb).
+#               '" target="LONcatInfo">'.
+		'" >'.
+		'<img src="/adm/lonMisc/pprm_button.png" class="LC_icon" />'.
+		'</a>';
+	}
+    }
+    return $metainfo;
+}
+
 1;
 __END__
 
+
 =head1 NAME
 
 Apache::lonpage - Page Handler
@@ -681,5 +710,3 @@ tracetable() : Build page table.
 =cut
 
 
-
-