Diff for /loncom/interface/lonprintout.pm between versions 1.560.2.1 and 1.568.2.10

version 1.560.2.1, 2009/08/17 10:48:28 version 1.568.2.10, 2010/11/13 01:57:14
Line 1 Line 1
   #
 # The LearningOnline Network  # The LearningOnline Network
 # Printout  # Printout
 #  #
Line 26 Line 27
 #  #
 #  #
 package Apache::lonprintout;  package Apache::lonprintout;
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonxml;  use Apache::lonxml;
Line 74  my $ssi_retry_count = 5; # Some arbitrar Line 74  my $ssi_retry_count = 5; # Some arbitrar
   
 my $font_size = 'normalsize'; # Default is normalsize...  my $font_size = 'normalsize'; # Default is normalsize...
   
   #----------------------------  Helper helpers. -------------------------
   
   #  Returns the text needd for a student chooser.
   #  that text must still be parsed by the helper xml parser.
   # Parameters:
   #   this_state   - State name of the chooser.
   #   sort_choice  - variable to hold the sorting choice.
   #   variable     - Name of variable to hold students.
   #   next_state   - State after chooser.
   
   
   sub generate_student_chooser {
       my ($this_state, 
    $sort_choice, 
    $variable, 
    $next_state) = @_;
       my $result = <<CHOOSE_STUDENTS;
     <state name="$this_state" title="Select Students and Resources">
         <message><b>Select sorting order of printout</b> </message>
   
       <choices variable="$sort_choice">
         <choice computer='0'>Sort by section then student</choice>
         <choice computer='1'>Sort by students across sections.</choice>
       </choices>
   
         <message><br /><hr /><br /> </message>
         <student multichoice='1' 
                  variable="$variable" 
                  nextstate="$next_state" 
                  coursepersonnel="1" />
     </state>
   
   CHOOSE_STUDENTS
   
     return $result;
   }
   
   # Generate the text needed for a resource chooser given the top level of
   # the sequence/page
   #
   # Parameters:
   #     this_state    - State name of the chooser.
   #     prompt_text   - Text to use to prompt user.
   #     resource_options - Resource tag options e.g.
   #                        "multichoice='1', toponly='1', addstatus='1'"
   #                     that control the selection and appearance of the
   #                     resource selector.
   #     variable      - Name of the variable to hold the choice
   #     next_state    - Name of the next state the helper should transition
   #                     to
   #     top_url       - Top level URL within which to make the selector.
   #                     If empty the top level sequence is shown.
   #     filter        - How to filter the resources.
   #     value_func    - <valuefunc> function.
   #     choice_func   - If not empty generates a <choicefunc> with this function.
   #     start_new_option 
   #                   - Fragment appended after valuefunc.
   #
   #
   sub generate_resource_chooser {
       my ($this_state,
    $prompt_text,
    $resource_options,
    $variable,
    $next_state,
    $top_url,
    $filter,
    $choice_func,
    $value_func,
    $start_new_option)  = @_;
   
       my $result = <<CHOOSE_RESOURCES;
   <state name="$this_state" title="$prompt_text">
       <resource variable="$variable" $resource_options
                 closeallpages="1">
         <nextstate>$next_state</nextstate>
         <filterfunc>return $filter;</filterfunc>
   CHOOSE_RESOURCES
       if ($choice_func ne '') {
    $result .= "<choicefunc>return $choice_func;</choicefunc>";
       }
       if ($top_url ne '') {
    $result .=  "<mapurl>$top_url</mapurl>";
       }
       $result .= <<CHOOSE_RESOURCES;
         <valuefunc>return $value_func;</valuefunc>
         $start_new_option
         </resource>
       </state>
   CHOOSE_RESOURCES
   
       return $result;
   }
   #
   #   Generate the helper XML for a code choice helper dialog:
   #
   # Paramters:
   #   $helper       - Reference to the helper.
   #   $state        - Name of the state for the chooser.
   #   $next_state   - Name fo the state to follow the chooser.
   #   $bubble_types - Populates the bubble sheet type dropt down.
   #   $code_selections - Provides set of code choices that have been used
   #   $saved_codes  - Provides the list of saved codes.
   #
   # Returns;
   #   The Xml of the code chooser.
   #
   sub generate_code_selector {
       my ($helper,
    $state,
    $next_state,
    $bubble_types,
    $code_selections,
    $saved_codes) = @_; # Unpack the parameters.
   
       my $result = <<CHOOSE_ANON1;
     <state name="$state" title="Specify CODEd Assignments">
       <nextstate>$next_state</nextstate>
       <message><h4>Fill out one of the forms below</h4></message>
       <message><br /><hr /> <br /></message>
       <message><h3>Generate new CODEd Assignments</h3></message>
       <message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message>
       <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
          <validator>
    if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
       !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&
               !\$helper->{'VARS'}{'SINGLE_CODE'}                    &&
       !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
       return "You need to specify the number of assignments to print";
    }
    return undef;
          </validator>
       </string>
       <message></td></tr><tr><td></message>
       <message><b>Names to save the CODEs under for later:</b></message>
       <message></td><td></message>
       <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
       <message></td></tr><tr><td></message>
       <message><b>Bubble sheet type:</b></message>
       <message></td><td></message>
       <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
       $bubble_types
       </dropdown>
       <message></td></tr><tr><td colspan="2"></td></tr><tr><td></message>
       <message></td></tr><tr><td></table></message>
       <message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message>
       <message><tr><td><b>Enter a CODE to print:</b></td><td></message>
       <string variable="SINGLE_CODE" size="10">
           <validator>
      if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&
         !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                 &&
         !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
         return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
         \$helper->{'VARS'}{'CODE_OPTION'});
      } else {
          return undef; # Other forces control us.
      }
           </validator>
       </string>
       <message></td></tr><tr><td></message>
           $code_selections
       <message></td></tr></table></message>
       <message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message>
       <message><b>Select saved CODEs:</b></message>
       <message></td><td></message>
       <dropdown variable="REUSE_OLD_CODES">
           $saved_codes
       </dropdown>
       <message></td></tr></table></message>
     </state>
   CHOOSE_ANON1
   
      return $result;
   }
   
   #-----------------------------------------------------------------------
   
   
 # Fetch the contents of a resource, uninterpreted.  # Fetch the contents of a resource, uninterpreted.
 # This is used here to fetch a latex file to be included  # This is used here to fetch a latex file to be included
Line 129  sub set_font_size { Line 306  sub set_font_size {
   
     my ($text) = @_;      my ($text) = @_;
   
     $text =~ s/\\begin{document}/\\begin{document}{\\$font_size/;      # There appear to be cases where the font directive is empty.. in which
     $text =~ s/\\end{document}/}\\end{document}/;      # case the first substituion would  insert a spurious \ oh happy day.
     return $text;      # as this has been the cause of much mystery and hair pulling _sigh_
   
       if ($font_size ne '') {
   
           $text =~ s/\\begin{document}/\\begin{document}{\\$font_size/;
       }
       $text =~ s/\\end{document}/}\\end{document}/;
       return $text;
 }  }
   
 # include_pdf - PDF files are included into the   # include_pdf - PDF files are included into the 
Line 317  sub printf_style_subst { Line 499  sub printf_style_subst {
 #     %a    - Assignment name.  #     %a    - Assignment name.
 #     %c    - Course name.  #     %c    - Course name.
 #     %n    - Student name.  #     %n    - Student name.
 #     %s    - The section if it is supplied.  
 #  #
 sub format_page_header {  sub format_page_header {
     my ($width, $format, $assignment, $course, $student, $section) = @_;      my ($width, $format, $assignment, $course, $student) = @_;
   
       
     $width = &recalcto_mm($width); # Get width in mm.      $width = &recalcto_mm($width); # Get width in mm.
       my $chars_per_line = int($width/2);   # Character/textline.
   
     #  Default format?      #  Default format?
   
     if ($format eq '') {      if ($format eq '') {
Line 337  sub format_page_header { Line 519  sub format_page_header {
  #   but only truncate the course.   #   but only truncate the course.
  # - Allow the assignment to be 2 lines (wrapped).   # - Allow the assignment to be 2 lines (wrapped).
  #   #
  my $chars_per_line = $width/2; # Character/textline.  
   
   
   
  my $name_length    = int($chars_per_line *3 /4);  
  my $sec_length     = int($chars_per_line / 5);  
   
  $format  = "%$name_length".'n';          my $firstline = "$student $course";
           if (length($firstline) > $chars_per_line) {
  if ($section) {              my $lastchar = $chars_per_line - length($student) - 1;
     $format .=  ' - Sec: '."%$sec_length".'s';              if ($lastchar > 0) {
  }                  $course = substr($course, 0, $lastchar);
               } else {            # Nothing left of course:
                   $course = '';
               }
           }
           if (length($assignment) > $chars_per_line) {
               $assignment = substr($assignment, 0, $chars_per_line);
           }
   
  $format .= '\\\\%c \\\\ %a';          $format =  "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}";
           
   
     }      } else {
     # An open question is how to handle long user formatted page headers...          # An open question is how to handle long user formatted page headers...
     # A possible future is to support e.g. %na so that the user can control          # A possible future is to support e.g. %na so that the user can control
     # the truncation of the elements that can appear in the header.          # the truncation of the elements that can appear in the header.
     #          #
     $format =  &printf_style_subst("a", $format, $assignment);          $format =  &printf_style_subst("a", $format, $assignment);
     $format =  &printf_style_subst("c", $format, $course);          $format =  &printf_style_subst("c", $format, $course);
     $format =  &printf_style_subst("n", $format, $student);          $format =  &printf_style_subst("n", $format, $student);
     $format =  &printf_style_subst("s", $format, $section);  
               # If the user put %'s in the format string, they  must be escaped
               # to \% else LaTeX will think they are comments and terminate
     # If the user put %'s in the format string, they  must be escaped          # the line.. which is bad!!!
     # to \% else LaTeX will think they are comments and terminate  
     # the line.. which is bad!!!  
       
     # If the user has role author, $course and $assignment are empty so  
     # there is '\\ \\ ' in the page header. That's cause a error in LaTeX  
     if($format =~ /\\\\\s\\\\\s/) {  
         #TODO find sensible caption for page header  
         my $testPrintout = '\\\\'.&mt('Construction Space').' \\\\'.&mt('Test-Printout ');  
         $format =~ s/\\\\\s\\\\\s/$testPrintout/;  
     }      }
           
   
     return $format;      return $format;
       
 }  }
   
 #  #
Line 1074  sub get_course { Line 1245  sub get_course {
     my $courseidinfo;      my $courseidinfo;
     if (defined($env{'request.course.id'})) {      if (defined($env{'request.course.id'})) {
  $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');   $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
  my $sec = $env{'request.course.sec'};  
       
     }      }
     return $courseidinfo;      return $courseidinfo;
 }  }
Line 1086  sub page_format_transformation { Line 1255  sub page_format_transformation {
   
     if ($selectionmade eq '4') {      if ($selectionmade eq '4') {
  if ($choice eq 'all_problems') {   if ($choice eq 'all_problems') {
     $assignment='Problems from the Whole Course';              $assignment=&mt('Problems from the Whole Course');
  } else {   } else {
     $assignment='Resources from the Whole Course';              $assignment=&mt('Resources from the Whole Course');
  }   }
     } else {      } else {
  $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header');   $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header');
Line 1098  sub page_format_transformation { Line 1267  sub page_format_transformation {
   
     my $name = &get_name();      my $name = &get_name();
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
       if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
     my $header_text  = $parmhash{'print_header_format'};      my $header_text  = $parmhash{'print_header_format'};
     $header_text     = &format_page_header($textwidth, $header_text, $assignment,      $header_text     = &format_page_header($textwidth, $header_text, $assignment,
    $courseidinfo, $name);     $courseidinfo, $name);
Line 1118  sub page_format_transformation { Line 1288  sub page_format_transformation {
     $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1}  \\vskip 5 mm\n /;      $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1}  \\vskip 5 mm\n /;
  }   }
  if ($papersize eq 'a4') {   if ($papersize eq 'a4') {
     $text =~ s/(\\begin{document})/$1\\special{papersize=210mm,297mm}/;              my $papersize_text;
               if ($perm{'pav'}) {
                   $papersize_text = '\\special{papersize=210mm,297mm}';
               } else {
                   $papersize_text = '\special{papersize=210mm,297mm}';
               }
               $text =~ s/(\\begin{document})/$1$papersize_text/;
  }   }
     }      }
     if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;}      if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;}
Line 1343  sub print_page_in_course { Line 1519  sub print_page_in_course {
   
   
     if ($mode ne '') {$mode='\\'.$mode}      if ($mode ne '') {$mode='\\'.$mode}
     my $result.= &print_latex_header($mode);      my $result   =    &print_latex_header($mode);
     if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {      if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {
  $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;   $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;
  my $title=&Apache::lonnet::gettitle($symb);   my $title=&Apache::lonnet::gettitle($symb);
  $title = &Apache::lonxml::latex_special_symbols($title);   $title = &Apache::lonxml::latex_special_symbols($title);
     } else {      } else {
  $result.=$currentURL;          my $esc_currentURL= $currentURL;
           $esc_currentURL =~ s/_/\\_/g;
           $result.=$esc_currentURL;
     }      }
     $result .= '\\\\';      $result .= '\\\\';
   
Line 1362  sub print_page_in_course { Line 1540  sub print_page_in_course {
   
     # First is the overall page description.  This is then followed by the       # First is the overall page description.  This is then followed by the 
     # components of the page. Each of which must be printed independently.      # components of the page. Each of which must be printed independently.
   
     my $the_page = shift(@page_resources);       my $the_page = shift(@page_resources); 
   
   
     foreach my $resource (@page_resources) {      foreach my $resource (@page_resources) {
  my $resource_src   = $resource->src(); # Essentially the URL of the resource.   my $resource_src   = $resource->src(); # Essentially the URL of the resource.
  $result           .= $resource->title() . '\\\\';   $result           .= $resource->title() . '\\\\';
Line 1379  sub print_page_in_course { Line 1557  sub print_page_in_course {
  }   }
  # these resources go through the XML transformer:   # these resources go through the XML transformer:
   
  elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm\xhtml|xhtm)$/)  {   elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/)  {
     my $urlp = &Apache::lonnet::clutter($resource_src);      my $urlp = &Apache::lonnet::clutter($resource_src);
     my %form;      my %form;
     my %moreenv;      my %moreenv;
Line 1390  sub print_page_in_course { Line 1568  sub print_page_in_course {
   
     $form{'grade_target'}  = 'tex';      $form{'grade_target'}  = 'tex';
     $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);      $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
     $form{'pdfFormFiels'} = $pdfFormFields; #       $form{'pdfFormFields'} = 'no';
     $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};          $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};    
           
     $form{'problem_split'}=$parmhash{'problem_stream_switch'};      $form{'problem_split'}=$parmhash{'problem_stream_switch'};
Line 1413  sub print_page_in_course { Line 1591  sub print_page_in_course {
   
     my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);      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      # current document with answers.. no need to encap in minipage
     #  since there's only one answer.      #  since there's only one answer.
Line 1438  sub print_page_in_course { Line 1613  sub print_page_in_course {
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
     $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;      $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
  } else {   } else {
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     if ($helper->{'VARS'}->{'construction'} ne '1') {      if ($helper->{'VARS'}->{'construction'} ne '1') {
  my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});   my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});
  $title = &Apache::lonxml::latex_special_symbols($title);   $title = &Apache::lonxml::latex_special_symbols($title);
Line 1473  sub print_page_in_course { Line 1648  sub print_page_in_course {
  $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$currentURL| \\strut\\\\\\strut /;   $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$currentURL| \\strut\\\\\\strut /;
   
     }      }
       $texversion = &latex_header_footer_remove($texversion);
   
       # the first remaining line is a comment from londefdef the second
       # line  seems to be an extraneous \vskip 1mm \\\\ :
               # (imperfect removal from header_footer_remove?
   
       $texversion =~ s/\\vskip 1mm \\\\\\\\//;
   
     $result .= $texversion;      $result .= $texversion;
     if ($currentURL=~m/\.page\s*$/) {      if ($currentURL=~m/\.page\s*$/) {
  ($result,$numberofcolumns) = &page_cleanup($result);   ($result,$numberofcolumns) = &page_cleanup($result);
Line 1489  sub print_page_in_course { Line 1672  sub print_page_in_course {
 # List of recently generated print files  # List of recently generated print files
 #  #
 sub recently_generated {  sub recently_generated {
     my $r=shift;      my ($prtspool) = @_;
     my $prtspool=$r->dir_config('lonPrtDir');      my $output;
   
     my $zip_result;      my $zip_result;
     my $pdf_result;      my $pdf_result;
     opendir(DIR,$prtspool);      opendir(DIR,$prtspool);
Line 1523  sub recently_generated { Line 1707  sub recently_generated {
  if ($ext eq 'zip') { $zip_result .= $result; }   if ($ext eq 'zip') { $zip_result .= $result; }
     }      }
     if ($zip_result || $pdf_result) {      if ($zip_result || $pdf_result) {
         $r->print('<hr />');          $output = '<hr />';
     }      }
     if ($zip_result) {      if ($zip_result) {
  $r->print('<h3>'.&mt('Recently generated printout zip files')."</h3>\n"   $output .='<h3>'.&mt('Recently generated printout zip files')."</h3>\n"
                   .&Apache::loncommon::start_data_table()                    .&Apache::loncommon::start_data_table()
                   .&Apache::loncommon::start_data_table_header_row()                    .&Apache::loncommon::start_data_table_header_row()
                   .'<th>'.&mt('Download').'</th>'                    .'<th>'.&mt('Download').'</th>'
Line 1534  sub recently_generated { Line 1718  sub recently_generated {
                   .'<th>'.&mt('File Size (Bytes)').'</th>'                    .'<th>'.&mt('File Size (Bytes)').'</th>'
                   .&Apache::loncommon::end_data_table_header_row()                    .&Apache::loncommon::end_data_table_header_row()
                   .$zip_result                    .$zip_result
                   .&Apache::loncommon::end_data_table()                    .&Apache::loncommon::end_data_table();
         );  
     }      }
     if ($pdf_result) {      if ($pdf_result) {
  $r->print('<h3>'.&mt('Recently generated printouts')."</h3>\n"   $output .='<h3>'.&mt('Recently generated printouts')."</h3>\n"
                   .&Apache::loncommon::start_data_table()                    .&Apache::loncommon::start_data_table()
                   .&Apache::loncommon::start_data_table_header_row()                    .&Apache::loncommon::start_data_table_header_row()
                   .'<th>'.&mt('Download').'</th>'                    .'<th>'.&mt('Download').'</th>'
Line 1546  sub recently_generated { Line 1729  sub recently_generated {
                   .'<th>'.&mt('File Size (Bytes)').'</th>'                    .'<th>'.&mt('File Size (Bytes)').'</th>'
                   .&Apache::loncommon::end_data_table_header_row()                    .&Apache::loncommon::end_data_table_header_row()
                   .$pdf_result                    .$pdf_result
                   .&Apache::loncommon::end_data_table()                    .&Apache::loncommon::end_data_table();
         );  
     }      }
       return $output;
 }  }
   
 #  #
Line 1560  sub recently_generated { Line 1743  sub recently_generated {
 #    A reference to a page break hash.  #    A reference to a page break hash.
 #  #
 #  #
 #use Data::Dumper;  # use Data::Dumper;
 #sub dump_helper_vars {  #sub dump_helper_vars {
 #    my ($helper) = @_;  #    my ($helper) = @_;
 #    my $helpervars = Dumper($helper->{'VARS'});  #    my $helpervars = Dumper($helper->{'VARS'});
Line 1776  ENDPART Line 1959  ENDPART
     my %form;      my %form;
     $form{'grade_target'} = 'tex';      $form{'grade_target'} = 'tex';
     $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);      $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
     $form{'pdfFormFields'} = $pdfFormFields;      $form{'pdfFormFields'} = 'no';
   
     # If form.showallfoils is set, then request all foils be shown:      # If form.showallfoils is set, then request all foils be shown:
     # privilege will be enforced both by not allowing the       # privilege will be enforced both by not allowing the 
Line 1912  ENDPART Line 2095  ENDPART
   
   
     $currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;      $currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;
 #    $result .= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});  
     $result .= &print_construction_sequence($currentURL, $helper, %form,      $result .= &print_construction_sequence($currentURL, $helper, %form,
     $LaTeXwidth);      $LaTeXwidth);
     $result .= '\end{document}';        $result .= '\end{document}';  
Line 1924  ENDPART Line 2106  ENDPART
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}   if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}
  $resources_printed .= $currentURL.':';   $resources_printed .= $currentURL.':';
  my $texversion=&ssi_with_retries($currentURL, $ssi_retry_count, %form);   my $texversion = &ssi_with_retries($currentURL, $ssi_retry_count, %form);
  if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {   if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
     my $annotation = &annotate($currentURL);      my $annotation = &annotate($currentURL);
     $texversion    =~ s/(\\end{document})/$annotation$1/;      $texversion    =~ s/(\\end{document})/$annotation$1/;
Line 1957  ENDPART Line 2139  ENDPART
   
                 
  } else {   } else {
     &Apache::lonnet::logthis("Unsupported type handler");  
     $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},      $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},
   $helper->{'VARS'}->{'symb'});    $helper->{'VARS'}->{'symb'});
  }   }
Line 1978  ENDPART Line 2159  ENDPART
  } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or   } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
  ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page'))   ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page'))
  {   {
     &Apache::lonnet::logthis("Selectionmade => 3");  
     $selectionmade = 3;      $selectionmade = 3;
  } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')    } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') 
  ) {   ) {
Line 2022  ENDPART Line 2202  ENDPART
     $urlp=&Apache::lonnet::clutter($urlp);      $urlp=&Apache::lonnet::clutter($urlp);
     $form{'symb'}=$master_seq[$i];      $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      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;}      if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;}
Line 2030  ENDPART Line 2209  ENDPART
     my $texversion='';      my $texversion='';
     if ($urlp!~m|^/adm/|      if ($urlp!~m|^/adm/|
  && $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {   && $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
  &Apache::lonnet::logthis("Problem");  
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  &Apache::lonxml::remember_problem_counter();   &Apache::lonxml::remember_problem_counter();
    if ($flag_latex_header_remove eq 'NO') {
       $texversion.=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});  # RF
                       unless (($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') ||
                               (($i==0) &&
                                (($urlp=~/\.page$/) ||
                                 ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') ||
                                 ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page')))) {
   
           $flag_latex_header_remove = 'YES';
                       }
    }
  $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form);   $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form);
  &Apache::lonnet::logthis("texversion so far: $texversion");  
  if ($urlp=~/\.page$/) {   if ($urlp=~/\.page$/) {
     &Apache::lonnet::("Special page actions");  
     ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);      ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
     if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;}       if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} 
     $texversion =~ s/\\end{document}\d*/\\end{document}/;      $texversion =~ s/\\end{document}\d*/\\end{document}/;
Line 2054  ENDPART Line 2241  ENDPART
     &Apache::lonxml::restore_problem_counter();      &Apache::lonxml::restore_problem_counter();
     my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);      my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
   
                       if ($urlp =~ /\.page$/) {
                           $answer =~ s/\\end{document}(\d*)$//;
                       }
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
  $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;                          if ($urlp =~ /\.page$/) {
                               my @probs = split(/\\keephidden{ENDOFPROBLEM}/,$texversion);
                               my $lastprob = pop(@probs);
                               $texversion = join('\keephidden{ENDOFPROBLEM}',@probs).
                               $answer.'\keephidden{ENDOFPROBLEM}'.$lastprob;
                           } else {
                               $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
                           }
     } else {      } else {
  if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {   if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/) {
     &Apache::lonnet::logthis("problem printing");  
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     $texversion =~ s/\\begin{document}//;  #    $texversion =~ s/\\begin{document}//;
     my $title = &Apache::lonnet::gettitle($master_seq[$i]);      my $title = &Apache::lonnet::gettitle($master_seq[$i]);
     $title = &Apache::lonxml::latex_special_symbols($title);      $title = &Apache::lonxml::latex_special_symbols($title);
     my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';      my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
Line 2090  ENDPART Line 2286  ENDPART
  if (($selectionmade == 4) and ($assignment ne $prevassignment)) {   if (($selectionmade == 4) and ($assignment ne $prevassignment)) {
     my $name = &get_name();      my $name = &get_name();
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
       if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
     $prevassignment=$assignment;      $prevassignment=$assignment;
     my $header_text = $parmhash{'print_header_format'};      my $header_text = $parmhash{'print_header_format'};
     $header_text    = &format_page_header($textwidth, $header_text,      $header_text    = &format_page_header($textwidth, $header_text,
Line 2104  ENDPART Line 2301  ENDPART
     }      }
  }   }
  $result .= $texversion;   $result .= $texversion;
  &Apache::lonnet::logthis("About to set rem header true with $result");  
  $flag_latex_header_remove = 'YES';      $flag_latex_header_remove = 'YES';   
     } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {       } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { 
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}   if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  my $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form);   my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);
  if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {   if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
     my $annotation = &annotate($urlp);      my $annotation = &annotate($urlp);
     $texversion =~ s/(\\end{document)/$annotation$1/;      $texversion =~ s/(\\end{document)/$annotation$1/;
Line 2127  ENDPART Line 2323  ENDPART
  if ($i > 0) {   if ($i > 0) {
     $result .= '\cleardoublepage';      $result .= '\cleardoublepage';
  }   }
  $result .= &include_pdf($urlp);                  my $texfrompdf = &include_pdf($urlp);
                   if ($flag_latex_header_remove ne 'NO') {
                       $texfrompdf = &latex_header_footer_remove($texfrompdf);
                   }
                   $result .= $texfrompdf;
  if ($i != $#master_seq) {   if ($i != $#master_seq) {
     if ($numberofcolumns eq '1') {      if ($numberofcolumns eq '1') {
  $result .= '\newpage';   $result .= '\newpage';
Line 2161  ENDPART Line 2361  ENDPART
  }   }
  $result .= '\end{document}';   $result .= '\end{document}';
      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||       } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||
         ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students_from_page') ||
       ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ||        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ||
       ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){
   
Line 2168  ENDPART Line 2369  ENDPART
      #-- prints assignments for whole class or for selected students         #-- prints assignments for whole class or for selected students  
  my $type;   my $type;
  if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||   if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||
        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students_from_page') ||
      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ) {       ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ) {
      $selectionmade=5;       $selectionmade=5;
      $type='problems';       $type='problems';
Line 2207  ENDPART Line 2409  ENDPART
  my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};   my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
   
  #loop over students   #loop over students
  my $flag_latex_header_remove = 'NO';  
     my $flag_latex_header_remove = 'NO';
  my %moreenv;   my %moreenv;
          $moreenv{'instructor_comments'}='hide';           $moreenv{'instructor_comments'}='hide';
  $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);   $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
Line 2255  ENDPART Line 2458  ENDPART
  &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);   &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
  $result .= $print_array[0].'  \end{document}';   $result .= $print_array[0].'  \end{document}';
      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon')     ||       } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon')     ||
         ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') ||
       ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon')  ) {         ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon')  ) { 
  my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};   my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
  my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};   my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
Line 2610  sub print_resources { Line 2814  sub print_resources {
     #   so we will just rely on prntout.pl to strip  ENDOFSTUDENTSTAMP from the      #   so we will just rely on prntout.pl to strip  ENDOFSTUDENTSTAMP from the
     #   postscript.  Each ENDOFSTUDENTSTAMP will go on a line by itself.      #   postscript.  Each ENDOFSTUDENTSTAMP will go on a line by itself.
     #      #
       my $syllabus_first = 0;
   
     foreach my $curresline (@{$master_seq})  {      foreach my $curresline (@{$master_seq})  {
  if (defined $page_breaks{$curresline}) {   if (defined $page_breaks{$curresline}) {
     if($i != 0) {      if($i != 0) {
Line 2621  sub print_resources { Line 2824  sub print_resources {
  $i++;   $i++;
   
  if ( !($type eq 'problems' &&    if ( !($type eq 'problems' && 
        ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) {         ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) ) {
     my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);      my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);
     if (&Apache::lonnet::allowed('bre',$res_url)) {      if (&Apache::lonnet::allowed('bre',$res_url)) {
  if ($res_url!~m|^ext/|   if ($res_url!~m|^ext/|
Line 2630  sub print_resources { Line 2833  sub print_resources {
     &Apache::lonxml::remember_problem_counter();          &Apache::lonxml::remember_problem_counter();    
   
     my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);      my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
                       if ($res_url =~ /\.page$/) {
                           if ($remove_latex_header eq 'NO') {
                               if (!($rendered =~ /\\begin\{document\}/)) {
                                   $rendered = &print_latex_header().$rendered;
                               }
                           }
                           if ($remove_latex_header eq 'YES') {
                               $rendered = &latex_header_footer_remove($rendered);
                           } else {
                               $rendered =~ s/\\end{document}\d*//;
                           }
                       }
     if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||      if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
        ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {         ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
  #   Use a copy of the hash so we don't pervert it on future loop passes.   #   Use a copy of the hash so we don't pervert it on future loop passes.
Line 2648  sub print_resources { Line 2862  sub print_resources {
   
           
     my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     $header =~ s/\\begin{document}//;     #<<<<<                              unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') {
           $header =~ s/\\begin{document}//;     #<<<<<
                               }
     my $title = &Apache::lonnet::gettitle($curresline);      my $title = &Apache::lonnet::gettitle($curresline);
     $title = &Apache::lonxml::latex_special_symbols($title);      $title = &Apache::lonxml::latex_special_symbols($title);
     my $body   ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';      my $body   ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
Line 2658  sub print_resources { Line 2874  sub print_resources {
     $rendered = $header.$body;      $rendered = $header.$body;
  }   }
     }      }
   
     if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {      if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
  my $url = &Apache::lonnet::clutter($res_url);   my $url = &Apache::lonnet::clutter($res_url);
  my $annotation = &annotate($url);   my $annotation = &annotate($url);
  $rendered =~  s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;   $rendered =~  s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;
     }      }
       my $junk;
     if ($remove_latex_header eq 'YES') {      if ($remove_latex_header eq 'YES') {
  $rendered = &latex_header_footer_remove($rendered);   $rendered = &latex_header_footer_remove($rendered);
     } else {      } else {
Line 2671  sub print_resources { Line 2887  sub print_resources {
     }      }
     $current_output .= $rendered;          $current_output .= $rendered;    
  } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {   } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
       if ($i == 1) {
    $syllabus_first = 1;
       }
     $printed .= $curresline.':';      $printed .= $curresline.':';
     my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);      my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
     if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {      if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
Line 2706  sub print_resources { Line 2925  sub print_resources {
  if (&Apache::loncommon::connection_aborted($r)) { last; }   if (&Apache::loncommon::connection_aborted($r)) { last; }
     }      }
   
       if ($syllabus_first) {
           $current_output =~ s/\\\\ Last updated:/Last updated:/
       }
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
       if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
       if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection}
     my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');      my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');
     my $header_line =      my $header_line =
  &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},   &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},
     $currentassignment, $courseidinfo, $fullname, $usersection);      $currentassignment, $courseidinfo, $fullname);
     my $header_start = ($columns_in_format == 1) ? '\lhead'      my $header_start = ($columns_in_format == 1) ? '\lhead'
                                          : '\fancyhead[LO]';                                           : '\fancyhead[LO]';
     $header_line = $header_start.'{'.$header_line.'}';      $header_line = $header_start.'{'.$header_line.'}';
Line 2946  sub printHelper { Line 3169  sub printHelper {
  } else {   } else {
     $url = $helper->{VARS}->{'postdata'};      $url = $helper->{VARS}->{'postdata'};
     $is_published=1; # From resource space.      $is_published=1; # From resource space.
     &Apache::lonnet::logthis("Resource url $url");  
  }   }
  $url = &Apache::lonnet::clutter($url);   $url = &Apache::lonnet::clutter($url);
         if (!$resourceTitle) { # if the resource doesn't have a title, use the filename          if (!$resourceTitle) { # if the resource doesn't have a title, use the filename
Line 3007  sub printHelper { Line 3229  sub printHelper {
     "<option text='".&mt('Start new page<br />before selected').      "<option text='".&mt('Start new page<br />before selected').
     "' variable='FINISHPAGE' />";      "' variable='FINISHPAGE' />";
     }      }
     # some debugging:  
     {      # If not construction space user can print the components of a page:
   
       my $page_ispage;
       my $page_title;
       if (!$helper->{VARS}->{'construction'}) {
  my $varspostdata = $helper->{VARS}->{'postdata'};   my $varspostdata = $helper->{VARS}->{'postdata'};
  my $varsassignment = $helper->{VARS}->{'assignment'};   my $varsassignment = $helper->{VARS}->{'assignment'};
  my $debugnavmap    = Apache::lonnavmaps::navmap->new();   my $page_navmap         = Apache::lonnavmaps::navmap->new();
  my @dbgresources      = $debugnavmap->retrieveResources($url);   if (defined($page_navmap)) {
  if(defined($dbgresources[0])) {      my @page_resources      = $page_navmap->retrieveResources($url);
  my $debugispage    = $dbgresources[0]->is_page();      if(defined($page_resources[0])) {
  my $debugtitle     = $dbgresources[0]->title();   $page_ispage       = $page_resources[0]->is_page();
  my $resourcesymb   = $dbgresources[0]->symb();   $page_title     = $page_resources[0]->title();
  my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb);   my $resourcesymb   = $page_resources[0]->symb();
  &Apache::lonnet::logthis("post: $varspostdata ass: $varsassignment is page: $debugispage");   my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb);
  if ($debugispage) {   if ($page_ispage) {
     push @{$printChoices},       push @{$printChoices}, 
     [&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$debugtitle.'</i></b>'),       [&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), 
      'map_problems_in_page',        'map_problems_in_page', 
      'CHOOSE_PROBLEMS_PAGE'];       'CHOOSE_PROBLEMS_PAGE'];
     push @{$printChoices},       push @{$printChoices}, 
          [&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$debugtitle.'</i></b>'),       [&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), 
   'map_resources_in_page',        'map_resources_in_page', 
   'CHOOSE_RESOURCES_PAGE'];       'CHOOSE_RESOURCES_PAGE'];
  }   }
  &Apache::lonnet::logthis("Pushing problems/resources from folder. $debugtitle");          my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE',
  &Apache::lonnet::logthis("Map url: $url");   'Select Problem(s) to print',
  &Apache::lonnet::logthis("Decoded symb: pagemap $pagemap id: $pageid url: $pageurl");   "multichoice='1' toponly='1' addstatus='1' closeallpages='1'",
         my $helperFragment = <<HELPERFRAGMENT;   'RESOURCES',
  <state name="CHOOSE_PROBLEMS_PAGE" title="Select Problem(s) to print">   'PAGESIZE',
     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"   $url,
               closeallpages="1">   $isProblem, '',  $symbFilter,
  <nextstate>PAGESIZE</nextstate>   $start_new_option);
       <filterfunc>return $isProblem;</filterfunc>  
       <mapurl>$pagemap</mapurl>  
       <valuefunc>return $symbFilter;</valuefunc>        $helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE',
       $start_new_option      'Select Resource(s) to print',
       </resource>      'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',
     </state>      'RESOURCES',
       'PAGESIZE',
       $url,
       $isNotMap, '', $symbFilter,
       $start_new_option);
   
       
   
   
   <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);   &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
   
     }      }
    }
     }      }
   
     if (($helper->{'VARS'}->{'construction'} ne '1' ) &&      if (($helper->{'VAR'}->{'construction'} ne '1' ) &&
  $helper->{VARS}->{'postdata'} &&   $helper->{VARS}->{'postdata'} &&
  $helper->{VARS}->{'assignment'}) {   $helper->{VARS}->{'assignment'}) {
         # Allow problems from sequence          # Allow problems from sequence
Line 3073  HELPERFRAGMENT Line 3296  HELPERFRAGMENT
         push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'),           push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 
  'map_problems_pages',    'map_problems_pages', 
  'CHOOSE_PROBLEMS_HTML'];   'CHOOSE_PROBLEMS_HTML'];
  &Apache::lonnet::logthis("Map url : $map");          my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS',
         my $helperFragment = <<HELPERFRAGMENT;   'Select Problem(s) to print',
   <state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print">   'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',
     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"   'RESOURCES',
               closeallpages="1">   'PAGESIZE',
       <nextstate>PAGESIZE</nextstate>   $map,
       <filterfunc>return $isProblem;</filterfunc>   $isProblem, '',
       <mapurl>$map</mapurl>   $symbFilter,
       <valuefunc>return $symbFilter;</valuefunc>   $start_new_option);
       $start_new_option   $helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML',
       </resource>        'Select Resource(s) to print',
     </state>         'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',
         'RESOURCES',
   <state name="CHOOSE_PROBLEMS_HTML" title="Select Resource(s) to print">        'PAGESIZE',
     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"        $map,
               closeallpages="1">        $isNotMap, '',
       <nextstate>PAGESIZE</nextstate>        $symbFilter,
       <filterfunc>return $isNotMap;</filterfunc>        $start_new_option);
       <mapurl>$map</mapurl>  
       <valuefunc>return $symbFilter;</valuefunc>  
       $start_new_option  
       </resource>  
     </state>  
 HELPERFRAGMENT  
   
  &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);   &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
     }      }
   
     # If the user has pfo (print for others) allow them to print all       # If the user has pfo (print for others) allow them to print all 
     # problems and resources  in the entire course, optionally for selected students      # problems and resources  in the entire course, optionally for selected students
       my $post_data = $helper->{VARS}->{'postdata'};
     if ($perm{'pfo'} &&  !$is_published  &&      if ($perm{'pfo'} &&  !$is_published  &&
         ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) {           ($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { 
   
         push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS'];          push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS'];
  push @{$printChoices}, [&mtn('Selected <b>Resources</b> from <b>entire course</b>'), 'all_resources', 'ALL_RESOURCES'];   push @{$printChoices}, [&mtn('Selected <b>Resources</b> from <b>entire course</b>'), 'all_resources', 'ALL_RESOURCES'];
  push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b> for <b>selected people</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS'];   push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b> for <b>selected people</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS'];
          &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);  my $suffixXml = <<ALL_PROBLEMS;
   <state name="ALL_PROBLEMS" title="Select Problem(s) to print">  
     <resource variable="RESOURCES" toponly='0' multichoice="1"  
  suppressEmptySequences='0' addstatus="1" closeallpages="1">  
       <nextstate>PAGESIZE</nextstate>  
       <filterfunc>return $isProblemOrMap;</filterfunc>  
       <choicefunc>return $isNotMap;</choicefunc>  
       <valuefunc>return $symbFilter;</valuefunc>  
       $start_new_option  
     </resource>  
   </state>  
   <state name="ALL_RESOURCES" title="Select Resource(s) to print">  
     <resource variable="RESOURCES" toponly='0' multichoice='1'  
               suppressEmptySequences='0' addstatus='1' closeallpages='1'>  
       <nextstate>PAGESIZE</nextstate>  
       <filterfunc>return $isNotMap; </filterfunc>  
       <valuefunc>return $symbFilter;</valuefunc>  
       $start_new_option  
     </resource>  
   </state>  
   <state name="ALL_PROBLEMS_STUDENTS" title="Select Problem(s) to print">  
     <resource variable="RESOURCES" toponly='0' multichoice="1"  
  suppressEmptySequences='0' addstatus="1" closeallpages="1">  
       <nextstate>STUDENTS1</nextstate>  
       <filterfunc>return $isProblemOrMap;</filterfunc>  
       <choicefunc>return $isNotMap;</choicefunc>  
       <valuefunc>return $symbFilter;</valuefunc>  
       $start_new_option  
     </resource>  
   </state>  
   <state name="STUDENTS1" title="Select People">    <state name="STUDENTS1" title="Select People">
       <message><b>Select sorting order of printout</b> </message>        <message><b>Select sorting order of printout</b> </message>
     <choices variable='student_sort'>      <choices variable='student_sort'>
Line 3148  HELPERFRAGMENT Line 3337  HELPERFRAGMENT
       <message><br /><hr /><br /> </message>        <message><br /><hr /><br /> </message>
       <student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/>        <student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/>
   </state>    </state>
   
 ALL_PROBLEMS  ALL_PROBLEMS
            &Apache::lonxml::xmlparse($r, 'helper', 
      &generate_resource_chooser('ALL_PROBLEMS',
         'SelectProblem(s) to print',
         'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"',
         'RESOURCES',
         'PAGESIZE',
         '',
         $isProblemOrMap, $isNotMap,
         $symbFilter,
         $start_new_option) .
      &generate_resource_chooser('ALL_RESOURCES',
         'Select Resource(s) to print',
         " toponly='0' multichoice='1' suppressEmptySequences='0' addstatus='1' closeallpages='1'",
         'RESOURCES',
         'PAGESIZE',
         '',
         $isNotMap,'',$symbFilter,
         $start_new_option) .
      &generate_resource_chooser('ALL_PROBLEMS_STUDENTS',
         'Select Problem(s) to print',
         'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"',
         'RESOURCES',
         'STUDENTS1',
         '',
         $isProblemOrMap,'' , $symbFilter,
         $start_new_option) .
        $suffixXml
      );
   
  if ($helper->{VARS}->{'assignment'}) {   if ($helper->{VARS}->{'assignment'}) {
     push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'problems_for_students', 'CHOOSE_STUDENTS'];  
     push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'problems_for_anon', 'CHOOSE_ANON1'];      # If we were looking at a page, allow a selection of problems from the page
       # either for selected students or for coded assignments.
   
       if ($page_ispage) {
    push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]selected people[_5]',
       '<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'),
    'problems_for_students_from_page', 'CHOOSE_TGT_STUDENTS_PAGE'];
    push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]CODEd assignments[_5]',
       '<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'),
    'problems_for_anon_page', 'CHOOSE_ANON1_PAGE'];
       }
       push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]',
    '<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 
       'problems_for_students', 'CHOOSE_STUDENTS'];
       push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]',
    '<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 
       'problems_for_anon', 'CHOOSE_ANON1'];
  }   }
   
  my $randomly_ordered_warning =    my $randomly_ordered_warning = 
Line 3168  ALL_PROBLEMS Line 3400  ALL_PROBLEMS
  #    with one state, and use REGEXPs at inclusion time to set state names   #    with one state, and use REGEXPs at inclusion time to set state names
  #    and next states for better mix and match capability   #    and next states for better mix and match capability
  #   #
  my $resource_selector=<<RESOURCE_SELECTOR;   my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS',
     <state name="SELECT_PROBLEMS" title="Select resources to print">    'Select resources to print',
     $randomly_ordered_warning    'multichoice="1" addstatus="1" closeallpages="1"',
     'RESOURCES', 
    <nextstate>PRINT_FORMATTING</nextstate>     'PRINT_FORMATTING',
    <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>    $map,
     <resource variable="RESOURCES" multichoice="1" addstatus="1"     $isProblem, '', $symbFilter,
               closeallpages="1">    $start_new_option);
       <filterfunc>return $isProblem;</filterfunc>   $resource_selector .=  <<RESOURCE_SELECTOR;
       <mapurl>$map</mapurl>  
       <valuefunc>return $symbFilter;</valuefunc>  
       $start_new_option  
       </resource>  
     </state>  
     <state name="PRINT_FORMATTING" title="How should results be printed?">      <state name="PRINT_FORMATTING" title="How should results be printed?">
     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>      <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
     <choices variable="EMPTY_PAGES">      <choices variable="EMPTY_PAGES">
Line 3201  ALL_PROBLEMS Line 3428  ALL_PROBLEMS
     </choices>      </choices>
     </state>      </state>
 RESOURCE_SELECTOR  RESOURCE_SELECTOR
           $resource_selector .= &generate_resource_chooser('CHOOSE_STUDENTS_PAGE',
    'Select Problem(s) to print',
    "multichoice='1' addstatus='1' closeallpages ='1'",
    'RESOURCES',
    'PRINT_FORMATTING',
    $url,
    $isProblem, '',  $symbFilter,
    $start_new_option);
   
   
   # Generate student choosers.
   
         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);  
   <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>          &Apache::lonxml::xmlparse($r, 'helper',
       <choice computer='1'>Sort by students across sections.</choice>    &generate_student_chooser('CHOOSE_TGT_STUDENTS_PAGE',
     </choices>      'student_sort',
       <message><br /><hr /><br /> </message>      'STUDENTS',
       <student multichoice='1' variable="STUDENTS" nextstate="SELECT_PROBLEMS" coursepersonnel="1"/>      'CHOOSE_STUDENTS_PAGE'));
   </state>   &Apache::lonxml::xmlparse($r, 'helper', 
     $resource_selector    &generate_student_chooser('CHOOSE_STUDENTS',
 CHOOSE_STUDENTS      'student_sort',
       'STUDENTS',
       'SELECT_PROBLEMS'));
    &Apache::lonxml::xmlparse($r, 'helper', $resource_selector);
   
  my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};   my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
  my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};   my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
Line 3273  CHOOSE_STUDENTS Line 3510  CHOOSE_STUDENTS
  if ($codechoice eq '') {   if ($codechoice eq '') {
     $codechoice='<choice computer="default">Default</choice>';      $codechoice='<choice computer="default">Default</choice>';
  }   }
         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1);   my $anon1 = &generate_code_selector($helper, 
   <state name="CHOOSE_ANON1" title="Specify CODEd Assignments">      'CHOOSE_ANON1',
     <nextstate>SELECT_PROBLEMS</nextstate>      'SELECT_PROBLEMS',
     <message><h4>Fill out one of the forms below</h4></message>      $codechoice,
     <message><br /><hr /> <br /></message>      $code_selection,
     <message><h3>Generate new CODEd Assignments</h3></message>      $namechoice) . $resource_selector;
     <message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message>      
     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">      
        <validator>          &Apache::lonxml::xmlparse($r, 'helper',$anon1);
  if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&  
     !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&   my $anon_page = &generate_code_selector($helper,
             !\$helper->{'VARS'}{'SINGLE_CODE'}                    &&   'CHOOSE_ANON1_PAGE',
     !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {   'SELECT_PROBLEMS_PAGE',
     return "You need to specify the number of assignments to print";   $codechoice,
  }   $code_selection,
  return undef;   $namechoice) .
        </validator>   &generate_resource_chooser('SELECT_PROBLEMS_PAGE',
     </string>     'Select Problem(s) to print',
     <message></td></tr><tr><td></message>     "multichoice='1' addstatus='1' closeallpages ='1'",
     <message><b>Names to save the CODEs under for later:</b></message>     'RESOURCES',
     <message></td><td></message>     'PRINT_FORMATTING',
     <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />     $url,
     <message></td></tr><tr><td></message>     $isProblem, '',  $symbFilter,
     <message><b>Bubble sheet type:</b></message>     $start_new_option);
     <message></td><td></message>   &Apache::lonxml::xmlparse($r, 'helper', $anon_page);
     <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">  
     $codechoice  
     </dropdown>  
     <message></td></tr><tr><td colspan="2"></td></tr><tr><td></message>  
     <message></td></tr><tr><td></table></message>  
     <message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message>  
     <message><tr><td><b>Enter a CODE to print:</b></td><td></message>  
     <string variable="SINGLE_CODE" size="10">  
         <validator>  
    if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&  
       !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                 &&  
       !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {  
       return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},  
       \$helper->{'VARS'}{'CODE_OPTION'});  
    } else {  
        return undef; # Other forces control us.  
    }  
         </validator>  
     </string>  
     <message></td></tr><tr><td></message>  
         $code_selection  
     <message></td></tr></table></message>  
     <message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message>  
     <message><b>Select saved CODEs:</b></message>  
     <message></td><td></message>  
     <dropdown variable="REUSE_OLD_CODES">  
         $namechoice  
     </dropdown>  
     <message></td></tr></table></message>  
   </state>  
   $resource_selector  
 CHOOSE_ANON1  
   
   
  if ($helper->{VARS}->{'assignment'}) {   if ($helper->{VARS}->{'assignment'}) {
Line 3341  CHOOSE_ANON1 Line 3546  CHOOSE_ANON1
  $resource_selector=<<RESOURCE_SELECTOR;   $resource_selector=<<RESOURCE_SELECTOR;
     <state name="SELECT_RESOURCES" title="Select Resources">      <state name="SELECT_RESOURCES" title="Select Resources">
     $randomly_ordered_warning      $randomly_ordered_warning
   
     <nextstate>PRINT_FORMATTING</nextstate>      <nextstate>PRINT_FORMATTING</nextstate>
     <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>      <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
     <resource variable="RESOURCES" multichoice="1" addstatus="1"       <resource variable="RESOURCES" multichoice="1" addstatus="1" 
Line 3352  CHOOSE_ANON1 Line 3556  CHOOSE_ANON1
       $start_new_option        $start_new_option
       </resource>        </resource>
     </state>      </state>
   
     <state name="PRINT_FORMATTING" title="Format of the print job">      <state name="PRINT_FORMATTING" title="Format of the print job">
     <nextstate>NUMBER_PER_PDF</nextstate>      <nextstate>NUMBER_PER_PDF</nextstate>
     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>      <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
Line 3770  PROBTYPE Line 3975  PROBTYPE
         return $helper;          return $helper;
     }          }    
   
     $r->print($helper->display());      my $footer;
     if ($helper->{STATE} eq 'START') {      if ($helper->{STATE} eq 'START') {
  &recently_generated($r);   my $prtspool=$r->dir_config('lonPrtDir');
           $footer = &recently_generated($prtspool);
     }      }
       $r->print($helper->display($footer));
     &Apache::lonhelper::unregisterHelperTags();      &Apache::lonhelper::unregisterHelperTags();
   
     return OK;      return OK;
Line 3849  sub render { Line 4056  sub render {
     my $PaperType=&mt('Paper type');      my $PaperType=&mt('Paper type');
     my $landscape=&mt('Landscape');      my $landscape=&mt('Landscape');
     my $portrait=&mt('Portrait');      my $portrait=&mt('Portrait');
     my $pdfFormLabel=&mt('PDF-Formfields');  
     my $with=&mt('with Formfields');  
     my $without=&mt('without Formfields');  
           
   
     $result.='<h3>'.&mt('Layout Options').'</h3>'      $result.='<h3>'.&mt('Layout Options').'</h3>'
Line 3860  sub render { Line 4064  sub render {
             .'<th>'.$PageLayout.'</th>'              .'<th>'.$PageLayout.'</th>'
             .'<th>'.$NumberOfColumns.'</th>'              .'<th>'.$NumberOfColumns.'</th>'
             .'<th>'.$PaperType.'</th>'              .'<th>'.$PaperType.'</th>'
             .'<th>'.$pdfFormLabel.'</th>'  
             .&Apache::loncommon::end_data_table_header_row()              .&Apache::loncommon::end_data_table_header_row()
             .&Apache::loncommon::start_data_table_row()              .&Apache::loncommon::start_data_table_row()
     .'<td>'      .'<td>'
Line 3900  sub render { Line 4103  sub render {
     }      }
     $result .= <<HTML;      $result .= <<HTML;
         </select>          </select>
     </td>          <hidden name="${var}.pdfFormFields" value="no" />
     <td align='center'>  
         <select name='${var}.pdfFormFields'>  
             <option selected="selected" value="no">$without</option>  
             <option value="yes">$with</option>  
         </select>  
     </td>      </td>
 HTML  HTML
     $result.=&Apache::loncommon::end_data_table_row()      $result.=&Apache::loncommon::end_data_table_row()

Removed from v.1.560.2.1  
changed lines
  Added in v.1.568.2.10


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>