--- loncom/xml/lonplot.pm	2005/07/05 15:05:13	1.111
+++ loncom/xml/lonplot.pm	2007/06/19 01:15:24	1.119
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Dynamic plot
 #
-# $Id: lonplot.pm,v 1.111 2005/07/05 15:05:13 albertel Exp $
+# $Id: lonplot.pm,v 1.119 2007/06/19 01:15:24 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -36,6 +36,9 @@ use Apache::response;
 use Apache::lonxml;
 use Apache::edit;
 use Apache::lonnet;
+use lib '/home/httpd/lib/perl/';
+use LONCAPA;
+ 
 
 use vars qw/$weboutputformat $versionstring/;
 
@@ -114,7 +117,7 @@ my $pos_real_test  =
 my $color_test     = sub {$_[0]=~s/\s+//g;$_[0]=~/^x[\da-fA-F]{6}$/};
 my $onoff_test     = sub {$_[0]=~/^(on|off)$/};
 my $key_pos_test   = sub {$_[0]=~/^(top|bottom|right|left|outside|below| )+$/};
-my $sml_test       = sub {$_[0]=~/^(small|medium|large)$/};
+my $sml_test       = sub {$_[0]=~/^(\d+|small|medium|large)$/};
 my $linestyle_test = sub {exists($linestyles{$_[0]})};
 my $words_test     = sub {$_[0]=~s/\s+/ /g;$_[0]=~/^([\w~!\@\#\$\%^&\*\(\)-=_\+\[\]\{\}:\;\'<>,\.\/\?\\]+ ?)+$/};
 
@@ -125,8 +128,8 @@ my $words_test     = sub {$_[0]=~s/\s+/
 ###################################################################
 my @gnuplot_edit_order = 
     qw/alttag bgcolor fgcolor height width font transparent grid samples 
-    border align texwidth texfont plotcolor plottype lmargin rmargin tmargin
-    bmargin major_ticscale minor_ticscale boxwidth gridlayer fillstyle
+    border align texwidth texfont plotcolor plottype gridtype lmargin rmargin
+    tmargin bmargin major_ticscale minor_ticscale boxwidth gridlayer fillstyle
     pattern solid/;
 
 my $margin_choices = ['default',0..20];
@@ -200,11 +203,11 @@ my %gnuplot_defaults =
 	 edit_type   => 'onoff'
 	 },
      font         => {
-	 default     => 'medium',
+	 default     => '9',
 	 test        => $sml_test,
 	 description => 'Size of font to use',
 	 edit_type   => 'choice',
-	 choices     => ['small','medium','large']
+	 choices     => [['5','5 (small)'],'7',['9','9 (medium)'],'10','12',['15','15 (large)']]
 	 },
      samples      => {
 	 default     => '100',
@@ -214,11 +217,11 @@ my %gnuplot_defaults =
 	 choices     => ['100','200','500','1000','2000','5000']
 	 },
      align        => {
-	 default     => 'center',
-	 test        => sub {$_[0]=~/^(left|right|center)$/},
+	 default     => 'middle',
+	 test        => sub {$_[0]=~/^(left|right|middle|center)$/},
 	 description => 'alignment for image in html',
 	 edit_type   => 'choice',
-	 choices     => ['left','right','center']
+	 choices     => ['left','right','middle']
 	 },
      texwidth     => {
          default     => '93',
@@ -269,6 +272,13 @@ my %gnuplot_defaults =
 	 edit_type   => 'choice',
          choices     => ['Cartesian','Polar']
          },
+     gridtype     => {
+	 default     => 'Cartesian',
+	 test        => sub {$_[0]=~/^(Polar|Cartesian|Linear-Log|Log-Linear|Log-Log)$/},
+	 description => 'Grid type:',
+	 edit_type   => 'choice',
+         choices     => ['Cartesian','Polar','Linear-Log','Log-Linear','Log-Log']
+         },
      lmargin      => {
 	 default     => 'default',
 	 test        => sub {$_[0]=~/^(default|\d+)$/},
@@ -457,7 +467,7 @@ my %axis_defaults =
 	 }
      );
 
-my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize','limit');
+my @curve_edit_order = ('color','name','linestyle','linewidth','pointtype','pointsize','limit');
 
 my %curve_defaults = 
     (
@@ -482,14 +492,13 @@ my %curve_defaults =
 	 edit_type   => 'choice',
 	 choices     => [keys(%linestyles)]
 	 },
-# gnuplots term=gif driver does not handle linewidth :(
-#     linewidth => {
-#         default     => 1,
-#         test        => $int_test,
-#         description => 'Line width (may not apply to all line styles)',
-#         edit_type   => 'choice',
-#         choices     => [1,2,3,4,5,6,7,8,9,10]
-#         },
+     linewidth => {
+         default     => 4,
+         test        => $int_test,
+         description => 'Line width (may not apply to all line styles)',
+         edit_type   => 'choice',
+         choices     => [1,2,3,4,5,6,7,8,9,10]
+         },
      pointsize => {
          default     => 1,
          test        => $pos_real_test,
@@ -540,7 +549,9 @@ sub start_gnuplot {
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'GnuPlot');
 	$result .= &edit_attributes($target,$token,\%gnuplot_defaults,
-				    \@gnuplot_edit_order);
+				    \@gnuplot_edit_order)
+	    .&Apache::edit::end_row()
+	    .&Apache::edit::start_spanning_row();
     } elsif ($target eq 'modified') {
 	my $constructtag=&Apache::edit::get_new_args
 	    ($token,$parstack,$safeeval,keys(%gnuplot_defaults));
@@ -574,11 +585,11 @@ sub end_gnuplot {
 	    '_'.time.'_'.$$.$randnumber.'_plot';
 	## Write the plot description to the file
 	&write_gnuplot_file($tmpdir,$filename,$target);
-	$filename = &Apache::lonnet::escape($filename);
+	$filename = &escape($filename);
 	## return image tag for the plot
 	if ($target eq 'web') {
 	    $result .= <<"ENDIMAGE";
-<img src    = "/cgi-bin/plot.gif?file=$filename.data&output=$weboutputformat" 
+<img src    = "/cgi-bin/plot.$weboutputformat?file=$filename.data" 
      width  = "$Apache::lonplot::plot{'width'}"
      height = "$Apache::lonplot::plot{'height'}"
      align  = "$Apache::lonplot::plot{'align'}"
@@ -591,7 +602,7 @@ ENDIMAGE
 	    &Apache::lonxml::register_ssi("/cgi-bin/plot.gif?file=$filename.data&output=eps");
 	    $result  = "%DYNAMICIMAGE:$Apache::lonplot::plot{'width'}:$Apache::lonplot::plot{'height'}:$Apache::lonplot::plot{'texwidth'}\n";
 	    $result .= '\graphicspath{{/home/httpd/perl/tmp/}}'."\n";
-	    $result .= '\includegraphics[width='.$Apache::lonplot::plot{'texwidth'}.' mm]{'.&Apache::lonnet::unescape($filename).'.eps}';
+	    $result .= '\includegraphics[width='.$Apache::lonplot::plot{'texwidth'}.' mm]{'.&unescape($filename).'.eps}';
 	}
     } elsif ($target eq 'edit') {
 	$result.=&Apache::edit::tag_end($target,$token);
@@ -662,6 +673,24 @@ sub end_ytics {
     return $result;
 }
 
+##-----------------------------------------------------------------font
+sub get_font {
+    my ($size);
+    if ( $Apache::lonplot::plot{'font'} =~ /^(small|medium|large)/) {
+	if ( $Apache::lonplot::plot{'font'} eq 'small') {
+	    $size = '5';
+	} elsif ( $Apache::lonplot::plot{'font'} eq 'medium') {
+	    $size = '9';
+	} elsif ( $Apache::lonplot::plot{'font'} eq 'large') {
+	    $size = '15';
+	} else {
+	    $size = '9';
+	}
+    } else {
+	$size = $Apache::lonplot::plot{'font'};
+    }
+    return ($size);
+}
 
 ##----------------------------------------------------------------- key
 sub start_key {
@@ -698,7 +727,7 @@ sub start_title {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';
     if ($target eq 'web' || $target eq 'tex') {
-	$title = &Apache::lonxml::get_all_text("/title",$parser);
+	$title = &Apache::lonxml::get_all_text("/title",$parser,$style);
 	$title=&Apache::run::evaluate($title,$safeeval,$$parstack[-1]);
 	$title =~ s/\n/ /g;
 	if (length($title) > $max_str_len) {
@@ -706,10 +735,8 @@ sub start_title {
 	}
     } elsif ($target eq 'edit') {
 	$result.=&Apache::edit::tag_start($target,$token,'Plot Title');
-	my $text=&Apache::lonxml::get_all_text("/title",$parser);
-	$result.=&Apache::edit::end_row().
-	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::editline('',$text,'',60);
+	my $text=&Apache::lonxml::get_all_text("/title",$parser,$style);
+	$result.=&Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	$result.=&Apache::edit::rebuild_tag($token);
 	$result.=&Apache::edit::modifiedfield("/title",$parser);
@@ -731,7 +758,7 @@ sub start_xlabel {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';
     if ($target eq 'web' || $target eq 'tex') {
-	$xlabel = &Apache::lonxml::get_all_text("/xlabel",$parser);
+	$xlabel = &Apache::lonxml::get_all_text("/xlabel",$parser,$style);
 	$xlabel=&Apache::run::evaluate($xlabel,$safeeval,$$parstack[-1]);
 	$xlabel =~ s/\n/ /g;
 	if (length($xlabel) > $max_str_len) {
@@ -739,10 +766,8 @@ sub start_xlabel {
 	}
     } elsif ($target eq 'edit') {
 	$result.=&Apache::edit::tag_start($target,$token,'Plot Xlabel');
-	my $text=&Apache::lonxml::get_all_text("/xlabel",$parser);
-	$result.=&Apache::edit::end_row().
-	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::editline('',$text,'',60);
+	my $text=&Apache::lonxml::get_all_text("/xlabel",$parser,$style);
+	$result.=&Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	$result.=&Apache::edit::rebuild_tag($token);	
 	$result.=&Apache::edit::modifiedfield("/xlabel",$parser);
@@ -765,7 +790,7 @@ sub start_ylabel {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';
     if ($target eq 'web' || $target eq 'tex') {
-	$ylabel = &Apache::lonxml::get_all_text("/ylabel",$parser);
+	$ylabel = &Apache::lonxml::get_all_text("/ylabel",$parser,$style);
 	$ylabel = &Apache::run::evaluate($ylabel,$safeeval,$$parstack[-1]);
 	$ylabel =~ s/\n/ /g;
 	if (length($ylabel) > $max_str_len) {
@@ -773,10 +798,8 @@ sub start_ylabel {
 	}
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Plot Ylabel');
-	my $text = &Apache::lonxml::get_all_text("/ylabel",$parser);
-	$result .= &Apache::edit::end_row().
-	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::editline('',$text,'',60);
+	my $text = &Apache::lonxml::get_all_text("/ylabel",$parser,$style);
+	$result .= &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	$result.=&Apache::edit::rebuild_tag($token);
 	$result.=&Apache::edit::modifiedfield("/ylabel",$parser);
@@ -802,7 +825,7 @@ sub start_label {
 	my %label;
 	&get_attributes(\%label,\%label_defaults,$parstack,$safeeval,
 		    $tagstack->[-1]);
-	my $text = &Apache::lonxml::get_all_text("/label",$parser);
+	my $text = &Apache::lonxml::get_all_text("/label",$parser,$style);
 	$text = &Apache::run::evaluate($text,$safeeval,$$parstack[-1]);
 	$text =~ s/\n/ /g;
 	$text = substr($text,0,$max_str_len) if (length($text) > $max_str_len);
@@ -811,7 +834,7 @@ sub start_label {
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Plot Label');
 	$result .= &edit_attributes($target,$token,\%label_defaults);
-	my $text = &Apache::lonxml::get_all_text("/label",$parser);
+	my $text = &Apache::lonxml::get_all_text("/label",$parser,$style);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
 	    &Apache::edit::editline('',$text,'',60);
@@ -848,13 +871,15 @@ sub start_curve {
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Curve');
 	$result .= &edit_attributes($target,$token,\%curve_defaults,
-                                    \@curve_edit_order);
+                                    \@curve_edit_order)
+	    .&Apache::edit::end_row()
+	    .&Apache::edit::start_spanning_row();
+
     } elsif ($target eq 'modified') {
 	my $constructtag=&Apache::edit::get_new_args
 	    ($token,$parstack,$safeeval,keys(%curve_defaults));
 	if ($constructtag) {
 	    $result = &Apache::edit::rebuild_tag($token);
-	    $result.= &Apache::edit::handle_insert();
 	}
     }
     return $result;
@@ -885,15 +910,14 @@ sub start_function {
                  'curve function declaration.');
 	    delete $curves[-1]->{'data'} ;
 	}
-        my $function = &Apache::lonxml::get_all_text("/function",$parser);
+        my $function = &Apache::lonxml::get_all_text("/function",$parser,
+						     $style);
 	$function = &Apache::run::evaluate($function,$safeeval,$$parstack[-1]);
 	$curves[-1]->{'function'} = $function; 
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Gnuplot compatible curve function');
-	my $text = &Apache::lonxml::get_all_text("/function",$parser);
-	$result .= &Apache::edit::end_row().
-	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::editline('',$text,'',60);
+	my $text = &Apache::lonxml::get_all_text("/function",$parser,$style);
+	$result .= &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	$result.=&Apache::edit::rebuild_tag($token);
 	$result.=&Apache::edit::modifiedfield("/function",$parser);
@@ -924,7 +948,7 @@ sub start_data {
                  'curve data declaration.');
 	    delete($curves[-1]->{'function'});
 	}
-	my $datatext = &Apache::lonxml::get_all_text("/data",$parser);
+	my $datatext = &Apache::lonxml::get_all_text("/data",$parser,$style);
 	$datatext=&Apache::run::evaluate($datatext,$safeeval,$$parstack[-1]);
 	# Deal with cases where we're given an array...
 	if ($datatext =~ /^\@/) {
@@ -967,10 +991,8 @@ sub start_data {
 	push  @{$curves[-1]->{'data'}},\@data;
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Comma or space deliminated curve data');
-	my $text = &Apache::lonxml::get_all_text("/data",$parser);
-	$result .= &Apache::edit::end_row().
-	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::editline('',$text,'',60);
+	my $text = &Apache::lonxml::get_all_text("/data",$parser,$style);
+	$result .= &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	$result.=&Apache::edit::rebuild_tag($token);
 	$result.=&Apache::edit::modifiedfield("/data",$parser);
@@ -1097,7 +1119,7 @@ sub write_gnuplot_file {
     }
     # set term
     if ($target eq 'web') {
-	$gnuplot_input .= 'set term '.$weboutputformat .' ';
+	$gnuplot_input .= 'set term '.$weboutputformat .' enhanced ';
 	$gnuplot_input .= 'transparent ' if ($Apache::lonplot::plot{'transparent'} eq 'on');
 	$gnuplot_input .= $Apache::lonplot::plot{'font'} . ' ';
 	$gnuplot_input .= 'size '.$Apache::lonplot::plot{'width'}.','.$Apache::lonplot::plot{'height'}.' ';
@@ -1105,16 +1127,29 @@ sub write_gnuplot_file {
 	# set output
 	$gnuplot_input .= "set output\n";
     } elsif ($target eq 'tex') {
-	$gnuplot_input .= "set term postscript eps $Apache::lonplot::plot{'plotcolor'} solid \"Helvetica\" $pt \n";
+	$gnuplot_input .= "set term postscript eps enhanced $Apache::lonplot::plot{'plotcolor'} solid \"Helvetica\" $pt \n";
 	$gnuplot_input .= "set output \"/home/httpd/perl/tmp/".
-	    &Apache::lonnet::unescape($filename).".eps\"\n";
+	    &unescape($filename).".eps\"\n";
     }
-    # cartesian or polar?
+    # cartesian or polar plot?
     if (lc($Apache::lonplot::plot{'plottype'}) eq 'polar') {
         $gnuplot_input .= 'set polar'.$/;
     } else {
         # Assume Cartesian
     }
+    # cartesian or polar grid?
+    if (lc($Apache::lonplot::plot{'gridtype'}) eq 'polar') {
+        $gnuplot_input .= 'set grid polar'.$/;
+    } elsif (lc($Apache::lonplot::plot{'gridtype'}) eq 'linear-log') {
+        $gnuplot_input .= 'set logscale x'.$/;
+    } elsif (lc($Apache::lonplot::plot{'gridtype'}) eq 'log-linear') {
+        $gnuplot_input .= 'set logscale y'.$/;
+    } elsif (lc($Apache::lonplot::plot{'gridtype'}) eq 'log-log') {
+        $gnuplot_input .= 'set logscale x'.$/;
+        $gnuplot_input .= 'set logscale y'.$/;
+    } else {
+        # Assume Cartesian
+    }
     # solid or pattern for boxes?
     if (lc($Apache::lonplot::plot{'fillstyle'}) eq 'solid') {
         $gnuplot_input .= 'set style fill solid '.
@@ -1221,12 +1256,16 @@ sub write_gnuplot_file {
     for (my $i = 0;$i<=$#curves;$i++) {
 	$curve = $curves[$i];
 	$gnuplot_input.= ', ' if ($i > 0);
+	if ($target eq 'tex') {
+	    $curve->{'linewidth'} *= 2;
+	}
 	if (exists($curve->{'function'})) {
 	    $gnuplot_input.= 
 		$curve->{'function'}.' title "'.
 		$curve->{'name'}.'" with '.
                 $curve->{'linestyle'};
-            $gnuplot_input.= ' linewidth 4 ' if ($target eq 'tex');
+            $gnuplot_input.= ' linewidth '.$curve->{'linewidth'};
+
             if (($curve->{'linestyle'} eq 'points')      ||
                 ($curve->{'linestyle'} eq 'linespoints') ||
                 ($curve->{'linestyle'} eq 'errorbars')   ||
@@ -1256,12 +1295,12 @@ sub write_gnuplot_file {
 	    }
 	    #   write file
 	    print $fh $datatext;
-	    close ($fh);
+	    close($fh);
 	    #   generate gnuplot text
 	    $gnuplot_input.= '"'.$datafilename.'" title "'.
 		$curve->{'name'}.'" with '.
 		$curve->{'linestyle'};
-            $gnuplot_input.= ' linewidth 4 ' if ($target eq 'tex');
+            $gnuplot_input.= ' linewidth '.$curve->{'linewidth'};
             if (($curve->{'linestyle'} eq 'points')      ||
                 ($curve->{'linestyle'} eq 'linespoints') ||
                 ($curve->{'linestyle'} eq 'errorbars')   ||