--- loncom/interface/Attic/lonspreadsheet.pm	2001/01/02 12:12:43	1.27
+++ loncom/interface/Attic/lonspreadsheet.pm	2001/01/02 16:03:14	1.28
@@ -30,6 +30,11 @@ my %courseopt;
 my %useropt;
 my %parmhash;
 
+# Stuff that only the screen handler can know
+
+my $includedir;
+my $tmpdir;
+
 # =============================================================================
 # ===================================== Implements an instance of a spreadsheet
 
@@ -75,6 +80,7 @@ $csec='';
 $chome='';
 $cnum='';
 $cdom='';
+$cid='';
 
 # symb
 
@@ -399,13 +405,12 @@ sub outrow {
 }
 
 sub exportrowa {
-    my $rowa='';
+    my @exportarray=();
     map {
-	$rowa.=$v{$_.'0'}."___;___";
+	$exportarray[$#exportarray+1]=$v{$_.'0'};
     } ('A','B','C','D','E','F','G','H','I','J','K','L','M',
        'N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
-    $rowa=~s/\_\_\_\;\_\_\_$//;
-    return $rowa;
+    return @exportarray;
 }
 
 # ------------------------------------------- End of "Inside of the safe space"
@@ -456,13 +461,6 @@ sub getformulas {
     return $safeeval->reval('%f');
 }
 
-# -------------------------------------------------------------------- Set type
-
-sub settype {
-    my ($safeeval,$type)=@_;
-    $safeeval->reval('$sheettype="'.$type.'";');
-}
-
 # -------------------------------------------------------------------- Get type
 
 sub gettype {
@@ -497,6 +495,12 @@ sub getfilename {
     my $safeeval=shift;
     return $safeeval->reval('$filename');
 }
+# --------------------------------------------------------------- Get course ID
+
+sub getcid {
+    my $safeeval=shift;
+    return $safeeval->reval('$cid');
+}
 
 # ----------------------------------------------------------- Get course number
 
@@ -556,7 +560,7 @@ sub getusymb {
 
 # ------------------------------------------------------------- Export of A-row
 
-sub exportrow {
+sub exportdata {
     my $safeeval=shift;
     return $safeeval->reval('&exportrowa()');
 }
@@ -684,20 +688,20 @@ sub readsheet {
   my ($safeeval,$fn)=@_;
   my $stype=&gettype($safeeval);
   my $cnum=&getcnum($safeeval);
+  my $cdom=&getcdom($safeeval);
+  my $chome=&getchome($safeeval);
 
 # --------- There is no filename. Look for defaults in course and global, cache
 
   unless($fn) {
-      unless ($fn=$defaultsheets{$cnum.'_'.$stype}) {
-         $fn=&Apache::lonnet::reply('get:'.
-                $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
-                $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.
-                ':environment:spreadsheet_default_'.&gettype($safeeval),
-                     $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
+      unless ($fn=$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}) {
+         $fn=&Apache::lonnet::reply('get:'.$cdom.':'.$cnum.
+                                    ':environment:spreadsheet_default_'.$stype,
+                                    $chome);
          unless (($fn) && ($fn!~/^error\:/)) {
 	     $fn='default_'.$stype;
          }
-         $defaultsheets{$cnum.'_'.$stype}=$fn; 
+         $defaultsheets{$cnum.'_'.$cdom.'_'.$stype}=$fn; 
       }
   }
 
@@ -707,8 +711,8 @@ sub readsheet {
 
 # ------------------------------------------------------ see if sheet is cached
   my $fstring='';
-  if ($fstring=$spreadsheets{$cnum.'_'.$stype.'_'.$fn}) {
-      &setformulas($sheetone,split(/\_\_\_\;\_\_\_/,$fstring));
+  if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) {
+      &setformulas($safeeval,split(/\_\_\_\;\_\_\_/,$fstring));
   } else {
 
 # ---------------------------------------------------- Not cached, need to read
@@ -719,7 +723,7 @@ sub readsheet {
 	my $sheetxml='';
        {
          my $fh;
-         if ($fh=Apache::File->new($r->dir_config('lonIncludes').
+         if ($fh=Apache::File->new($includedir.
                          '/default.'.&gettype($safeeval))) {
                $sheetxml=join('',<$fh>);
           }
@@ -739,11 +743,9 @@ sub readsheet {
           }
         }
       } else {
-        my $sheet='';
-        my $reply=&Apache::lonnet::reply('dump:'.
-              $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
-              $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.$fn,
-              $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
+          my $sheet='';
+          my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.':'.$fn,
+                                         $chome);
           unless ($reply=~/^error\:/) {
              $sheet=$reply;
 	  }
@@ -754,37 +756,69 @@ sub readsheet {
           } split(/\&/,$sheet);
        }
 # --------------------------------------------------------------- Cache and set
-       $spreadsheets{$cnum.'_'.$stype.'_'.$fn}=join('___;___',%f);       
+       $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);  
        &setformulas($safeeval,%f);
     }
 }
 
+# -------------------------------------------------------- Make new spreadsheet
+
+sub makenewsheet {
+    my ($uname,$udom,$stype,$usymb)=@_;
+    my $safeeval=initsheet();
+    $safeeval->reval(
+       '$uname='.$uname.
+      ';$udom='.$udom.
+      ';$sheettype='.$stype.
+      ';$usymb='.$usymb.
+      ';$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'}.';');
+    return $safeeval;
+}
+
 # ------------------------------------------------------------ Save spreadsheet
 
 sub writesheet {
-  my $safeeval=shift;
-  if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
+  my ($safeeval,$makedef)=@_;
+  my $cid=&getcid($safeeval);
+  if (&Apache::lonnet::allowed('opa',$cid)) {
     my %f=&getformulas($safeeval);
+    my $stype=&gettype($safeeval);
+    my $cnum=&getcnum($safeeval);
+    my $cdom=&getcdom($safeeval);
+    my $chome=&getchome($safeeval);
+    my $fn=&getfilename($safeeval);
+
+# ------------------------------------------------------------- Cache new sheet
+    $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);    
+# ----------------------------------------------------------------- Write sheet
     my $sheetdata='';
     map {
        $sheetdata.=&Apache::lonnet::escape($_).'='.
 	   &Apache::lonnet::escape($f{$_}).'&';
     } keys %f;
     $sheetdata=~s/\&$//;
-    my $reply=&Apache::lonnet::reply('put:'.
-              $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
-              $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.
-              &getfilename($safeeval).':'.
-              $sheetdata,
-              $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
+    my $reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'.$fn.':'.
+              $sheetdata,$chome);
     if ($reply eq 'ok') {
-          return &Apache::lonnet::reply('put:'.
-              $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
-              $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.
-              &gettype($safeeval).'_spreadsheets:'.
-              &Apache::lonnet::escape(&getfilename($safeeval)).'='.
-              $ENV{'user.name'},
-              $ENV{'course.'.$ENV{'request.course.id'}.'.home'});    
+          $reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'.
+              &stype.'_spreadsheets:'.
+              &Apache::lonnet::escape($fn).'='.$ENV{'user.name'},
+              $chome);
+          if ($reply eq 'ok') {
+              if ($makedef) { 
+                return &Apache::lonnet::reply('put:'.$cdom.':'.$cnum.
+                                ':environment:spreadsheet_default_'.$stype.'='.
+                                &Apache::lonnet::escape($fn),
+                                $chome);
+	      } else {
+		  return $reply;
+    	      }
+	   } else {
+	       return $reply;
+           }
       } else {
 	  return $reply;
       }
@@ -793,10 +827,14 @@ sub writesheet {
 }
 
 # ----------------------------------------------- Make a temp copy of the sheet
+# "Modified workcopy" - interactive only
+#
 
 sub tmpwrite {
-    my ($safeeval,$tmpdir,$symb)=@_;
-    my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval);
+    my $safeeval=shift;
+    my $fn=$ENV{'user.name'}.'_'.
+           $ENV{'user.domain'}.'_spreadsheet_'.&getusymb($safeeval).'_'.
+           &getfilename($safeeval);
     $fn=~s/\W/\_/g;
     $fn=$tmpdir.$fn.'.tmp';
     my $fh;
@@ -808,8 +846,10 @@ sub tmpwrite {
 # ---------------------------------------------------------- Read the temp copy
 
 sub tmpread {
-    my ($safeeval,$tmpdir,$symb,$nfield,$nform)=@_;
-    my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval);
+    my ($safeeval,$nfield,$nform)=@_;
+    my $fn=$ENV{'user.name'}.'_'.
+           $ENV{'user.domain'}.'_spreadsheet_'.&getusymb($safeeval).'_'.
+           &getfilename($safeeval);
     $fn=~s/\W/\_/g;
     $fn=$tmpdir.$fn.'.tmp';
     my $fh;
@@ -827,38 +867,17 @@ sub tmpread {
     &setformulas($safeeval,%fo);
 }
 
-# --------------------------------------------------------------- Read metadata
-
-sub readmeta {
-    my $fn=shift;
-    unless ($fn=~/\.meta$/) { $fn.='meta'; }
-    my $content;
-    my %returnhash=();
-    {
-      my $fh=Apache::File->new($fn);
-      $content=join('',<$fh>);
-    }
-   my $parser=HTML::TokeParser->new(\$content);
-   my $token;
-   while ($token=$parser->get_token) {
-      if ($token->[0] eq 'S') {
-         my $entry=$token->[1];
-         if (($entry eq 'stores') || ($entry eq 'parameter')) {
-             my $unikey=$entry;
-             $unikey.='_'.$token->[2]->{'part'}; 
-             $unikey.='_'.$token->[2]->{'name'}; 
-             $returnhash{$unikey}=$token->[2]->{'display'};
-         }
-     }
-  }
-    return %returnhash;
-}
-
 # ================================================================== Parameters
 # -------------------------------------------- Figure out a cascading parameter
+#
 
 sub parmval {
-    my ($what,$symb)=@_;
+    my ($what,$safeeval)=@_;
+    my $cid=&getcid($safeeval);
+    my $csec=&getcsec($safeeval);
+    my $uname=&getuname($safeeval);
+    my $udom=&getudom($safeeval);
+    my $symb=&getusymb($safeeval);
 
     unless ($symb) { return ''; }
     my $result='';
@@ -871,23 +890,24 @@ sub parmval {
 
        my $symbparm=$symb.'.'.$what;
        my $mapparm=$mapname.'___(all).'.$what;
+       my $usercourseprefix=$cid.'_'.$uname.'_'.$udom;
 
        my $seclevel=
-            $ENV{'request.course.id'}.'.['.
+            $usercourseprefix.'.['.
 		$csec.'].'.$what;
        my $seclevelr=
-            $ENV{'request.course.id'}.'.['.
+            $usercourseprefix.'.['.
 		$csec.'].'.$symbparm;
        my $seclevelm=
-            $ENV{'request.course.id'}.'.['.
+            $usercourseprefix.'.['.
 		$csec.'].'.$mapparm;
 
        my $courselevel=
-            $ENV{'request.course.id'}.'.'.$what;
+            $usercourseprefix.'.'.$what;
        my $courselevelr=
-            $ENV{'request.course.id'}.'.'.$symbparm;
+            $usercourseprefix.'.'.$symbparm;
        my $courselevelm=
-            $ENV{'request.course.id'}.'.'.$mapparm;
+            $usercourseprefix.'.'.$mapparm;
 
 # ---------------------------------------------------------- fourth, check user
       
@@ -932,13 +952,17 @@ sub parmval {
 
 # ---------------------------------------------- Update rows for course listing
 
-sub updatestudentrows {
+sub updateclasssheet {
     my $safeeval=shift;
-    my $cid=$ENV{'request.course.id'};
+    my $cnum=&getcnum($safeeval);
+    my $cdom=&getcdom($safeeval);
+    my $cid=&getcid($safeeval);
+    my $chome=&getchome($safeeval);
+
+# ---------------------------------------------- Read class list and row labels
+
     my $classlst=&Apache::lonnet::reply
-                 ('dump:'.$ENV{'course.'.$cid.'.domain'}.':'.
-	                  $ENV{'course.'.$cid.'.num'}.':classlist',
-	                  $ENV{'course.'.$cid.'.home'});
+                                 ('dump:'.$cdom.':'.$cnum.':classlist',$chome);
     my %currentlist=();
     my $now=time;
     unless ($classlst=~/^error\:/) {
@@ -950,23 +974,21 @@ sub updatestudentrows {
             if ($active) {
                 my $rowlabel='';
                 $name=&Apache::lonnet::unescape($name);
-                my ($cname,$cdom)=split(/\:/,$name);
-                my $csec=
-             &Apache::lonnet::usection($cdom,$cname,$ENV{'request.course.id'});
-                if ($csec==-1) {
+                my ($sname,$sdom)=split(/\:/,$name);
+                my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid);
+                if ($ssec==-1) {
                     $rowlabel='<font color=red>Data not available: '.$name.
 			      '</font>';
                 } else {
-                    my %reply=&Apache::lonnet::idrget($cdom,$cname);
-                    my $reply=&Apache::lonnet::reply('get:'.$cdom.':'.$cname.
+                    my %reply=&Apache::lonnet::idrget($sdom,$sname);
+                    my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname.
 		      ':environment:firstname&middlename&lastname&generation',
-                      &Apache::lonnet::homeserver($cname,$cdom));
-                    $rowlabel=$csec.'&nbsp;'.$reply{$cname}.'<br>';
+                      &Apache::lonnet::homeserver($sname,$sdom));
+                    $rowlabel=$ssec.'&nbsp;'.$reply{$sname}.'<br>';
                     map {
                         $rowlabel.=&Apache::lonnet::unescape($_).' ';
                     } split(/\&/,$reply);
                 }
-               
 		$currentlist{&Apache::lonnet::unescape($name)}=$rowlabel;
             }
         } split(/\&/,$classlst);
@@ -1010,9 +1032,10 @@ sub updatestudentrows {
         return 'Could not access course data';
     }
 }
-# ----------------------------------------------------------------- Update rows
 
-sub updaterows {
+# ----------------------------------- Update rows for student and assess sheets
+
+sub updatestudentassesssheet {
     my $safeeval=shift;
     my %bighash;
 # -------------------------------------------------------------------- Tie hash
@@ -1249,7 +1272,7 @@ sub rowaassess {
 	if ($_=~/^A/) {
             unless ($f{$_}=~/^\!/) {
   	       if ($f{$_}=~/^parameter/) {
-	          $c{$_}=&parmval($f{$_},$symb);
+	          $c{$_}=&parmval($f{$_},$safeeval);
 	       } else {
 		  my $key=$f{$_};
                   $key=~s/^stores\_/resource\./;
@@ -1287,20 +1310,73 @@ sub selectbox {
     return $selout.'</select>';
 }
 
+# =============================================== Update information in a sheet
+#
+# Add new users or assessments, etc.
+#
+
+sub updatesheet {
+    my $safeeval=shift;
+    my $stype=&gettype($safeeval);
+    if ($stype eq 'classcalc') {
+	return &updateclasssheet($safeeval);
+    } else {
+        return &updatestudentassesssheet($safeeval);
+    }
+}
+
+# =================================================== Load the rows for a sheet
+#
+# Import the data for rows
+#
+
+sub loadrows() {
+    my $safeeval=shift;
+    my $stype=&gettype($safeeval);
+    if ($stype eq 'classcalc') {
+	&loadcourse($thissheet);
+    } elsif ($stype eq 'studentcalc') {
+        &loadstudent($thissheet);
+    } else {
+        &loadassessment($thissheet);
+    }
+}
+
+# ============================================================== Export handler
+#
+# Non-interactive call from with program
+#
+
+sub exportsheet {
+    my ($uname,$udom,$stype,$usymb,$fn)=@_;
+    my $thissheet=($uname,$udom,$stype,$usymb);
+    &readsheet($thissheet,$fn);
+    &updatesheet($thissheet);
+    &loadrows($thissheet);
+    &calcsheet($thissheet);
+    return &exportdata($thissheet);
+}
+
 # ================================================================ Main handler
+#
+# Interactive call to screen
+#
+#
+
 
 sub handler {
     my $r=shift;
 
-    $uname='';
-    $udom='';
-    $csec='';
-
-   if ($r->header_only) {
+    if ($r->header_only) {
       $r->content_type('text/html');
       $r->send_http_header;
       return OK;
-   }
+    }
+
+# ---------------------------------------------------- Global directory configs
+
+$includedir=r->dir_config('lonIncludes');
+$tmpdir=$r->dir_config('lonDaemons').'/tmp/';
 
 # ----------------------------------------------------- Needs to be in a course
 
@@ -1385,7 +1461,7 @@ ENDSCRIPT
                  $ENV{'form.unewfield'},$ENV{'form.unewformula'});
     } elsif ($ENV{'form.saveas'}) {
         &setfilename($sheetone,$ENV{'form.ufn'});
-	&tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/',
+	&tmpread($sheetone,,
                  $ENV{'form.usymb'});
     } else {
         unless ($ENV{'form.ufn'}) {
@@ -1493,6 +1569,8 @@ ENDSCRIPT
       return HTTP_NOT_ACCEPTABLE; 
   }
     return OK;
+
+    $bombnomatterwhat='yes';
 }
 
 1;