--- loncom/interface/Attic/lonspreadsheet.pm	2001/07/21 23:55:31	1.57
+++ loncom/interface/Attic/lonspreadsheet.pm	2001/09/17 22:01:23	1.65
@@ -6,7 +6,7 @@
 # 01/01/01,02/01,03/01,19/01,20/01,22/01,
 # 03/05,03/08,03/10,03/12,03/13,03/15,03/17,
 # 03/19,03/20,03/21,03/27,04/05,04/09,
-# 07/09,07/14,07/21 Gerd Kortemeyer
+# 07/09,07/14,07/21,09/01,09/10,9/11,9/12,9/13,9/14,9/17 Gerd Kortemeyer
 
 package Apache::lonspreadsheet;
             
@@ -308,6 +308,42 @@ sub SUMMIN {
     return $sum;   
 }
 
+sub expandnamed {
+    my $expression=shift;
+    if ($expression=~/^\&/) {
+	my ($func,$var,$formula)=($expression=~/^\&(\w+)\(([^\;]+)\;(.*)\)/);
+	my @vars=split(/\W+/,$formula);
+        my %values=();
+        undef %values;
+        map {
+            my $varname=$_;
+            if ($varname=~/\D/) {
+               $formula=~s/$varname/'$c{\''.$varname.'\'}'/ge;
+               $varname=~s/$var/\(\\w\+\)/g;
+	       map {
+		  if ($_=~/$varname/) {
+		      $values{$1}=1;
+                  }
+               } keys %c;
+	    }
+        } @vars;
+        if ($func eq 'EXPANDSUM') {
+            my $result='';
+	    map {
+                my $thissum=$formula;
+                $thissum=~s/$var/$_/g;
+                $result.=$thissum.'+';
+            } keys %values;
+            $result=~s/\+$//;
+            return $result;
+        } else {
+	    return 0;
+        }
+    } else {
+        return '$c{\''.$expression.'\'}';
+    }
+}
+
 sub sett {
     %t=();
     my $pattern='';
@@ -329,7 +365,7 @@ sub sett {
                     $t{$lb}=~s/\#/$trow/g;
                     $t{$lb}=~s/\.\.+/\,/g;
                     $t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
-                    $t{$lb}=~s/(^|[^\"\'])\[(\w+)\]/$1\$c\{\'$2\'\}/g;
+                    $t{$lb}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge;
                 }
 	      }
             } keys %f;
@@ -347,14 +383,14 @@ sub sett {
 	       $t{$_}=$f{$_};
                $t{$_}=~s/\.\.+/\,/g;
                $t{$_}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
-               $t{$_}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g;
+               $t{$_}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge;
             }
         }
     } keys %f;
     $t{'A0'}=$f{'A0'};
     $t{'A0'}=~s/\.\.+/\,/g;
     $t{'A0'}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
-    $t{'A0'}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g;
+    $t{'A0'}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge;
 }
 
 sub calc {
@@ -401,7 +437,7 @@ sub outrowassess {
     my @cols=();
     if ($n) {
        my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{'A'.$n});
-       $cols[0]=$f{'A'.$n}.'<br>'.$rl{$usy}.'<br>'.
+       $cols[0]=$rl{$usy}.'<br>'.
                 '<select name="sel_'.$n.'" onChange="changesheet('.$n.
                 ')"><option name="default">Default</option>';
        map {
@@ -634,47 +670,34 @@ sub rown {
     my ($safeeval,$n)=@_;
     my $defaultbg;
     my $rowdata='';
+    my $dataflag=0;
     unless ($n eq '-') {
        $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF';
     } else {
        $defaultbg='#E0FF';
     }
-    if ((($n-1)/25)==int(($n-1)/25)) {
-        my $what='Student';
-        if (&gettype($safeeval) eq 'assesscalc') {
-	    $what='Item';
-	} elsif (&gettype($safeeval) eq 'studentcalc') {
-            $what='Assessment';
-        }
-	$rowdata.="</table>\n<br><table border=2>".
-        '<tr><td>&nbsp;<td>'.$what.'</td>';
-        map {
-           $rowdata.='<td>'.$_.'</td>';
-        } ('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',
-           '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');
-        $rowdata.='</tr>';
-    }
     $rowdata.="\n<tr><td><b><font size=+1>$n</font></b></td>";
     my $showf=0;
     my $proc;
     my $maxred;
-    if (&gettype($safeeval) eq 'studentcalc') {
+    my $sheettype=&gettype($safeeval);
+    if ($sheettype eq 'studentcalc') {
         $proc='&outrowassess';
         $maxred=26;
     } else {
         $proc='&outrow';
     }
-    if (&gettype($safeeval) eq 'assesscalc') {
+    if ($sheettype eq 'assesscalc') {
         $maxred=1;
     } else {
         $maxred=26;
     }
-    if ($n eq '-') { $proc='&templaterow'; $n=-1; }
+    if ($n eq '-') { $proc='&templaterow'; $n=-1; $dataflag=1; }
     map {
        my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD');
        my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_);
+       if ((($vl ne '') || ($vl eq '0')) &&
+           (($showf==1) || ($sheettype ne 'studentcalc'))) { $dataflag=1; }
        if ($showf==0) { $vl=$_; }
        if ($showf<=$maxred) { $bgcolor='#FFDDDD'; }
        if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } 
@@ -690,7 +713,11 @@ sub rown {
        }
        $showf++;
     } $safeeval->reval($proc.'('.$n.')');
-    return $rowdata.'</tr>';
+    if ($ENV{'form.showall'} || ($dataflag)) {
+       return $rowdata.'</tr>';
+    } else {
+       return '';
+    }
 }
 
 # ------------------------------------------------------------- Print out sheet
@@ -733,10 +760,43 @@ sub outsheet {
     $tabledata.='</tr>';
     my $row;
     my $maxrow=&getmaxrow($safeeval);
-    $tabledata.=&rown($safeeval,'-');
+    $tabledata.=&rown($safeeval,'-').&rown($safeeval,0);
     $r->print($tabledata);
-    for ($row=0;$row<=$maxrow;$row++) {
-        $r->print(&rown($safeeval,$row));
+
+    my @sortby=();
+    my @sortidx=();
+    for ($row=1;$row<=$maxrow;$row++) {
+       $sortby[$row-1]=$safeeval->reval('$f{"A'.$row.'"}');
+       $sortidx[$row-1]=$row-1;
+    }
+    @sortidx=sort { $sortby[$a] cmp $sortby[$b]; } @sortidx;
+
+        my $what='Student';
+        if (&gettype($safeeval) eq 'assesscalc') {
+	    $what='Item';
+	} elsif (&gettype($safeeval) eq 'studentcalc') {
+            $what='Assessment';
+        }
+
+    my $n=0;
+    for ($row=0;$row<$maxrow;$row++) {
+     my $thisrow=&rown($safeeval,$sortidx[$row]+1);
+     if ($thisrow) {
+       if ($n/25==int($n/25)) {
+	$r->print("</table>\n<br>\n");
+        $r->rflush();
+        $r->print('<table border=2><tr><td>&nbsp;<td>'.$what.'</td>');
+        map {
+           $r->print('<td>'.$_.'</td>');
+        } ('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',
+           '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');
+        $r->print('</tr>');
+       }
+       $n++;
+       $r->print($thisrow);
+      }
     }
     $r->print('</table>');
 }
@@ -1477,6 +1537,18 @@ sub loadassessment {
 # ----------------- now courseopt, useropt initialized for this user and course
 # (used by parmval)
 
+#
+# Load keys for this assessment only
+#
+    my %thisassess=();
+    my ($symap,$syid,$srcf)=split(/\_\_\_/,$symb);
+    
+    map {
+        $thisassess{$_}=1;
+    } split(/\,/,&Apache::lonnet::metadata($srcf,'keys'));
+#
+# Load parameters
+#
    my %c=();
 
    if (tie(%parmhash,'GDBM_File',
@@ -1486,9 +1558,11 @@ sub loadassessment {
 	if ($_=~/^A/) {
             unless ($f{$_}=~/^\!/) {
   	       if ($f{$_}=~/^parameter/) {
+		if ($thisassess{$f{$_}}) {
                   my $val=&parmval($f{$_},$safeeval);
                   $c{$_}=$val;
                   $c{$f{$_}}=$val;
+	        }
 	       } else {
 		  my $key=$f{$_};
                   my $ckey=$key;
@@ -1937,7 +2011,8 @@ ENDSCRIPT
 # ---------------------------------------------------------------- Course title
 
     $r->print('<h1>'.
-            $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1>');
+            $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.
+             '</h1><h3>'.localtime().'</h3>');
 
 # ---------------------------------------------------- See if user can see this
 
@@ -2060,6 +2135,15 @@ ENDSCRIPT
 
    &tmpwrite($asheet);
 
+    if (&gettype($asheet) eq 'studentcalc') {
+	$r->print('<br>Show rows with empty A column: ');
+    } else {
+        $r->print('<br>Show empty rows: ');
+    } 
+    $r->print('<input type=checkbox name=showall onClick="submit()"');
+    if ($ENV{'form.showall'}) { $r->print(' checked'); }
+    $r->print('>');
+
 # ------------------------------------------------------------- Print out sheet
 
     &outsheet($r,$asheet);