Diff for /loncom/interface/lonprintout.pm between versions 1.342 and 1.393

version 1.342, 2004/12/20 21:15:20 version 1.393, 2005/09/19 10:58:33
Line 42  use Apache::lonratedt; Line 42  use Apache::lonratedt;
 use POSIX qw(strftime);  use POSIX qw(strftime);
 use Apache::lonlocal;  use Apache::lonlocal;
   
 my $LaTeXwidth = 0;  #
   #   Convert a numeric code to letters
   #
   sub num_to_letters {
       my ($num) = @_;
       my @nums= split('',$num);
       my @num_to_let=('A'..'Z');
       my $word;
       foreach my $digit (@nums) { $word.=$num_to_let[$digit]; }
       return $word;
   }
   #   Convert a letter code to numeric.
   #
   sub letters_to_num {
       my ($letters) = @_;
       my @letters = split('', uc($letters));
       my %substitution;
       my $digit = 0;
       foreach my $letter ('A'..'J') {
    $substitution{$letter} = $digit;
    $digit++;
       }
       #  The substitution is done as below to preserve leading
       #  zeroes which are needed to keep the code size exact
       #
       my $result ="";
       foreach my $letter (@letters) {
    $result.=$substitution{$letter};
       }
       return $result;
   }
   
   #  Determine if a code is a valid numeric code.  Valid
   #  numeric codes must be comprised entirely of digits and
   #  have a correct number of digits.
   #
   #  Parameters:
   #     value      - proposed code value.
   #     num_digits - Number of digits required.
   #
   sub is_valid_numeric_code {
       my ($value, $num_digits) = @_;
       #   Remove leading/trailing whitespace;
       $value =~ s/^\s*//g;
       $value =~ s/\s*$//g;
       
       #  All digits?
       if ($value !~ /^[0-9]+$/) {
    return "Numeric code $value has invalid characters - must only be digits";
       }
       if (length($value) != $num_digits) {
    return "Numeric code $value incorrect number of digits (correct = $num_digits)";
       }
       return undef;
   }
   #   Determines if a code is a valid alhpa code.  Alpha codes
   #   are ciphers that map  [A-J,a-j] -> 0..9 0..9.
   #   They also have a correct digit count.
   # Parameters:
   #     value          - Proposed code value.
   #     num_letters    - correct number of letters.
   # Note:
   #    leading and trailing whitespace are ignored.
   #
   sub is_valid_alpha_code {
       my ($value, $num_letters) = @_;
       
        # strip leading and trailing spaces.
   
       $value =~ s/^\s*//g;
       $value =~ s/\s*$//g;
   
       #  All alphas in the right range?
       if ($value !~ /^[A-J,a-j]+$/) {
    return "Invalid letter code $value must only contain A-J";
       }
       if (length($value) != $num_letters) {
    return "Letter code $value has incorrect number of letters (correct = $num_letters)";
       }
       return undef;
   }
   
   #   Determine if a code entered by the user in a helper is valid.
   #   valid depends on the code type and the type of code selected.
   #   The type of code selected can either be numeric or 
   #   Alphabetic.  If alphabetic, the code, in fact is a simple
   #   substitution cipher for the actual numeric code: 0->A, 1->B ...
   #   We'll be nice and be case insensitive for alpha codes.
   # Parameters:
   #    code_value    - the value of the code the user typed in.
   #    code_option   - The code type selected from the set in the scantron format
   #                    table.
   # Returns:
   #    undef         - The code is valid.
   #    other         - An error message indicating what's wrong.
   #
   sub is_code_valid {
       my ($code_value, $code_option) = @_;
       my ($code_type, $code_length) = ('letter', 6); # defaults.
       open(FG, $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
       foreach my $line (<FG>) {
    my ($name, $type, $length) = (split(/:/, $line))[0,2,4];
    if($name eq $code_option) {
       $code_length = $length;
       if($type eq 'number') {
    $code_type = 'number';
       }
    }
       }
       my $valid;
       if ($code_type eq 'number') {
    return &is_valid_numeric_code($code_value, $code_length);
       } else {
    return &is_valid_alpha_code($code_value, $code_length);
       }
   
   }
   
 #   Compare two students by name.  The students are in the form  #   Compare two students by name.  The students are in the form
 #   returned by the helper:  #   returned by the helper:
Line 391  sub character_chart { Line 506  sub character_chart {
     $result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g;      $result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g;
     $result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g;      $result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g;
     $result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g;      $result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g;
       $result =~ s/–/\\ensuremath\{-\}/g;
     $result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g;      $result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g;
     $result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g;      $result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g;
     $result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g;      $result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g;
Line 432  sub character_chart { Line 548  sub character_chart {
 my %page_formats=  my %page_formats=
     ('letter' => {      ('letter' => {
  'book' => {   'book' => {
      '1' => [ '7.1 in','10.2 in', '-0.57 in','-0.57 in','1 cm'],       '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm'],
      '2' => ['3.66 in','10.2 in', '-0.57 in','-0.57 in','1 cm']       '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm']
  },   },
  'album' => {   'album' => {
      '1' => [ '8.8 in', '6.8 in','-40 pt in',  '-60 pt','1 cm'],       '1' => [ '8.8 in', '6.8 in','-40 pt in',  '-60 pt','1 cm'],
Line 446  my %page_formats= Line 562  my %page_formats=
      '2' => ['3.16 in','13 in','-0.57 in','-0.57 in','-0.5 in']       '2' => ['3.16 in','13 in','-0.57 in','-0.57 in','-0.5 in']
  },   },
  'album' => {   'album' => {
      '1' => [],       '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'],
      '2' => []               '2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in']
           },            },
      },       },
      'tabloid' => {       'tabloid' => {
Line 456  my %page_formats= Line 572  my %page_formats=
      '2' => ['4.9 in','16 in','-0.57 in','-0.57 in','-0.5 in']       '2' => ['4.9 in','16 in','-0.57 in','-0.57 in','-0.5 in']
  },   },
  'album' => {   'album' => {
      '1' => [],       '1' => ['16 in','9.8 in','-0.57 in','-0.57 in','-0.5 in'],
      '2' => []       '2' => ['16 in','4.9 in','-0.57 in','-0.57 in','-0.5 in']
           },            },
      },       },
      'executive' => {       'executive' => {
Line 537  sub page_format { Line 653  sub page_format {
   
 sub get_name {  sub get_name {
     my ($uname,$udom)=@_;      my ($uname,$udom)=@_;
     if (!defined($uname)) { $uname=$ENV{'user.name'}; }      if (!defined($uname)) { $uname=$env{'user.name'}; }
     if (!defined($udom)) { $udom=$ENV{'user.domain'}; }      if (!defined($udom)) { $udom=$env{'user.domain'}; }
     my $plainname=&Apache::loncommon::plainname($uname,$udom);      my $plainname=&Apache::loncommon::plainname($uname,$udom);
     if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; }      if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; }
     $plainname=&Apache::lonxml::latex_special_symbols($plainname,'header');      $plainname=&Apache::lonxml::latex_special_symbols($plainname,'header');
Line 547  sub get_name { Line 663  sub get_name {
   
 sub get_course {  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(&Apache::lonnet::unescape($ENV{'course.'.$ENV{'request.course.id'}.'.description'}),'header');   $courseidinfo = &Apache::lonxml::latex_special_symbols(&Apache::lonnet::unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
     }      }
     return $courseidinfo;      return $courseidinfo;
 }  }
Line 610  sub page_cleanup { Line 726  sub page_cleanup {
   
 sub details_for_menu {  sub details_for_menu {
     my ($helper)=@_;      my ($helper)=@_;
     my $postdata=$ENV{'form.postdata'};      my $postdata=$env{'form.postdata'};
     if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; }      if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; }
     my $name_of_resource = &Apache::lonnet::gettitle($postdata);      my $name_of_resource = &Apache::lonnet::gettitle($postdata);
     my $symbolic = &Apache::lonnet::symbread($postdata);      my $symbolic = &Apache::lonnet::symbread($postdata);
Line 621  sub details_for_menu { Line 737  sub details_for_menu {
  $map =~ m|([^/]+)$|;   $map =~ m|([^/]+)$|;
  $name_of_sequence = $1;   $name_of_sequence = $1;
     }      }
     my $name_of_map = &Apache::lonnet::gettitle($ENV{'request.course.uri'});      my $name_of_map = &Apache::lonnet::gettitle($env{'request.course.uri'});
     if ($name_of_map =~ /^\s*$/) {      if ($name_of_map =~ /^\s*$/) {
  $ENV{'request.course.uri'} =~ m|([^/]+)$|;   $env{'request.course.uri'} =~ m|([^/]+)$|;
  $name_of_map = $1;   $name_of_map = $1;
     }      }
     return ($name_of_resource,$name_of_sequence,$name_of_map);      return ($name_of_resource,$name_of_sequence,$name_of_map);
Line 651  sub latex_corrections { Line 767  sub latex_corrections {
  $first_comment = index($result,'<!--',$first_comment);   $first_comment = index($result,'<!--',$first_comment);
     }      }
     $result =~ s/^\s+$//gm; #remove empty lines      $result =~ s/^\s+$//gm; #remove empty lines
     $result =~ s/(\s)(\s+)/$1/g; #removes more than one empty space      #removes more than one empty space
       $result =~ s|(\s\s+)|($1=~/[\n\r]/)?"\n":" "|ge;
     $result =~ s/\\\\\s*\\vskip/\\vskip/gm;      $result =~ s/\\\\\s*\\vskip/\\vskip/gm;
     $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g;      $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g;
     $result =~ s/{\\par }\s*\\\\/\\\\/gm;      $result =~ s/{\\par }\s*\\\\/\\\\/gm;
Line 698  sub IndexCreation { Line 815  sub IndexCreation {
 sub print_latex_header {  sub print_latex_header {
     my $mode=shift;      my $mode=shift;
     my $output='\documentclass[letterpaper]{article}';      my $output='\documentclass[letterpaper]{article}';
     if ($mode eq 'batchmode') {      if (($mode eq 'batchmode') || (!$env{'request.role.adv'})) {
  $output.='\batchmode';   $output.='\batchmode';
     }      }
     $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".      $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".
      '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n".       '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n".
      '\usepackage[dvips]{graphicx}\usepackage{epsfig}\usepackage{calc}'."\n".       '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n".
        '\usepackage{wrapfig}'.
        '\usepackage{picins}\usepackage{calc}'."\n".
      '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n".       '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n".
      '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n".       '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n".
      '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n".       '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n".
Line 725  sub path_to_problem { Line 844  sub path_to_problem {
     my $newurlp = '';      my $newurlp = '';
     $colwidth=~s/\s*mm\s*$//;      $colwidth=~s/\s*mm\s*$//;
 #characters average about 2 mm in width  #characters average about 2 mm in width
     if (length($urlp)*2 > $LaTeXwidth) {      if (length($urlp)*2 > $colwidth) {
  my @elements = split '/',$urlp;   my @elements = split '/',$urlp;
  my $curlength=0;   my $curlength=0;
  foreach my $element (@elements) {   foreach my $element (@elements) {
Line 783  sub unsupported { Line 902  sub unsupported {
 }  }
   
   
   #
   #   Retrieve the hash of page breaks.
   #
   #  Inputs:
   #    helper   - reference to helper object.
   #  Outputs
   #    A reference to a page break hash.
   #
   #
   
   sub get_page_breaks  {
       my ($helper) = @_;
       my %page_breaks;
       
       foreach my $break (split /\|\|\|/, $helper->{'VARS'}->{'FINISHPAGE'}) {
    $page_breaks{$break} = 1;
       }
       
       return %page_breaks;
   }
   
 sub output_data {  sub output_data {
     my ($r,$helper,$rparmhash) = @_;      my ($r,$helper,$rparmhash) = @_;
     my %parmhash = %$rparmhash;      my %parmhash = %$rparmhash;
       my $resources_printed = '';
       my $html=&Apache::lonxml::xmlbegin();
     my $bodytag=&Apache::loncommon::bodytag('Preparing Printout');      my $bodytag=&Apache::loncommon::bodytag('Preparing Printout');
     $r->print(<<ENDPART);      $r->print(<<ENDPART);
 <html>  $html
 <script type="text/javascript" language="Javascript" >  <head>
   <script type="text/javascript" language="Javascript">
     var editbrowser;      var editbrowser;
     function openbrowser(formname,elementname,only,omit) {      function openbrowser(formname,elementname,only,omit) {
         var url = '/res/?';          var url = '/res/?';
Line 813  sub output_data { Line 956  sub output_data {
         editbrowser.focus();          editbrowser.focus();
     }      }
 </script>  </script>
 <head>  
 <title>LON-CAPA output for printing</title>  <title>LON-CAPA output for printing</title>
 </head>  </head>
 $bodytag  $bodytag
 Please stand by while processing your print request, this may take some time ...  Please stand by while processing your print request, this may take some time ...
 ENDPART  ENDPART
   
   
   
       # fetch the pagebreaks and store them in the course environment
       # The page breaks will be pulled into the hash %page_breaks which is
       # indexed by symb and contains 1's for each break.
   
       $env{'form.pagebreaks'}  = $helper->{'VARS'}->{'FINISHPAGE'};
       $env{'form.lastprinttype'} = $helper->{'VARS'}->{'PRINT_TYPE'}; 
       &Apache::loncommon::store_course_settings('print',
         {'pagebreaks'    => 'scalar',
          'lastprinttype' => 'scalar'});
   
       my %page_breaks  = &get_page_breaks($helper);
   
     my $format_from_helper = $helper->{'VARS'}->{'FORMAT'};      my $format_from_helper = $helper->{'VARS'}->{'FORMAT'};
     my ($result,$selectionmade) = ('','');      my ($result,$selectionmade) = ('','');
     my $number_of_columns = 1; #used only for pages to determine the width of the cell      my $number_of_columns = 1; #used only for pages to determine the width of the cell
Line 831  ENDPART Line 987  ENDPART
  $laystyle='book';   $laystyle='book';
     }      }
     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);      my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);
     my $assignment =  $ENV{'form.assignment'};      my $assignment =  $env{'form.assignment'};
     my $LaTeXwidth=&recalcto_mm($textwidth);       my $LaTeXwidth=&recalcto_mm($textwidth); 
     my @print_array=();      my @print_array=();
     my @student_names=();      my @student_names=();
       
       #  Common settings for the %form has:
       # In some cases these settings get overriddent by specific cases, but the
       # settings are common enough to make it worthwhile factoring them out
       # here.
       #
       my %form;
       $form{'grade_target'} = 'tex';
       $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
   
       # If form.showallfoils is set, then request all foils be shown:
       # privilege will be enforced both by not allowing the 
       # check box selecting this option to be presnt unless it's ok,
       # and by lonresponse's priv. check.
       # The if is here because lonresponse.pm only cares that
       # showallfoils is defined, not what the value is.
   
       if ($helper->{'VARS'}->{'showallfoils'} eq "1") { 
    $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
       }
   
     if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') {      if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') {
       #-- single document - problem, page, html, xml, ...        #-- single document - problem, page, html, xml, ...
  my $currentURL;   my ($currentURL,$cleanURL);
   
  if ($helper->{'VARS'}->{'construction'} ne '1') {   if ($helper->{'VARS'}->{'construction'} ne '1') {
             #prints published resource              #prints published resource
     $currentURL=$helper->{'VARS'}->{'postdata'};      $currentURL=$helper->{'VARS'}->{'postdata'};
       $cleanURL=&Apache::lonenc::check_decrypt($currentURL);
  } else {   } else {
             #prints resource from the construction space              #prints resource from the construction space
     $currentURL='/'.$helper->{'VARS'}->{'filename'};      $currentURL='/'.$helper->{'VARS'}->{'filename'};
     if ($currentURL=~/([^?]+)/) {$currentURL=$1;}      if ($currentURL=~/([^?]+)/) {$currentURL=$1;}
       $cleanURL=$currentURL;
  }   }
  $selectionmade = 1;   $selectionmade = 1;
  if ($currentURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {   if ($cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
     my $rndseed=time;      my $rndseed=time;
     my $texversion='';      my $texversion='';
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
  my %moreenv;   my %moreenv;
  $moreenv{'request.filename'}=$currentURL;   $moreenv{'request.filename'}=$cleanURL;
  if ($helper->{'VARS'}->{'style_file'}=~/\w/) {   if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
     $moreenv{'construct.style'}=$helper->{'VARS'}->{'style_file'};      $moreenv{'construct.style'}=$helper->{'VARS'}->{'style_file'};
     my $dom = $ENV{'user.domain'};      my $dom = $env{'user.domain'};
     my $user = $ENV{'user.name'};      my $user = $env{'user.name'};
     my $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user);      my $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user);
  }   }
  my %form;  
                 if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}                  if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $form{'problem_split'}=$parmhash{'problem_stream_switch'};   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'suppress_tries'}=$parmhash{'suppress_tries'};   $form{'suppress_tries'}=$parmhash{'suppress_tries'};
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
Line 876  ENDPART Line 1052  ENDPART
  &Apache::lonnet::appenv(%moreenv);   &Apache::lonnet::appenv(%moreenv);
  &Apache::lonnet::delenv('form.counter');   &Apache::lonnet::delenv('form.counter');
  &Apache::lonxml::init_counter();   &Apache::lonxml::init_counter();
    $resources_printed .= $currentURL.':';
  $texversion.=&Apache::lonnet::ssi($currentURL,%form);   $texversion.=&Apache::lonnet::ssi($currentURL,%form);
  &Apache::lonnet::delenv('form.counter');   &Apache::lonnet::delenv('form.counter');
  &Apache::lonnet::delenv('request.filename');   &Apache::lonnet::delenv('request.filename');
     }      }
     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')) {
  my %form;   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'grade_target'}='answer';   $form{'grade_target'}='answer';
  $form{'answer_output_mode'}='tex';   $form{'answer_output_mode'}='tex';
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
    $resources_printed .= $currentURL.':';
  my $answer=&Apache::lonnet::ssi($currentURL,%form);   my $answer=&Apache::lonnet::ssi($currentURL,%form);
  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/;
Line 893  ENDPART Line 1071  ENDPART
     $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') {
  $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';   $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';
  $texversion.=&path_to_problem ($currentURL,$LaTeXwidth);   $texversion.=&path_to_problem($cleanURL,$LaTeXwidth);
     } else {      } else {
  $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm ';   $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm ';
  my $URLpath=$currentURL;   my $URLpath=$cleanURL;
  $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/;   $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/;
  $texversion.=&path_to_problem ($URLpath,$LaTeXwidth);   $texversion.=&path_to_problem ($URLpath,$LaTeXwidth);
     }      }
Line 929  ENDPART Line 1107  ENDPART
  if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {   if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {
     my $texversion='';      my $texversion='';
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
  my %form;  
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $form{'problem_split'}=$parmhash{'problem_stream_switch'};   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'suppress_tries'}=$parmhash{'suppress_tries'};   $form{'suppress_tries'}=$parmhash{'suppress_tries'};
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
    $resources_printed .=$urlp.':';
  $texversion=&Apache::lonnet::ssi($urlp,%form);   $texversion=&Apache::lonnet::ssi($urlp,%form);
     }      }
     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')) && 
        ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) {         ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) {
  my %form;   #  Don't permanently modify %$form...
  $form{'grade_target'}='answer';   my %answerform = %form;
  $form{'answer_output_mode'}='tex';   $answerform{'grade_target'}='answer';
  $form{'rndseed'}=$rndseed;   $answerform{'answer_output_mode'}='tex';
                         if ($urlp=~/\/res\//) {$ENV{'request.state'}='published';}   $answerform{'rndseed'}=$rndseed;
  my $answer=&Apache::lonnet::ssi($urlp,%form);   $answerform{'problem_split'}=$parmhash{'problem_stream_switch'};
                           if ($urlp=~/\/res\//) {$env{'request.state'}='published';}
    $resources_printed .= $urlp.':';
    my $answer=&Apache::lonnet::ssi($urlp,%answerform);
  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 {
Line 975  ENDPART Line 1154  ENDPART
     }      }
     if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}      if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}
     $result .= '\end{document}';         $result .= '\end{document}';   
  } elsif ($currentURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {    } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { 
  my %form;  
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $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.':';
  my $texversion=&Apache::lonnet::ssi($currentURL,%form);   my $texversion=&Apache::lonnet::ssi($currentURL,%form);
  $result .= $texversion;   $result .= $texversion;
  } else {   } else {
     $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'});      $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'});
  }   }
     } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems')       or
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or               ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') or               ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')       or
        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources')      or # BUGBUG
      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences')) {        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences')) { 
         #-- produce an output string          #-- produce an output string
  if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {   if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {
Line 997  ENDPART Line 1175  ENDPART
     $selectionmade = 3;      $selectionmade = 3;
  } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') {   } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') {
     $selectionmade = 4;      $selectionmade = 4;
    } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') {  #BUGBUG
       $selectionmade = 4;
  } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') {   } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') {
     $selectionmade = 7;      $selectionmade = 7;
  }   }
  my %form=();     
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $form{'problem_split'}=$parmhash{'problem_stream_switch'};   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'suppress_tries'}=$parmhash{'suppress_tries'};   $form{'suppress_tries'}=$parmhash{'suppress_tries'};
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
Line 1015  ENDPART Line 1192  ENDPART
  &Apache::lonnet::delenv('form.counter');   &Apache::lonnet::delenv('form.counter');
  &Apache::lonxml::init_counter();   &Apache::lonxml::init_counter();
  for (my $i=0;$i<=$#master_seq;$i++) {   for (my $i=0;$i<=$#master_seq;$i++) {
   
       # Note due to document structure, not allowed to put \newpage
       # prior to the first resource
   
       if (defined $page_breaks{$master_seq[$i]}) {
    if($i != 0) {
       $result.="\\newpage\n";
    }
       }
     my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);      my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
     $urlp=&Apache::lonnet::clutter($urlp);      $urlp=&Apache::lonnet::clutter($urlp);
     $form{'symb'}=$master_seq[$i];      $form{'symb'}=$master_seq[$i];
Line 1024  ENDPART Line 1210  ENDPART
     if ($i==0) {$prevassignment=$assignment;}      if ($i==0) {$prevassignment=$assignment;}
     my $texversion='';      my $texversion='';
     if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {      if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
    $resources_printed .= $urlp.':';
  $texversion.=&Apache::lonnet::ssi($urlp,%form);   $texversion.=&Apache::lonnet::ssi($urlp,%form);
  if ($urlp=~/\.page$/) {   if ($urlp=~/\.page$/) {
     ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);      ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
Line 1032  ENDPART Line 1219  ENDPART
     $flag_page_in_sequence = 'YES';      $flag_page_in_sequence = 'YES';
  }    } 
  my $lonidsdir=$r->dir_config('lonIDsDir');   my $lonidsdir=$r->dir_config('lonIDsDir');
  my $envfile=$ENV{'user.environment'};   my $envfile=$env{'user.environment'};
  $envfile=~/\/([^\/]+)\.id$/;   $envfile=~/\/([^\/]+)\.id$/;
  $envfile=$1;   $envfile=$1;
  &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);   &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
  my $current_counter=$ENV{'form.counter'};   my $current_counter=$env{'form.counter'};
  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')) {
     my %form;      #  Don't permanently pervert the %form hash
     $form{'grade_target'}='answer';      my %answerform = %form;
     $form{'answer_output_mode'}='tex';      $answerform{'grade_target'}='answer';
     my $answer=&Apache::lonnet::ssi($urlp,%form);      $answerform{'answer_output_mode'}='tex';
       $resources_printed .= $urlp.':';
       my $answer=&Apache::lonnet::ssi($urlp,%answerform);
     &Apache::lonnet::appenv(('form.counter' => $current_counter));      &Apache::lonnet::appenv(('form.counter' => $current_counter));
     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/;
Line 1075  ENDPART Line 1264  ENDPART
  $result .= $texversion;   $result .= $texversion;
  $flag_latex_header_remove = 'YES';      $flag_latex_header_remove = 'YES';   
     } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {       } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { 
  my %form;  
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $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.':';
  my $texversion=&Apache::lonnet::ssi($urlp,%form);   my $texversion=&Apache::lonnet::ssi($urlp,%form);
  if ($flag_latex_header_remove ne 'NO') {   if ($flag_latex_header_remove ne 'NO') {
     $texversion = &latex_header_footer_remove($texversion);      $texversion = &latex_header_footer_remove($texversion);
Line 1101  ENDPART Line 1288  ENDPART
     if (&Apache::loncommon::connection_aborted($r)) { last; }      if (&Apache::loncommon::connection_aborted($r)) { last; }
  }   }
  &Apache::lonnet::delenv('form.counter');   &Apache::lonnet::delenv('form.counter');
  if ($flag_page_in_sequence eq 'YES') {$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;}   if ($flag_page_in_sequence eq 'YES') {
       $result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;
    }
  $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 'resources_for_students')){        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){
   
   
      #-- 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') {
Line 1130  ENDPART Line 1321  ENDPART
      $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;       $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;
  }   }
  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);
  $moreenv{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};   $moreenv{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
    $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
    $moreenv{'suppress_tries'}   = $parmhash{'suppress_tries'};
  if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$moreenv{'problem_split'}='yes';}   if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$moreenv{'problem_split'}='yes';}
  my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75');   my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75');
  my $student_counter=-1;   my $student_counter=-1;
  foreach my $person (@students) {   foreach my $person (@students) {
              my $duefile="/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.due";  
                my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
      if (-e $duefile) {       if (-e $duefile) {
  my $temp_file = Apache::File->new('>>'.$duefile);   my $temp_file = Apache::File->new('>>'.$duefile);
  print $temp_file "1969\n";   print $temp_file "1969\n";
      }       }
      $student_counter++;       $student_counter++;
      my $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});       my $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});
      my ($output,$fullname)=&print_resources($r,$helper,$person,$type,\%moreenv,\@master_seq,$flag_latex_header_remove);       my ($output,$fullname, $printed)=&print_resources($r,$helper,
        $person,$type,
        \%moreenv,\@master_seq,
        $flag_latex_header_remove,
        $LaTeXwidth);
        $resources_printed .= ":";
      $print_array[$i].=$output;       $print_array[$i].=$output;
      $student_names[$i].=$person.':'.$fullname.'_END_';       $student_names[$i].=$person.':'.$fullname.'_END_';
      &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);       &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);
Line 1158  ENDPART Line 1358  ENDPART
  $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 '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'};
  my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};   my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};
  my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'};   my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'};
  my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};   my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};
    my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'};
    my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'};
   
    my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};
    open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
    my ($code_type,$code_length)=('letter',6);
    foreach my $line (<FH>) {
        my ($name,$type,$length) = (split(/:/,$line))[0,2,4];
        if ($name eq $code_option) {
    $code_length=$length;
    if ($type eq 'number') { $code_type = 'number'; }
        }
    }
  my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));   my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));
    $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
  my $seed=time+($$<<16)+($$);   my $seed=time+($$<<16)+($$);
  my @allcodes;   my @allcodes;
  if ($old_name) {   if ($old_name) {
      my %result=&Apache::lonnet::get('CODEs',[$old_name],$cdom,$cnum);       my %result=&Apache::lonnet::get('CODEs',
        [$old_name,"type\0$old_name"],
        $cdom,$cnum);
        $code_type=$result{"type\0$old_name"};
      @allcodes=split(',',$result{$old_name});       @allcodes=split(',',$result{$old_name});
      $num_todo=scalar(@allcodes);       $num_todo=scalar(@allcodes);
    } elsif ($selected_code) { # Selection value is always numeric.
        $num_todo = 1;
        @allcodes = ($selected_code);
    } elsif ($single_code) {
   
        $num_todo    = 1; # Unconditionally one code to do.
        # If an alpha code have to convert to numbers so it can be
        # converted back to letters again :-)
        #
        if ($code_type ne 'number') {
    $single_code = &letters_to_num($single_code);
        }
        @allcodes = ($single_code);
  } else {   } else {
      my %allcodes;       my %allcodes;
      srand($seed);       srand($seed);
      for (my $i=0;$i<$num_todo;$i++) {       for (my $i=0;$i<$num_todo;$i++) {
  $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,'6');   $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length,
       $code_type);
      }       }
      if ($code_name) {       if ($code_name) {
  &Apache::lonnet::put('CODEs',   &Apache::lonnet::put('CODEs',
       {$code_name =>join(',',keys(%allcodes))},        {
    $code_name =>join(',',keys(%allcodes)),
    "type\0$code_name" => $code_type
         },
       $cdom,$cnum);        $cdom,$cnum);
      }       }
      @allcodes=keys(%allcodes);       @allcodes=keys(%allcodes);
Line 1194  ENDPART Line 1428  ENDPART
  my $count=0;   my $count=0;
  foreach my $code (sort(@allcodes)) {   foreach my $code (sort(@allcodes)) {
      my $file_num=int($count/$number_per_page);       my $file_num=int($count/$number_per_page);
      $moreenv{'CODE'}=&num_to_letters($code);       if ($code_type eq 'number') { 
      my ($output,$fullname)=   $moreenv{'CODE'}=$code;
        } else {
    $moreenv{'CODE'}=&num_to_letters($code);
        }
        my ($output,$fullname, $printed)=
  &print_resources($r,$helper,'anonymous',$type,\%moreenv,   &print_resources($r,$helper,'anonymous',$type,\%moreenv,
   \@master_seq,$flag_latex_header_remove);    \@master_seq,$flag_latex_header_remove,
     $LaTeXwidth);
        $resources_printed .= ":";
      $print_array[$file_num].=$output;       $print_array[$file_num].=$output;
      &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,       &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
        &mt('last assignment').' '.$fullname);         &mt('last assignment').' '.$fullname);
Line 1221  ENDPART Line 1461  ENDPART
     my $urlp = $list_of_files[$i];      my $urlp = $list_of_files[$i];
     $urlp=~s|//|/|;      $urlp=~s|//|/|;
     if ($urlp=~/\//) {      if ($urlp=~/\//) {
  my %form;   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
  if ($urlp =~ m|/home/([^/]+)/public_html|) {   if ($urlp =~ m|/home/([^/]+)/public_html|) {
     $urlp =~ s|/home/([^/]*)/public_html|/~$1|;      $urlp =~ s|/home/([^/]*)/public_html|/~$1|;
  } else {   } else {
     $urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||;      $urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||;
  }   }
    $resources_printed .= $urlp.':';
  my $texversion=&Apache::lonnet::ssi($urlp,%form);   my $texversion=&Apache::lonnet::ssi($urlp,%form);
  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')) {
     my %form;      #  Don't permanently pervert %form:
     $form{'grade_target'}='answer';      my %answerform = %form;
     $form{'answer_output_mode'}='tex';      $answerform{'grade_target'}='answer';
     $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};      $answerform{'answer_output_mode'}='tex';
     $form{'rndseed'}=$rndseed;      $answerform{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
     my $answer=&Apache::lonnet::ssi($urlp,%form);      $answerform{'rndseed'}=$rndseed;
       $resources_printed .= $urlp.':';
       my $answer=&Apache::lonnet::ssi($urlp,%answerform);
     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 {
Line 1290  ENDPART Line 1531  ENDPART
  $result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;   $result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
  $result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;   $result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
     }      }
   
 #-- writing .tex file in prtspool   #-- writing .tex file in prtspool 
     my $temp_file;      my $temp_file;
     my $identifier = &Apache::loncommon::get_cgi_id();      my $identifier = &Apache::loncommon::get_cgi_id();
     my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout_".$identifier.".tex";      my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex";
     if (!($#print_array>0)) {       if (!($#print_array>0)) { 
  unless ($temp_file = Apache::File->new('>'.$filename)) {   unless ($temp_file = Apache::File->new('>'.$filename)) {
     $r->log_error("Couldn't open $filename for output $!");      $r->log_error("Couldn't open $filename for output $!");
Line 1316  ENDPART Line 1558  ENDPART
     my $temp_file;      my $temp_file;
     my $newfilename=$filename;      my $newfilename=$filename;
     my $num=$i+1;      my $num=$i+1;
     $newfilename =~s/\.tex$/_$num\.tex/;       $newfilename =~s/\.tex$//; 
       $newfilename=sprintf("%s_%03d.tex",$newfilename, $num);
     unless ($temp_file = Apache::File->new('>'.$newfilename)) {      unless ($temp_file = Apache::File->new('>'.$newfilename)) {
  $r->log_error("Couldn't open $newfilename for output $!");   $r->log_error("Couldn't open $newfilename for output $!");
  return SERVER_ERROR;    return SERVER_ERROR; 
Line 1333  ENDPART Line 1576  ENDPART
  if ($#student_names>-1) {   if ($#student_names>-1) {
     $student_names=$student_names[0].'_ENDPERSON_';      $student_names=$student_names[0].'_ENDPERSON_';
  } else {   } else {
     my $fullname = &get_name($ENV{'user.name'},$ENV{'user.domain'});      my $fullname = &get_name($env{'user.name'},$env{'user.domain'});
     $student_names=join(':',$ENV{'user.name'},$ENV{'user.domain'},      $student_names=join(':',$env{'user.name'},$env{'user.domain'},
  $ENV{'request.course.sec'},$fullname).   $env{'request.course.sec'},$fullname).
     '_ENDPERSON_'.'_END_';      '_ENDPERSON_'.'_END_';
  }   }
     }      }
Line 1352  ENDPART Line 1595  ENDPART
     $URLback=~s|^/~|/priv/|;      $URLback=~s|^/~|/priv/|;
  }   }
     }      }
       # logic for now is too complex to trace if this has been defined
       #  yet.
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     &Apache::lonnet::appenv('cgi.'.$identifier.'.file'   => $filename,      &Apache::lonnet::appenv('cgi.'.$identifier.'.file'   => $filename,
                             'cgi.'.$identifier.'.layout'  => $laystyle,                              'cgi.'.$identifier.'.layout'  => $laystyle,
                             'cgi.'.$identifier.'.numcol'  => $numberofcolumns,                              'cgi.'.$identifier.'.numcol'  => $numberofcolumns,
     'cgi.'.$identifier.'.paper'  => $papersize,      'cgi.'.$identifier.'.paper'  => $papersize,
                             'cgi.'.$identifier.'.selection' => $selectionmade,                              'cgi.'.$identifier.'.selection' => $selectionmade,
     'cgi.'.$identifier.'tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'},      'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'},
     'cgi.'.$identifier.'tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'},      'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'},
     'cgi.'.$identifier.'role' => $ENV{'request.role.adv'},      'cgi.'.$identifier.'.role' => $env{'request.role.adv'},
                             'cgi.'.$identifier.'numberoffiles' => $#print_array,                              'cgi.'.$identifier.'.numberoffiles' => $#print_array,
                             'cgi.'.$identifier.'studentnames' => $student_names,                              'cgi.'.$identifier.'.studentnames' => $student_names,
                             'cgi.'.$identifier.'backref' => $URLback,);                              'cgi.'.$identifier.'.backref' => $URLback,);
        &Apache::lonnet::appenv("cgi.$identifier.user"    => $env{'user.name'},
       "cgi.$identifier.domain"  => $env{'user.domain'},
       "cgi.$identifier.courseid" => $cnum, 
       "cgi.$identifier.coursedom" => $cdom, 
       "cgi.$identifier.resources" => $resources_printed);
   
 $r->print(<<FINALEND);  $r->print(<<FINALEND);
 <br />  <br />
 <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />  <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />
Line 1374  $r->print(<<FINALEND); Line 1625  $r->print(<<FINALEND);
 FINALEND  FINALEND
 }  }
   
 sub num_to_letters {  
     my ($num) = @_;  
     my @nums= split('',$num);  
     my @num_to_let=('A'..'Z');  
     my $word;  
     foreach my $digit (@nums) { $word.=$num_to_let[$digit]; }  
     return $word;  
 }  
   
 sub get_CODE {  sub get_CODE {
     my ($all_codes,$num,$seed,$size)=@_;      my ($all_codes,$num,$seed,$size,$type)=@_;
     my $max='1'.'0'x$size;      my $max='1'.'0'x$size;
     my $newcode;      my $newcode;
     while(1) {      while(1) {
  $newcode=sprintf("%06d",int(rand($max)));   $newcode=sprintf("%0".$size."d",int(rand($max)));
  if (!exists($$all_codes{$newcode})) {   if (!exists($$all_codes{$newcode})) {
     $$all_codes{$newcode}=1;      $$all_codes{$newcode}=1;
     return &num_to_letters($newcode);      if ($type eq 'number' ) {
    return $newcode;
       } else {
    return &num_to_letters($newcode);
       }
  }   }
     }      }
 }  }
   
 sub print_resources {  sub print_resources {
     my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header)=@_;      my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header,
    $LaTeXwidth)=@_;
     my $current_output = '';       my $current_output = ''; 
       my $printed = '';
     my ($username,$userdomain,$usersection) = split /:/,$person;      my ($username,$userdomain,$usersection) = split /:/,$person;
     my $fullname = &get_name($username,$userdomain);      my $fullname = &get_name($username,$userdomain);
     my $namepostfix;      my $namepostfix;
Line 1406  sub print_resources { Line 1655  sub print_resources {
  $namepostfix="\\\\Name: ";   $namepostfix="\\\\Name: ";
  $fullname = "CODE - ".$moreenv->{'CODE'};   $fullname = "CODE - ".$moreenv->{'CODE'};
     }      }
       my $i           = 0;
     #goes through all resources, checks if they are available for       #goes through all resources, checks if they are available for 
     #current student, and produces output         #current student, and produces output   
     &Apache::lonnet::delenv('form.counter');      &Apache::lonnet::delenv('form.counter');
     &Apache::lonxml::init_counter();      &Apache::lonxml::init_counter();
   
       my %page_breaks  = &get_page_breaks($helper);
   
     foreach my $curresline (@{$master_seq})  {      foreach my $curresline (@{$master_seq})  {
    if (defined $page_breaks{$curresline}) {
       if($i != 0) {
    $current_output.= "\\newpage\n";
       }
    }
    $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)$/)) ) {
     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=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {   if ($res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
     my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$ENV{'request.course.id'},'tex',$moreenv);      $printed .= $curresline.':';
       my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
     my $lonidsdir=$r->dir_config('lonIDsDir');      my $lonidsdir=$r->dir_config('lonIDsDir');
     my $envfile=$ENV{'user.environment'};      my $envfile=$env{'user.environment'};
     $envfile=~/\/([^\/]+)\.id$/;      $envfile=~/\/([^\/]+)\.id$/;
     $envfile=$1;      $envfile=$1;
     &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);      &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
     my $current_counter=$ENV{'form.counter'};      my $current_counter=$env{'form.counter'};
     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')) {
  $moreenv->{'answer_output_mode'}='tex';   #   Use a copy of the hash so we don't pervert it on future loop passes.
  $moreenv->{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   my %answerenv = %{$moreenv};
  my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$ENV{'request.course.id'},%{$moreenv});   $answerenv{'answer_output_mode'}='tex';
    $answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
    my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv);
  &Apache::lonnet::appenv(('form.counter' => $current_counter));   &Apache::lonnet::appenv(('form.counter' => $current_counter));
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
     $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/;      $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/;
Line 1445  sub print_resources { Line 1707  sub print_resources {
     }      }
     $current_output .= $rendered;          $current_output .= $rendered;    
  } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {   } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
     my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$ENV{'request.course.id'},'tex',$moreenv);      $printed .= $curresline.':';
       my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
     my $lonidsdir=$r->dir_config('lonIDsDir');      my $lonidsdir=$r->dir_config('lonIDsDir');
     my $envfile=$ENV{'user.environment'};      my $envfile=$env{'user.environment'};
     $envfile=~/\/([^\/]+)\.id$/;      $envfile=~/\/([^\/]+)\.id$/;
     $envfile=$1;      $envfile=$1;
     &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);      &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
     my $current_counter=$ENV{'form.counter'};      my $current_counter=$env{'form.counter'};
     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 1483  sub print_resources { Line 1746  sub print_resources {
  for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';}   for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';}
  $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output;   $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output;
     }      }
     return ($current_output,$fullname);      return ($current_output,$fullname, $printed);
   
 }  }
   
Line 1496  sub handler { Line 1759  sub handler {
 #    if ($loaderror) { return $loaderror; }  #    if ($loaderror) { return $loaderror; }
 #    $loaderror=  #    $loaderror=
 #       &Apache::lonnet::overloaderror($r,  #       &Apache::lonnet::overloaderror($r,
 #         $ENV{'course.'.$ENV{'request.course.id'}.'.home'});  #         $env{'course.'.$env{'request.course.id'}.'.home'});
 #    if ($loaderror) { return $loaderror; }  #    if ($loaderror) { return $loaderror; }
   
     my $result = printHelper($r);      my $result = printHelper($r);
Line 1509  sub handler { Line 1772  sub handler {
 # foreach $key (keys %{$helper->{'VARS'}}) {  # foreach $key (keys %{$helper->{'VARS'}}) {
 #    $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-<br />');  #    $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-<br />');
 # }  # }
 # foreach $key (keys %ENV) {  # foreach $key (keys %env) {
 #    $r->print(' '.$key.'->'.$ENV{$key}.'<-<br />');  #    $r->print(' '.$key.'->'.$env{$key}.'<-<br />');
 # }  # }
 # return OK;  # return OK;
   
     my %parmhash=&Apache::lonnet::coursedescription($ENV{'request.course.id'});      my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
        
 # my $key;   # my $key; 
 # foreach $key (keys %parmhash) {  # foreach $key (keys %parmhash) {
 #    $r->print(' '.$key.'->'.$parmhash{$key}.'<-<br />');  #    $r->print(' '.$key.'->'.$parmhash{$key}.'<-<br />');
 # }  # }
 # return OK;  #
   
   
       #  If a figure conversion queue file exists for this user.domain
       # we delete it since it can only be bad (if it were good, printout.pl
       # would have deleted it the last time around.
   
       my $conversion_queuefile = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";
       if(-e $conversion_queuefile) {
    unlink $conversion_queuefile;
       }
     &output_data($r,$helper,\%parmhash);      &output_data($r,$helper,\%parmhash);
     return OK;      return OK;
 }   } 
Line 1541  sub printHelper { Line 1813  sub printHelper {
     my $r = shift;      my $r = shift;
   
     if ($r->header_only) {      if ($r->header_only) {
         if ($ENV{'browser.mathml'}) {          if ($env{'browser.mathml'}) {
             &Apache::loncommon::content_type($r,'text/xml');              &Apache::loncommon::content_type($r,'text/xml');
         } else {          } else {
             &Apache::loncommon::content_type($r,'text/html');              &Apache::loncommon::content_type($r,'text/html');
Line 1551  sub printHelper { Line 1823  sub printHelper {
     }      }
   
     # Send header, nocache      # Send header, nocache
     if ($ENV{'browser.mathml'}) {      if ($env{'browser.mathml'}) {
         &Apache::loncommon::content_type($r,'text/xml');          &Apache::loncommon::content_type($r,'text/xml');
     } else {      } else {
         &Apache::loncommon::content_type($r,'text/html');          &Apache::loncommon::content_type($r,'text/html');
Line 1575  sub printHelper { Line 1847  sub printHelper {
     $helper->declareVar('assignment');      $helper->declareVar('assignment');
     $helper->declareVar('style_file');      $helper->declareVar('style_file');
     $helper->declareVar('student_sort');      $helper->declareVar('student_sort');
       $helper->declareVar('FINISHPAGE');
       $helper->declareVar('PRINT_TYPE');
       $helper->declareVar("showallfoils");
   
       #  The page breaks can get loaded initially from the course environment:
   
       if((!defined($env{"form.CURRENT_STATE"}))  ||
          ($env{'form.CURRENT_STATE'} == "START")) {
    $helper->{VARS}->{FINISHPAGE} = ""; # In case they did a back e.g.
       }
   
   
       
       &Apache::loncommon::restore_course_settings('print',
    {'pagebreaks'  => 'scalar',
            'lastprinttype' => 'scalar'});
   
       
       if("$helper->{VARS}->{PRINT_TYPE}" eq "$env{'form.lastprinttype'}") {
    $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
       }
       
           
     # This will persistently load in the data we want from the      # This will persistently load in the data we want from the
     # very first screen.      # very first screen.
     # Detect whether we're coming from construction space      # Detect whether we're coming from construction space
     if ($ENV{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) {      if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) {
         $helper->{VARS}->{'filename'} = "~$1/$2";          $helper->{VARS}->{'filename'} = "~$1/$2";
         $helper->{VARS}->{'construction'} = 1;          $helper->{VARS}->{'construction'} = 1;
     } else {      } else {
         if ($ENV{'form.postdata'}) {          if ($env{'form.postdata'}) {
             $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($ENV{'form.postdata'});              $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'});
         }          }
         if ($ENV{'form.symb'}) {          if ($env{'form.symb'}) {
             $helper->{VARS}->{'symb'} = $ENV{'form.symb'};              $helper->{VARS}->{'symb'} = $env{'form.symb'};
         }          }
         if ($ENV{'form.url'}) {          if ($env{'form.url'}) {
             $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});              $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
         }          }
     }      }
   
     if ($ENV{'form.symb'}) {      if ($env{'form.symb'}) {
         $helper->{VARS}->{'symb'} = $ENV{'form.symb'};          $helper->{VARS}->{'symb'} = $env{'form.symb'};
     }      }
     if ($ENV{'form.url'}) {      if ($env{'form.url'}) {
         $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});          $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
   
     }      }
           $helper->{VARS}->{'symb'}=
    &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});
     my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);      my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);
     if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}      if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}
   
Line 1619  sub printHelper { Line 1914  sub printHelper {
                          0, rindex($helper->{VARS}->{'filename'}, '/') + 1);                           0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
     } else {      } else {
         ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);          ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);
         $helper->{VARS}->{'postdata'} = Apache::lonnet::clutter($url);          $helper->{VARS}->{'postdata'} = 
       &Apache::lonenc::check_encrypt(&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
             my $postdata = $helper->{VARS}->{'postdata'};              my $postdata = $helper->{VARS}->{'postdata'};
Line 1627  sub printHelper { Line 1923  sub printHelper {
         }          }
         $subdir = &Apache::lonnet::filelocation("", $url);          $subdir = &Apache::lonnet::filelocation("", $url);
     }      }
     if (!$helper->{VARS}->{'curseed'} && $ENV{'form.curseed'}) {      if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) {
  $helper->{VARS}->{'curseed'}=$ENV{'form.curseed'};   $helper->{VARS}->{'curseed'}=$env{'form.curseed'};
     }      }
     if (!$helper->{VARS}->{'probstatus'} && $ENV{'form.problemtype'}) {      if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {
  $helper->{VARS}->{'probstatus'}=$ENV{'form.problemtype'};   $helper->{VARS}->{'probstatus'}=$env{'form.problemtype'};
     }      }
   
     my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();      my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();
     my $userPriviledged = ($ENV{'request.role'}=~m/^cc\./ or      my $userPriviledged = ($env{'request.role'}=~m/^cc\./ or
    $ENV{'request.role'}=~m/^in\./ or     $env{'request.role'}=~m/^in\./ or
    $ENV{'request.role'}=~m/^ta\./);     $env{'request.role'}=~m/^ta\./);
   
     Apache::lonhelper::registerHelperTags();      Apache::lonhelper::registerHelperTags();
   
Line 1680  sub printHelper { Line 1976  sub printHelper {
     $helper->declareVar('SEQUENCE');      $helper->declareVar('SEQUENCE');
   
     # Useful for debugging: Dump the help vars      # Useful for debugging: Dump the help vars
     #$r->print(Dumper($helper->{VARS}));  #    $r->print(Dumper($helper->{VARS}));
     #$r->print($map);  #    $r->print($map);
   
     # If we're in a sequence...      # If we're in a sequence...
     if (($helper->{'VARS'}->{'construction'} ne '1') &&      if (($helper->{'VARS'}->{'construction'} ne '1') &&
   
  $helper->{VARS}->{'postdata'} &&   $helper->{VARS}->{'postdata'} &&
  $helper->{VARS}->{'assignment'}) {   $helper->{VARS}->{'assignment'}) {
         # Allow problems from sequence          # Allow problems from sequence
Line 1701  sub printHelper { Line 1998  sub printHelper {
       <filterfunc>return $isProblem;</filterfunc>        <filterfunc>return $isProblem;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     </state>      </state>
   
Line 1712  sub printHelper { Line 2010  sub printHelper {
       <filterfunc>return $isNotMap;</filterfunc>        <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     </state>      </state>
 HELPERFRAGMENT  HELPERFRAGMENT
Line 1719  HELPERFRAGMENT Line 2018  HELPERFRAGMENT
  &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);   &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
     }      }
   
     # If the user is priviledged, allow them to print all       # If the user is privileged, allow them to print all 
     # problems in the course, optionally for selected students      # problems and resources  in the entier course, optionally for selected students
     if ($userPriviledged &&       if ($userPriviledged && 
         ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) {           ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { 
   
         push @{$printChoices}, ['<b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];          push @{$printChoices}, ['<b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];
    push @{$printChoices}, ['<b>Resources</b> from <b>entire course</b>', 'all_resources', 'ALL_RESOURCES'];
          &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);           &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);
   <state name="ALL_PROBLEMS" title="Select Problem(s) to print">    <state name="ALL_PROBLEMS" title="Select Problem(s) to print">
     <message>(mark them then click "next" button) <br /></message>      <message>(mark them then click "next" button) <br /></message>
Line 1733  HELPERFRAGMENT Line 2034  HELPERFRAGMENT
       <filterfunc>return $isProblemOrMap;</filterfunc>        <filterfunc>return $isProblemOrMap;</filterfunc>
       <choicefunc>return $isNotMap;</choicefunc>        <choicefunc>return $isNotMap;</choicefunc>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>
     </state>
     <state name="ALL_RESOURCES" title="Select Resource(s) to print">
       <message>(Mark them then click "next" button) <br /> </message>
       <resource variable="RESOURCES" toponly='0' multichoice='1'
                 suppressEmptySequences='0' addstatus='1' closeallpages='1'>
         <nextstate>PAGESIZE</nextstate>
         <filterfunc>return $isNotMap; </filterfunc>
         <valuefunc>return $symbFilter;</valuefunc>
         <option text='NewPage' variable='FINISHPAGE' />
     </resource>      </resource>
   </state>    </state>
 ALL_PROBLEMS  ALL_PROBLEMS
Line 1748  ALL_PROBLEMS Line 2060  ALL_PROBLEMS
       <filterfunc>return $isProblem;</filterfunc>        <filterfunc>return $isProblem;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='New Page' variable='FINISHPAGE' />
       </resource>        </resource>
     <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 1762  RESOURCE_SELECTOR Line 2075  RESOURCE_SELECTOR
   
         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);          &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);
   <state name="CHOOSE_STUDENTS" title="Select Students and Resources">    <state name="CHOOSE_STUDENTS" title="Select Students and Resources">
       <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" />        <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" coursepersonnel="1"/>
         <message><b>Select sort order</b> </message>
     <choices variable='student_sort'>      <choices variable='student_sort'>
       <choice computer='0'>Sort by section then student</choice>        <choice computer='0'>Sort by section then student</choice>
       <choice computer='1'>Sort by students across sections.</choice>        <choice computer='1'>Sort by students across sections.</choice>
Line 1771  RESOURCE_SELECTOR Line 2085  RESOURCE_SELECTOR
   </state>    </state>
 CHOOSE_STUDENTS  CHOOSE_STUDENTS
   
  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'};
         my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum);          my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum);
  my $namechoice='<choice></choice>';   my $namechoice='<choice></choice>';
  foreach my $name (sort {uc($a) cmp uc($b)} @names) {   foreach my $name (sort {uc($a) cmp uc($b)} @names) {
     if ($name =~ /^error: 2 /) { next; }      if ($name =~ /^error: 2 /) { next; }
       if ($name =~ /^type\0/) { next; }
     $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';      $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';
  }   }
   
   
           my %all_codes = &Apache::lonnet::get('CODEs',
        \@names, $cdom,$cnum);
    my %code_values;
    my @all_code_array;
    foreach my $key (keys %all_codes) {
       %code_values = &Apache::grades::get_codes($key, $cdom, $cnum);
       foreach my $key (keys %code_values) {
    push (@all_code_array, "$key");
       }
    }
   
    my $code_selection = "<choice></choice>\n";
    foreach my $code (sort {uc($a) cmp uc($b)} @all_code_array) {
       my $choice  = $code;
       if ($code =~ /^[A-Z]+$/) { # Alpha code
    $choice = &letters_to_num($code);
       }
       $code_selection .= '   <choice computer="'.$choice.'">'.$code."</choice>\n";
    }
    open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
    my $codechoice='';
    foreach my $line (<FH>) {
       my ($name,$description,$code_type,$code_length)=
    (split(/:/,$line))[0,1,2,4];
       if ($code_length > 0 && 
    $code_type =~/^(letter|number|-1)/) {
    $codechoice.='<choice computer="'.$name.'">'.$description.'</choice>';
       }
    }
    if ($codechoice eq '') {
       $codechoice='<choice computer="default">Default</choice>';
    }
         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1);          &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1);
   <state name="CHOOSE_ANON1" title="Select Students and Resources">    <state name="CHOOSE_ANON1" title="Select Students and Resources">
     <nextstate>PAGESIZE</nextstate>      <nextstate>PAGESIZE</nextstate>
     <message><hr width='33%' /><b>Number of anonymous assignments to print?</b></message>      <message><hr width='33%' /></message>
     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"></string>      <message><table><tr><td><b>Number of anonymous assignments to print?</b></td><td></message>
     <message><br /><b>Names to store the CODEs under for later:</b></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>Value of CODE to print?</b></td><td></message>
       <string variable="SINGLE_CODE" size="10" defaultvalue="zzzz">
           <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>
       <message><b>Choose single code from list</b></message>
       <message></td><td></message>
       <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">
       $code_selection
       </dropdown>
       <message></td></tr><tr><td></message>
       <message><b>Names to store the CODEs under for later:</b></message>
       <message></td><td></message>
     <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />      <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">
       $codechoice
       </dropdown>
       <message></td></tr></table></message>
     <message><hr width='33%' /></message>      <message><hr width='33%' /></message>
     <message><b>Reprint a set of saved CODEs:</b></message>      <message><b>Reprint a set of saved CODEs:</b></message>
     <dropdown variable="REUSE_OLD_CODES">      <dropdown variable="REUSE_OLD_CODES">
Line 1810  CHOOSE_ANON1 Line 2199  CHOOSE_ANON1
       <filterfunc>return $isNotMap;</filterfunc>        <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     <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 1824  RESOURCE_SELECTOR Line 2214  RESOURCE_SELECTOR
   
  &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1);   &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1);
   <state name="CHOOSE_STUDENTS1" title="Select Students and Resources">    <state name="CHOOSE_STUDENTS1" title="Select Students and Resources">
     <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" />      <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" coursepersonnel="1" />
     <choices variable='student_sort'>      <choices variable='student_sort'>
       <choice computer='0'>Sort by section then student</choice>        <choice computer='0'>Sort by section then student</choice>
       <choice computer='1'>Sort by students across sections.</choice>        <choice computer='1'>Sort by students across sections.</choice>
Line 1837  CHOOSE_STUDENTS1 Line 2227  CHOOSE_STUDENTS1
  &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2);   &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2);
   <state name="CHOOSE_ANON2" title="Select Students and Resources">    <state name="CHOOSE_ANON2" title="Select Students and Resources">
     <nextstate>PAGESIZE</nextstate>      <nextstate>PAGESIZE</nextstate>
     <message><hr width='33%' /><b>Number of anonymous assignments to print?</b></message>      <message><table><tr><td><b>Number of anonymous assignments to print?</b></td><td></message>
     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"></string>      <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
     <message><br /><b>Names to store the CODEs under for later:</b></message>         <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>Value of CODE to print?</b></td><td></message>
       <string variable="SINGLE_CODE" size="10" defaultvalue="zzzz">
           <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>
       <message><b>Choose single code from list</b></message>
       <message></td><td></message>
       <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">
       $code_selection
       </dropdown>
       <message></td></tr><tr><td></message>
       <message><b>Names to store the CODEs under for later:</b></message>
       <message></td><td></message>
     <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />      <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">
       $codechoice
       </dropdown>
       <message></td></tr></table></message>
     <message><hr width='33%' /></message>      <message><hr width='33%' /></message>
     <message><b>Reprint a set of saved CODEs:</b></message>      <message><b>Reprint a set of saved CODEs:</b></message>
     <dropdown variable="REUSE_OLD_CODES">      <dropdown variable="REUSE_OLD_CODES">
Line 1853  CHOOSE_ANON2 Line 2282  CHOOSE_ANON2
     }      }
   
     # FIXME: That RE should come from a library somewhere.      # FIXME: That RE should come from a library somewhere.
     if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $ENV{'request.role.adv'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') {          if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $env{'request.role.adv'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') {    
         push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from current subdirectory')." <b><i>$subdir</i></b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];          push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from current subdirectory')." <b><i>$subdir</i></b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
   
         my $f = '$filename';          my $f = '$filename';
Line 1893  CHOOSE_FROM_SUBDIR Line 2322  CHOOSE_FROM_SUBDIR
       <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>        <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>
       <filterfunc>return \$res->is_sequence;</filterfunc>        <filterfunc>return \$res->is_sequence;</filterfunc>
       <valuefunc>return $urlValue;</valuefunc>        <valuefunc>return $urlValue;</valuefunc>
         <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);
    </choicefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     </state>      </state>
   <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">    <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">
Line 1903  CHOOSE_FROM_SUBDIR Line 2335  CHOOSE_FROM_SUBDIR
       <filterfunc>return $isProblem</filterfunc>        <filterfunc>return $isProblem</filterfunc>
       <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>        <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     </state>      </state>
 CHOOSE_FROM_ANY_SEQUENCE  CHOOSE_FROM_ANY_SEQUENCE
Line 1915  CHOOSE_FROM_ANY_SEQUENCE Line 2348  CHOOSE_FROM_ANY_SEQUENCE
     Apache::lonhelper::message->new();      Apache::lonhelper::message->new();
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = 'PRINT_TYPE';      $paramHash->{'variable'} = 'PRINT_TYPE';
     $helper->declareVar('PRINT_TYPE');  
     $paramHash->{CHOICES} = $printChoices;      $paramHash->{CHOICES} = $printChoices;
     Apache::lonhelper::choices->new();      Apache::lonhelper::choices->new();
   
     my $startedTable = 0; # have we started an HTML table yet? (need      my $startedTable = 0; # have we started an HTML table yet? (need
                           # to close it later)                            # to close it later)
   
     if (($ENV{'request.role.adv'} and &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) or       if (($env{'request.role.adv'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or 
  ($helper->{VARS}->{'construction'} eq '1')) {   ($helper->{VARS}->{'construction'} eq '1')) {
  addMessage("<hr width='33%' /><table><tr><td align='right'>Print: </td><td>");   addMessage("<hr width='33%' /><table><tr><td align='right'>Print: </td><td>");
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
Line 1931  CHOOSE_FROM_ANY_SEQUENCE Line 2363  CHOOSE_FROM_ANY_SEQUENCE
         $paramHash->{CHOICES} = [          $paramHash->{CHOICES} = [
                                    ['Without Answers', 'yes'],                                     ['Without Answers', 'yes'],
                                    ['With Answers', 'no'],                                     ['With Answers', 'no'],
                                    ['Only Answers', 'only'],                                     ['Only Answers', 'only']
                                    ['As Exam Problem', 'exam']  
                                 ];                                  ];
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
  addMessage("</td></tr>");   addMessage("</td></tr>");
  $startedTable = 1;   $startedTable = 1;
     }      }
   
     if ($ENV{'request.role.adv'}) {      if ($env{'request.role.adv'}) {
  if (!$startedTable) {   if (!$startedTable) {
     addMessage("<hr width='33%' /><table><tr><td align='right'>LaTeX mode: </td><td>");      addMessage("<hr width='33%' /><table><tr><td align='right'>LaTeX mode: </td><td>");
     $startedTable = 1;      $startedTable = 1;
Line 1989  CHOOSE_FROM_ANY_SEQUENCE Line 2420  CHOOSE_FROM_ANY_SEQUENCE
      ['Yes', 'yes'] ];       ['Yes', 'yes'] ];
     Apache::lonhelper::dropdown->new();      Apache::lonhelper::dropdown->new();
     addMessage("</td></tr>");      addMessage("</td></tr>");
   
               #  If advanced roles, then allow to show all foils.
   
               if ($env{'request.role.adv'}) {
    addMessage("<tr><td align = 'right'>  </td><td>");
    $paramHash = Apache::lonhelper::getParamHash();
    $paramHash->{'multichoice'} = "true";
    $paramHash->{'allowempty'}  = "true";
    $paramHash->{'variable'}   = "showallfoils";
    $paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ];
    Apache::lonhelper::choices->new();
    addMessage("</td></tr>");
               }
   
  }   }
   
  if ($helper->{'VARS'}->{'construction'}) {    if ($helper->{'VARS'}->{'construction'}) { 
     my $stylevalue=$ENV{'construct.style'};      my $stylevalue=$env{'construct.style'};
     my $xmlfrag .= <<"RNDSEED";      my $xmlfrag .= <<"RNDSEED";
     <message><tr><td align='right'>Use random seed:  </td><td></message>      <message><tr><td align='right'>Use random seed:  </td><td></message>
     <string variable="curseed" size="15" maxlength="15">      <string variable="curseed" size="15" maxlength="15">
Line 2001  CHOOSE_FROM_ANY_SEQUENCE Line 2446  CHOOSE_FROM_ANY_SEQUENCE
         </defaultvalue>          </defaultvalue>
     </string>      </string>
      <message></td></tr><tr><td align="right">Use style file:</td><td></message>       <message></td></tr><tr><td align="right">Use style file:</td><td></message>
              <message><input type="text" size="40" name="style_file_value" value="$stylevalue"  />&nbsp; <a href="javascript:openbrowser('helpform','style_file','sty')">Select style file</a> </td><td></message>               <message><input type="text" size="40" name="style_file_value" value="$stylevalue"  />&nbsp; <a href="javascript:openbrowser('helpform','style_file','sty')">Select style file</a> </td><tr><td></message>
              <message></td></tr></message>       <choices allowempty="1" multichoice="true" variable="showallfoils">
                   <choice computer="1">Show all foils?</choice>
                </choices>
        <message></td></tr></message>
 RNDSEED  RNDSEED
             &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);              &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
     $helper->{'VARS'}->{'style_file'}=$ENV{'form.style_file_value'};      $helper->{'VARS'}->{'style_file'}=$env{'form.style_file_value'};
  }      
    } 
   
     }      }
   
   
Line 2073  no strict; Line 2523  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::lonnet;
   
 my $maxColumns = 2;  my $maxColumns = 2;
   # it'd be nice if these all worked
   #my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", 
   #                 "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]",
   #                 "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]", 
   #                 "a5 [148x210 mm]", "a6 [105x148 mm]" );
 my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]",   my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", 
                  "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]",   "a4 [210x297 mm]");
                  "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]",   
                  "a5 [148x210 mm]", "a6 [105x148 mm]" );  
   
 # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |  # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |
 #                   Paper type  #                   Paper type
Line 2114  sub render { Line 2568  sub render {
   </tr>    </tr>
   <tr>    <tr>
     <td>      <td>
       <input type="radio" name="${var}.layout" value="L" /> Landscape<br />        <label><input type="radio" name="${var}.layout" value="L" /> Landscape </label><br />
       <input type="radio" name="${var}.layout" value="P" checked='1'  /> Portrait        <label><input type="radio" name="${var}.layout" value="P" checked='1'  /> Portrait </label>
     </td>      </td>
     <td align="center">      <td align="center">
       <select name="${var}.cols">        <select name="${var}.cols">
Line 2133  STATEHTML Line 2587  STATEHTML
     $result .= "</select></td><td>\n";      $result .= "</select></td><td>\n";
     $result .= "<select name='${var}.paper'>\n";      $result .= "<select name='${var}.paper'>\n";
   
     my %parmhash=&Apache::lonnet::coursedescription($ENV{'request.course.id'});      my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
     my $DefaultPaperSize=$parmhash{'default_paper_size'};      my $DefaultPaperSize=$parmhash{'default_paper_size'};
     if ($DefaultPaperSize eq '') {$DefaultPaperSize='letter';}      if ($DefaultPaperSize eq '') {$DefaultPaperSize='letter';}
     $i = 0;      $i = 0;
Line 2157  sub postprocess { Line 2611  sub postprocess {
     my $var = $self->{'variable'};      my $var = $self->{'variable'};
     my $helper = Apache::lonhelper->getHelper();      my $helper = Apache::lonhelper->getHelper();
     $helper->{VARS}->{$var} =       $helper->{VARS}->{$var} = 
         $ENV{"form.$var.layout"} . '|' . $ENV{"form.$var.cols"} . '|' .          $env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' .
         $ENV{"form.$var.paper"};          $env{"form.$var.paper"};
     return 1;      return 1;
 }  }
   
Line 2188  is no tag interface. You actually pass p Line 2642  is no tag interface. You actually pass p
 =cut  =cut
   
 use Apache::lonhelper;  use Apache::lonhelper;
   use Apache::lonnet;
 no strict;  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
Line 2286  sub postprocess { Line 2740  sub postprocess {
   
     my $var = $self->{'variable'};      my $var = $self->{'variable'};
     my $helper = Apache::lonhelper->getHelper();      my $helper = Apache::lonhelper->getHelper();
     my $width = $helper->{VARS}->{$var .'.width'} = $ENV{"form.${var}.width"};       my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"}; 
     my $height = $helper->{VARS}->{$var .'.height'} = $ENV{"form.${var}.height"};       my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"}; 
     my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $ENV{"form.${var}.lmargin"};       my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"}; 
     $helper->{VARS}->{$var .'.widthunit'} = $ENV{"form.${var}.widthunit"};       $helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"}; 
     $helper->{VARS}->{$var .'.heightunit'} = $ENV{"form.${var}.heightunit"};       $helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"}; 
     $helper->{VARS}->{$var .'.lmarginunit'} = $ENV{"form.${var}.lmarginunit"};       $helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"}; 
   
     my $error = '';      my $error = '';
   

Removed from v.1.342  
changed lines
  Added in v.1.393


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