--- loncom/interface/spreadsheet/Spreadsheet.pm	2006/03/05 21:35:10	1.64
+++ loncom/interface/spreadsheet/Spreadsheet.pm	2007/01/23 01:29:15	1.73
@@ -1,5 +1,5 @@
 #
-# $Id: Spreadsheet.pm,v 1.64 2006/03/05 21:35:10 bowersj2 Exp $
+# $Id: Spreadsheet.pm,v 1.73 2007/01/23 01:29:15 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -60,6 +60,9 @@ use HTML::TokeParser;
 use Spreadsheet::WriteExcel;
 use Time::HiRes;
 use Apache::lonlocal;
+use lib '/home/httpd/lib/perl/';
+use LONCAPA;
+ 
 
 ##
 ## Package Variables
@@ -85,7 +88,7 @@ sub new {
     my $class = ref($this) || $this;
     my ($stype) = ($class =~ /Apache::(.*)$/);
     #
-    my ($name,$domain,$filename,$usymb)=@_;
+    my ($name,$domain,$filename,$usymb,$section,$groups)=@_;
     if (defined($usymb) && ref($usymb)) {
         $usymb = $usymb->symb;
     }
@@ -95,10 +98,22 @@ sub new {
     if (! defined($domain) || $domain eq '') {
         $domain = $env{'user.domain'};
     }
+    if (! defined($section) || $section eq '') {
+        $section = &Apache::lonnet::getsection($domain,$name,
+					       $env{'request.course.id'});
+    }
+    if (! defined($groups)) {
+
+        my @usersgroups = &Apache::lonnet::get_users_groups($domain,$name,
+                                                    $env{'request.course.id'});
+        $groups = \@usersgroups;
+    }
     #
     my $self = {
         name     => $name,
         domain   => $domain,
+        section  => $section,
+        groups   => $groups, 
         type     => $stype,
         symb     => $usymb,
         errorlog => '',
@@ -157,16 +172,20 @@ sub filename {
                 $newfilename = 'default_'.$self->{'type'};
             }
         }
-        if ($newfilename !~ /\w/ || $newfilename =~ /^\W*$/) {
-            $newfilename = 'default_'.$self->{'type'};
-        }
-        if ($newfilename !~ /^default\.$self->{'type'}$/ &&
-            $newfilename !~ /^\/res\/(.*)spreadsheet$/) {
-            if ($newfilename !~ /_$self->{'type'}$/) {
-                $newfilename =~ s/[\s_]*$//;
-                $newfilename .= '_'.$self->{'type'};
-            }
-        }
+	if ($newfilename eq &mt('LON-CAPA Standard')) {
+	    undef($newfilename);
+	} else {
+	    if ($newfilename !~ /\w/ || $newfilename =~ /^\W*$/) {
+		$newfilename = 'default_'.$self->{'type'};
+	    }
+	    if ($newfilename !~ /^default\.$self->{'type'}$/ &&
+		$newfilename !~ /^\/res\/(.*)spreadsheet$/) {
+		if ($newfilename !~ /_$self->{'type'}$/) {
+		    $newfilename =~ s/[\s_]*$//;
+		    $newfilename .= '_'.$self->{'type'};
+		}
+	    }
+	}
         $self->{'filename'} = $newfilename;
         return;
     }
@@ -722,7 +741,7 @@ sub calc {
 	$notfinished=0;
         while (my ($cell,$value) = each(%t)) {
             my $old=$sheet_values{$cell};
-            #$sheet_values{$cell}=eval $value;
+            $sheet_values{$cell}=eval $value;
 #            $errorlog .= $cell.' = '.$old.'->'.$sheet_values{$cell}."\n";
 	    if ($@) {
 		undef %sheet_values;
@@ -788,6 +807,8 @@ sub expandnamed {
     if ($expression=~/^\&/) {
 	my ($func,$var,$formula)=($expression=~/^\&(\w+)\(([^\;]+)\;(.*)\)/);
 	my @vars=split(/\W+/,$formula);
+	# make the list uniq
+	@vars = keys(%{{ map { $_ => 1 } @vars }});
         my %values=();
 	foreach my $varname ( @vars ) {
             if ($varname=~/^(parameter|stores|timestamp)/) {
@@ -1271,8 +1292,8 @@ sub html_template_row {
 	    $row_html .= '<td bgcolor="'.$importcolor.'">'.
                 &html_uneditable_cell($cell,'#FFDDDD',$allowed).'</td>';
         } else {
-	    $row_html .= '<td bgcolor="#EOFFDD">'.
-                &html_editable_cell($cell,'#EOFFDD',$allowed,
+	    $row_html .= '<td bgcolor="#E0FFDD">'.
+                &html_editable_cell($cell,'#E0FFDD',$allowed,
                                     $self->{outputmode} eq 'source').'</td>';
         }
     }
@@ -1290,15 +1311,13 @@ sub html_editable_cell {
     }
     $name    = '' if (! defined($name));
     $formula = '' if (! defined($formula));
-    if ($showsource)
-    {
+    if ($showsource) {
         if (!defined($formula) || $formula =~ /^\s*$/) {
             $value = '<font color="'.$bgcolor.'">#</font>';
         } else {
             $value = &HTML::Entities::encode($formula, '<>&"');
         }
-    }
-    elsif (! defined($value)) {
+    } elsif (! defined($value)) {
         $value = '<font color="'.$bgcolor.'">#</font>';
         if ($formula ne '') {
             $value = '<i>undefined value</i>';
@@ -1350,7 +1369,7 @@ sub html_row {
 	    $row_html .= '<td bgcolor="'.$color.'">';
 	    $row_html .= &html_uneditable_cell($cell,'#FFDDDD');
 	} else {
-	    $row_html .= '<td bgcolor="#EOFFDD">';
+	    $row_html .= '<td bgcolor="#E0FFDD">';
 	    $row_html .= &html_editable_cell($cell,'#E0FFDD',$allowed,
                                              $self->{outputmode} eq 'source');
 	}
@@ -1671,7 +1690,8 @@ sub load {
             # Load the spreadsheet definition file from the save file
             my %tmphash = &Apache::lonnet::dump($filename,$cdom,$cnum);
             my ($tmp) = keys(%tmphash);
-            if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
+            if (%tmphash
+		&& $tmp !~ /^(con_lost|error|no_such_host)/i) {
                 while (my ($cell,$formula) = each(%tmphash)) {
                     $formulas->{$cell}=$formula;
                 }
@@ -1805,8 +1825,8 @@ sub save_tmp {
         my %f = $self->formulas();
         while( my ($cell,$formula) = each(%f)) {
             next if ($formula eq 'import');
-            print $fh &Apache::lonnet::escape($cell)."=".
-                &Apache::lonnet::escape($formula)."\n";
+            print $fh &escape($cell)."=".
+                &escape($formula)."\n";
         }
         $fh->close();
     }
@@ -1824,8 +1844,8 @@ sub load_tmp {
         while (<$spreadsheet_file>) {
 	    chomp;
             my ($cell,$formula) = split(/=/);
-            $cell    = &Apache::lonnet::unescape($cell);
-            $formula = &Apache::lonnet::unescape($formula);
+            $cell    = &unescape($cell);
+            $formula = &unescape($formula);
             $formulas{$cell} = $formula;
         }
         $spreadsheet_file->close();
@@ -1868,14 +1888,13 @@ sub othersheets {
     my ($stype) = @_;
     $stype = $self->{'type'} if (! defined($stype) || $stype !~ /calc$/);
     #
-    my @alternatives=();
+    my @alternatives=(&mt('Default'), &mt('LON-CAPA Standard'));
     my %results=&Apache::lonnet::dump($stype.'_spreadsheets',
                                       $self->{'cdom'}, $self->{'cnum'});
     my ($tmp) = keys(%results);
-    if ($tmp =~ /^(con_lost|error|no_such_host)/i ) {
-        @alternatives = (&mt('Default'));
-    } else {
-        @alternatives = (&mt('Default'), sort (keys(%results)));
+    if (%results
+	&& $tmp !~ /^(con_lost|error|no_such_host)/i ) {
+        push(@alternatives, sort(keys(%results)));
     }
     return @alternatives; 
 }