--- loncom/xml/lonplot.pm	2002/01/06 02:19:25	1.33
+++ loncom/xml/lonplot.pm	2002/01/09 16:58:18	1.36
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Dynamic plot
 #
-# $Id: lonplot.pm,v 1.33 2002/01/06 02:19:25 harris41 Exp $
+# $Id: lonplot.pm,v 1.36 2002/01/09 16:58:18 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -28,7 +28,14 @@
 # 12/15/01 Matthew
 # 12/17 12/18 12/19 12/20 12/21 12/27 12/28 12/30 12/31 Matthew
 # 01/01/02 Matthew
-# 01/02 01/03 Matthew
+# 01/02 01/03 01/04 01/07 01/08 01/09 Matthew
+
+# Current issues
+#   1. Gnuplot is unable to vary the color or linestyle of <data> plots.
+#      The key does not know this so it is misleading for the user.
+#      Multiple <function>s can be plotted with varying line styles and
+#      colors.
+#
 package Apache::lonplot;
 
 use strict;
@@ -84,16 +91,16 @@ my %linestyles =
      steps	    => 2,     # now there are more important things 
      fsteps	    => 2,     # for me to deal with.
      histeps        => 2,
-     errorbars	    => 2,
-     xerrorbars	    => 2,
-     yerrorbars	    => 2,
-     xyerrorbars    => 2,
-     boxes          => 2,
-     boxerrorbars   => 2,
-     boxxyerrorbars => 2,
-     financebars    => 2,
-     candlesticks   => 2,
-     vector	    => 2
+     errorbars	    => 3,
+     xerrorbars	    => [3,4],
+     yerrorbars	    => [3,4],
+     xyerrorbars    => [4,6],
+     boxes          => 3,
+#     boxerrorbars   => [3,4,5],
+#     boxxyerrorbars => [4,6,7],
+#     financebars    => 5,
+#     candlesticks   => 5,
+     vector	    => 4
     );		    
 
 my $int_test       = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/};
@@ -111,6 +118,8 @@ my $words_test     = sub {$_[0]=~s/\s+/
 ##                      Attribute metadata                       ##
 ##                                                               ##
 ###################################################################
+my @plot_edit_order = 
+    qw/bgcolor fgcolor height width font transparent grid border/;
 my %plot_defaults = 
     (
      height       => {
@@ -140,19 +149,19 @@ my %plot_defaults =
      transparent  => {
 	 default     => 'off',
 	 test        => $onoff_test, 
-	 description => '',
+	 description => 'Transparent image',
 	 edit_type   => 'on_off'
 	 },
      grid         => {
 	 default     => 'off',
 	 test        => $onoff_test, 
-	 description => '',
+	 description => 'Display grid',
 	 edit_type   => 'on_off'
 	 },
      border       => {
 	 default     => 'on',
 	 test        => $onoff_test, 
-	 description => '',
+	 description => 'Draw border around plot',
 	 edit_type   => 'on_off'
 	 },
      font         => {
@@ -269,7 +278,7 @@ my %curve_defaults =
      linestyle => {
 	 default => 'lines',
 	 test => $linestyle_test,
-	 description => 'Style of the axis lines',
+	 description => 'Line style',
 	 edit_type   => 'choice',
 	 choices     => ['lines','linespoints','dots','points','steps',
 			 'fsteps','histeps','errorbars','xerrorbars',
@@ -304,7 +313,8 @@ sub start_plot {
 			$tagstack->[-1]);
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Plot');
-	$result .= &edit_attributes($target,$token,\%plot_defaults);
+	$result .= &edit_attributes($target,$token,\%plot_defaults,
+				    \@plot_edit_order);
     } elsif ($target eq 'modified') {
 	my $constructtag=&Apache::edit::get_new_args
 	    ($token,$parstack,$safeeval,keys(%plot_defaults));
@@ -528,7 +538,7 @@ sub start_curve {
 	$result .= &edit_attributes($target,$token,\%curve_defaults);
     } elsif ($target eq 'modified') {
 	my $constructtag=&Apache::edit::get_new_args
-	    ($token,$parstack,$safeeval,keys(%label_defaults));
+	    ($token,$parstack,$safeeval,keys(%curve_defaults));
 	if ($constructtag) {
 	    $result = &Apache::edit::rebuild_tag($token);
 	    $result.= &Apache::edit::handle_insert();
@@ -600,7 +610,7 @@ sub start_data {
 	# make sure it's all numbers and make sure each array 
 	# is of the same length.
 	my @data;
-	if ($datatext =~ /,/) {
+	if ($datatext =~ /,/) { # comma deliminated
 	    @data = split /,/,$datatext;
 	} else { # Assume it's space seperated.
 	    @data = split / /,$datatext;
@@ -621,6 +631,13 @@ sub start_data {
 		$data[$i] = 1.15572734979092;
 	    }
 	}
+	# complain if the number of data points is not the same as
+	# in previous sets of data.
+	if (($curves[-1]->{'data'}) && ($#data != $#{@{$curves[-1]->{'data'}->[0]}})){
+	    &Apache::lonxml::warning
+		('Number of data points is not consistent with previous '.
+		 'number of data points');
+	}
 	push  @{$curves[-1]->{'data'}},\@data;
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Curve Data');
@@ -798,7 +815,7 @@ sub check_inputs {
     ## Make sure we have all the input we need:
     if (! %plot) { &set_defaults(\%plot,\%plot_defaults); }
     if (! %key ) {} # No key for this plot, thats okay
-    if (! %axis) { &set_defaults(\%axis,\%axis_defaults); }
+#    if (! %axis) { &set_defaults(\%axis,\%axis_defaults); }
     if (! defined($title )) {} # No title for this plot, thats okay
     if (! defined($xlabel)) {} # No xlabel for this plot, thats okay
     if (! defined($ylabel)) {} # No ylabel for this plot, thats okay
@@ -818,20 +835,26 @@ sub check_inputs {
 
 #------------------------------------------------ make_edit
 sub edit_attributes {
-    my ($target,$token,$defaults) = @_;
-    my $result;
-    foreach my $attr (sort keys(%$defaults)) {
+    my ($target,$token,$defaults,$keys) = @_;
+    my ($result,@keys);
+    if ($keys && ref($keys) eq 'ARRAY') {
+        @keys = @$keys;
+    } else {
+	@keys = sort(keys(%$defaults));
+    }
+    foreach my $attr (@keys) {
+	# append a ' ' to the description if it doesn't have one already.
+	my $description = $defaults->{$attr}->{'description'};
+	$description .= ' ' if ($description !~ / $/);
 	if ($defaults->{$attr}->{'edit_type'} eq 'entry') {
-	    $result .= &Apache::edit::text_arg(
-                 $defaults->{$attr}->{'description'},
-		 $attr,
-		 $token);
+	    $result .= &Apache::edit::text_arg
+		($description,$attr,$token);
 	} elsif ($defaults->{$attr}->{'edit_type'} eq 'choice') {
-	    $result .= &Apache::edit::select_arg(
-		 $defaults->{$attr}->{'description'},
-		 $attr,
-		 $defaults->{$attr}->{'choices'},
-		 $token);
+	    $result .= &Apache::edit::select_arg
+		($description,$attr,$defaults->{$attr}->{'choices'},$token);
+	} elsif ($defaults->{$attr}->{'edit_type'} eq 'on_off') {
+	    $result .= &Apache::edit::select_arg
+		($description,$attr,['on','off'],$token);
 	}
 	$result .= '<br />';
     }