--- loncom/interface/spreadsheet/Spreadsheet.pm	2005/05/13 21:14:46	1.46
+++ loncom/interface/spreadsheet/Spreadsheet.pm	2005/10/13 10:27:28	1.58
@@ -1,5 +1,5 @@
 #
-# $Id: Spreadsheet.pm,v 1.46 2005/05/13 21:14:46 albertel Exp $
+# $Id: Spreadsheet.pm,v 1.58 2005/10/13 10:27:28 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -106,13 +106,13 @@ sub new {
         cid      => $env{'request.course.id'},
         cnum     => $env{'course.'.$env{'request.course.id'}.'.num'},
         cdom     => $env{'course.'.$env{'request.course.id'}.'.domain'},
-        chome    => $env{'course.'.$env{'request.course.id'}.'.home'},
         coursedesc => $env{'course.'.$env{'request.course.id'}.'.description'},
         coursefilename => $env{'request.course.fn'},
         #
         # Flags
         temporary => 0,  # true if this sheet has been modified but not saved
-        new_rows  => 0, # true if this sheet has new rows
+        new_rows  => 0,  # true if this sheet has new rows
+	loaded    => 0,  # true if the formulas have been loaded
         #
         # blackout is used to determine if any data needs to be hidden from the
         # student.
@@ -126,18 +126,9 @@ sub new {
         othersheets => [],
     };
     #
-    $self->{'uhome'} = &Apache::lonnet::homeserver($name,$domain);
-    #
     bless($self,$class);
-    #
-    # Load in the spreadsheet definition
     $self->filename($filename);
-    if (exists($env{'form.workcopy'}) && 
-        $self->{'type'} eq $env{'form.workcopy'}) {
-        $self->load_tmp();
-    } else {
-        $self->load();
-    }
+    #
     return $self;
 }
 
@@ -200,6 +191,8 @@ sub make_default {
             {'spreadsheet_default_'.$self->{'type'} => $self->filename()},
                                      $self->{'cdom'},$self->{'cnum'});
     return $result if ($result ne 'ok');
+    &Apache::lonnet::appenv('course.'.$self->{'cid'}.'.spreadsheet_default_'.
+			    $self->{'type'} => $self->filename());
     my $symb = $self->{'symb'};
     $symb = '' if (! defined($symb));
     &Apache::lonnet::expirespread('','',$self->{'type'},$symb);    
@@ -220,16 +213,8 @@ course environment.  Returns 0 otherwise
 sub is_default {
     my $self = shift;
     # Check to find out if we are the default spreadsheet (filenames match)
-    my $default_filename = '';
-    my %tmphash = &Apache::lonnet::get('environment',
-                                       ['spreadsheet_default_'.
-                                        $self->{'type'}],
-                                       $self->{'cdom'},
-                                       $self->{'cnum'});
-    my ($tmp) = keys(%tmphash);
-    if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
-        $default_filename = $tmphash{'spreadsheet_default_'.$self->{'type'}};
-    }
+    my $default_filename = $env{'course.'.$self->{'cid'}.
+				    '.spreadsheet_default_'.$self->{'type'}};
     if ($default_filename =~ /^\s*$/) {
         $default_filename = 'default_'.$self->{'type'};
     }
@@ -366,12 +351,10 @@ $filename = '';
 #
 # user data
 $name = '';
-$uhome = '';
 $domain  = '';
 #
 # course data
 $csec = '';
-$chome= '';
 $cnum = '';
 $cdom = '';
 $cid  = '';
@@ -770,7 +753,7 @@ ENDDEFS
     # itself
     my $initstring = '';
     foreach (qw/name domain type symb cid csec coursefilename
-             cnum cdom chome uhome/) {
+             cnum cdom/) {
         $initstring.= qq{\$$_="$self->{$_}";};
     }
     $initstring.=qq{\$usection="$usection";};
@@ -922,11 +905,11 @@ sub sett {
 sub sync_safe_space {
     my $self = shift;
     # Inside the safe space 'formulas' has a diabolical alter-ego named 'f'.
-    %{$self->{'safe'}->varglob('f')}=%{$self->{'formulas'}};
+    #%{$self->{'safe'}->varglob('f')}=%{$self->{'formulas'}};
     # 'constants' leads a peaceful hidden life of 'c'.
     %{$self->{'safe'}->varglob('c')}=%{$self->{'constants'}};
     # 'othersheets' hides as 'os', a disguise few can penetrate.
-    @{$self->{'safe'}->varglob('os')}=@{$self->{'othersheets'}};
+    #@{$self->{'safe'}->varglob('os')}=@{$self->{'othersheets'}};
 }
 
 ##
@@ -979,15 +962,32 @@ sub formulas {
         $self->{'formulas'} = $formulas;
         $self->{'rows'} = [];
         $self->{'template_cells'} = [];
+	$self->{'loaded'} = 1;
         return;
     } else {
+	$self->check_formulas_loaded();
         return %{$self->{'formulas'}};
     }
 }
 
+sub check_formulas_loaded {
+    my $self=shift;
+    if (!$self->{'loaded'}) {
+	$self->{'loaded'}=1;
+	# Load in the spreadsheet definition
+	if (exists($env{'form.workcopy'}) && 
+	    $self->{'type'} eq $env{'form.workcopy'}) {
+	    $self->load_tmp();
+	} else {
+	    $self->load();
+	}
+    }
+}
+
 sub set_formula {
     my $self = shift;
     my ($cell,$formula) = @_;
+    $self->check_formulas_loaded();
     $self->{'formulas'}->{$cell}=$formula;
     return;
 }
@@ -997,7 +997,7 @@ sub set_formula {
 ##
 sub formulas_keys {
     my $self = shift;
-    my @keys = keys(%{$self->{'formulas'}});
+    $self->check_formulas_loaded();
     return keys(%{$self->{'formulas'}});
 }
 
@@ -1008,6 +1008,7 @@ sub formulas_keys {
 sub formula {
     my $self = shift;
     my $cell = shift;
+    $self->check_formulas_loaded();
     if (defined($cell) && exists($self->{'formulas'}->{$cell})) {
         return $self->{'formulas'}->{$cell};
     }
@@ -1086,6 +1087,7 @@ sub rebuild_stats {
     my $self = shift;
     $self->{'rows'}=[];
     $self->{'template_cells'}=[];
+    $self->check_formulas_loaded();
     while (my ($cell,$formula) = each(%{$self->{'formulas'}})) {
         push(@{$self->{'rows'}},$1) if ($cell =~ /^A(\d+)/ && $1 != 0);
         push(@{$self->{'template_cells'}},$1) if ($cell =~ /^template_(\w+)/);
@@ -1526,6 +1528,7 @@ sub outsheet_xml   {
     ## Will be rendered for the user
     ## But not on this day
     my $Str = '<spreadsheet type="'.$self->{'type'}.'">'."\n";
+    $self->check_formulas_loaded();
     while (my ($cell,$formula) = each(%{$self->{'formulas'}})) {
         if ($cell =~ /^template_(\w+)/) {
             my $col = $1;
@@ -1608,7 +1611,6 @@ sub load {
     my $stype = $self->{'type'};
     my $cnum  = $self->{'cnum'};
     my $cdom  = $self->{'cdom'};
-    my $chome = $self->{'chome'};
     #
     my $filename = $self->filename();
     my $cachekey = join('_',($cnum,$cdom,$stype,$filename));
@@ -1617,6 +1619,10 @@ sub load {
     my ($formulas);
     if (exists($spreadsheets{$cachekey})) {
         $formulas = $spreadsheets{$cachekey}->{'formulas'};
+	$self->formulas($formulas);
+        $self->{'row_source'}=$spreadsheets{$cachekey}->{'row_source'};
+        $self->{'row_numbers'}=$spreadsheets{$cachekey}->{'row_numbers'};
+        $self->{'maxrow'}=$spreadsheets{$cachekey}->{'maxrow'};
     } else {
         # Not cached, need to read
         if (! defined($filename)) {
@@ -1650,17 +1656,38 @@ sub load {
                 $formulas = $self->load_system_default_sheet();
             }
         }
-        $filename=$self->filename(); # filename may have changed
-        $cachekey = join('_',($cnum,$cdom,$stype,$filename));
-        %{$spreadsheets{$cachekey}->{'formulas'}} = %{$formulas};
-    }
-    $self->formulas($formulas);
-    $self->set_row_sources();
-    $self->set_row_numbers();
+	$self->formulas($formulas);
+	$self->set_row_sources();
+	$self->set_row_numbers();
+	$self->cache_sheet($formulas);
+    }
+}
+
+sub cache_sheet {
+    my $self = shift;
+    my $formulas=(@_);
+    my $stype = $self->{'type'};
+    my $cnum  = $self->{'cnum'};
+    my $cdom  = $self->{'cdom'};
+    #
+    my $filename = $self->filename();
+    my $cachekey = join('_',($cnum,$cdom,$stype,$filename));
+
+    if (ref($formulas) eq 'HASH') {
+	%{$spreadsheets{$cachekey}->{'formulas'}} = %{$formulas};
+    }
+    if (ref($self->{'row_source'})) {
+	%{$spreadsheets{$cachekey}->{'row_source'}} =%{$self->{'row_source'}};
+    }
+    if (ref($self->{'row_numbers'})) {
+	%{$spreadsheets{$cachekey}->{'row_numbers'}}=%{$self->{'row_numbers'}};
+    }
+    $spreadsheets{$cachekey}->{'maxrow'} = $self->{'maxrow'};
 }
 
 sub set_row_sources {
     my $self = shift;
+    $self->check_formulas_loaded();
     while (my ($cell,$value) = each(%{$self->{'formulas'}})) {
         next if ($cell !~ /^A(\d+)/ || $1 < 1);
         my $row = $1;
@@ -1671,6 +1698,7 @@ sub set_row_sources {
 
 sub set_row_numbers {
     my $self = shift;
+    $self->check_formulas_loaded();
     while (my ($cell,$value) = each(%{$self->{'formulas'}})) {
 	next if ($cell !~ /^A(\d+)$/);
         next if (! defined($value));
@@ -1705,11 +1733,9 @@ sub save {
         my $stype = $self->{'type'};
         my $cnum  = $self->{'cnum'};
         my $cdom  = $self->{'cdom'};
-        my $chome = $self->{'chome'};
         my $filename    = $self->{'filename'};
-        my $cachekey = join('_',($cnum,$cdom,$stype,$filename));
         # Cache new sheet
-        %{$spreadsheets{$cachekey}->{'formulas'}}=%f;
+	$self->cache_sheet(\%f);
         # Write sheet
         foreach (keys(%f)) {
             delete($f{$_}) if ($f{$_} eq 'import');
@@ -1725,6 +1751,8 @@ sub save {
                                 {'spreadsheet_default_'.$stype => $filename },
                                           $cdom,$cnum);
             return $reply if ($reply ne 'ok');
+	    &Apache::lonnet::appenv('course.'.$self->{'cid'}.'.spreadsheet_default_'.
+				    $self->{'type'} => $self->filename());
         } 
         if ($self->is_default()) {
             if ($self->{'type'} eq 'studentcalc') {