--- loncom/interface/Attic/lonspreadsheet.pm	2002/12/04 21:49:33	1.154
+++ loncom/interface/Attic/lonspreadsheet.pm	2003/03/14 21:36:42	1.160.2.2
@@ -1,5 +1,5 @@
 #
-# $Id: lonspreadsheet.pm,v 1.154 2002/12/04 21:49:33 matthew Exp $
+# $Id: lonspreadsheet.pm,v 1.160.2.2 2003/03/14 21:36:42 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -961,7 +961,7 @@ ENDDEFS
 sub templaterow {
     my $sheet = shift;
     my @cols=();
-    my $rowlabel = 'Template';
+    my $rowlabel = 'Template</td><td>&nbsp;';
     foreach ('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',
@@ -989,8 +989,10 @@ sub outrowassess {
         } else { 
             $rowlabel = '';
         }
+    } elsif ($ENV{'request.role'} =~ /^st\./) {
+        $rowlabel = 'Summary</td><td>0';
     } else {
-        $rowlabel = 'Export';
+        $rowlabel = 'Export</td><td>0';
     }
     foreach ('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',
@@ -1011,9 +1013,9 @@ sub outrow {
         $rowlabel = $sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$n}};
     } else {
         if ($sheet->{'sheettype'} eq 'classcalc') {
-            $rowlabel = 'Summary';
+            $rowlabel = 'Summary</td><td>0';
         } else {
-            $rowlabel = 'Export';
+            $rowlabel = 'Export</td><td>0';
         }
     }
     foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M',
@@ -1259,7 +1261,7 @@ sub html_editable_cell {
     } elsif ($value =~ /^\s*$/ ) {
         $value = '<font color="'.$bgcolor.'">#</font>';
     } else {
-        $value = &HTML::Entities::encode($value);
+        $value = &HTML::Entities::encode($value) if ($value !~/&nbsp;/);
     }
     # Make the formula safe for outputting
     $formula =~ s/\'/\"/g;
@@ -1277,13 +1279,14 @@ sub html_editable_cell {
 sub html_uneditable_cell {
     my ($cell,$bgcolor) = @_;
     my $value = (defined($cell) ? $cell->{'value'} : '');
-    $value = &HTML::Entities::encode($value);
+    $value = &HTML::Entities::encode($value) if ($value !~/&nbsp;/);
     return '&nbsp;'.$value.'&nbsp;';
 }
 
 sub outsheet_html  {
     my ($sheet,$r) = @_;
     my ($num_uneditable,$realm,$row_type);
+    my $requester_is_student = ($ENV{'request.role'} =~ /^st\./);
     if ($sheet->{'sheettype'} eq 'assesscalc') {
         $num_uneditable = 1;
         $realm = 'Assessment';
@@ -1306,7 +1309,7 @@ sub outsheet_html  {
     my $tabledata =<<"END";
 <table border="2">
 <tr>
-  <th colspan="1" rowspan="2"><font size="+2">$realm</font></th>
+  <th colspan="2" rowspan="2"><font size="+2">$realm</font></th>
   <td bgcolor="#FFDDDD" colspan="$num_uneditable">
       <b><font size="+1">Import</font></b></td>
   <td colspan="$num_left">
@@ -1328,21 +1331,26 @@ END
     ####################################
     # Print out template row
     ####################################
-    my ($rowlabel,@rowdata) = &get_row($sheet,'-');
-    my $row_html = '<tr><td>'.&format_html_rowlabel($sheet,$rowlabel).'</td>';
-    my $num_cols_output = 0;
-    foreach my $cell (@rowdata) {
-        if ($num_cols_output++ < $num_uneditable) {
-            $row_html .= '<td bgcolor="#FFDDDD">';
-            $row_html .= &html_uneditable_cell($cell,'#FFDDDD');
-        } else {
-            $row_html .= '<td bgcolor="#EOFFDD">';
-            $row_html .= &html_editable_cell($cell,'#E0FFDD');
+    my ($num_cols_output,$row_html,$rowlabel,@rowdata);
+    
+    if (! $requester_is_student) {
+        ($rowlabel,@rowdata) = &get_row($sheet,'-');
+        $row_html = '<tr><td>'.&format_html_rowlabel($sheet,$rowlabel).'</td>';
+        $num_cols_output = 0;
+        foreach my $cell (@rowdata) {
+            if ($requester_is_student || 
+                $num_cols_output++ < $num_uneditable) {
+                $row_html .= '<td bgcolor="#FFDDDD">';
+                $row_html .= &html_uneditable_cell($cell,'#FFDDDD');
+            } else {
+                $row_html .= '<td bgcolor="#EOFFDD">';
+                $row_html .= &html_editable_cell($cell,'#E0FFDD');
+            }
+            $row_html .= '</td>';
         }
-        $row_html .= '</td>';
+        $row_html.= "</tr>\n";
+        $r->print($row_html);
     }
-    $row_html.= "</tr>\n";
-    $r->print($row_html);
     ####################################
     # Print out summary/export row
     ####################################
@@ -1350,12 +1358,12 @@ END
     $row_html = '<tr><td>'.&format_html_rowlabel($sheet,$rowlabel).'</td>';
     $num_cols_output = 0;
     foreach my $cell (@rowdata) {
-        if ($num_cols_output++ < 26) {
+        if ($num_cols_output++ < 26 && ! $requester_is_student) {
             $row_html .= '<td bgcolor="#CCCCFF">';
             $row_html .= &html_editable_cell($cell,'#CCCCFF');
         } else {
             $row_html .= '<td bgcolor="#DDCCFF">';
-            $row_html .= &html_uneditable_cell(undef,'#CCCCFF');
+            $row_html .= &html_uneditable_cell($cell,'#CCCCFF');
         }
         $row_html .= '</td>';
     }
@@ -1432,7 +1440,7 @@ END
             $bgcolor='#FFDDDD' if ($shown_cells < $num_uneditable);
             #
             $row_html.='<td bgcolor='.$bgcolor.'>';
-            if ($shown_cells < $num_uneditable) {
+            if ($requester_is_student || $shown_cells < $num_uneditable) {
                 $row_html .= &html_uneditable_cell($cell,$bgcolor);
             } else {
                 $row_html .= &html_editable_cell($cell,$bgcolor);
@@ -1833,13 +1841,27 @@ sub readsheet {
             }
             %f=%{&parse_sheet(\$sheetxml)};
         } else {
-            my $sheet='';
             my %tmphash = &Apache::lonnet::dump($fn,$cdom,$cnum);
             my ($tmp) = keys(%tmphash);
-            unless ($tmp =~ /^(con_lost|error|no_such_host)/i) {
+            if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
                 foreach (keys(%tmphash)) {
                     $f{$_}=$tmphash{$_};
                 }
+            } else {
+                # Unable to grab the specified spreadsheet,
+                # so we get the default ones instead.
+                $fn = 'default_'.$stype;
+                $sheet->{'filename'} = $fn;
+                my $dfn = $fn;
+                $dfn =~ s/\_/\./g;
+                my $sheetxml;
+                if (my $fh=Apache::File->new($includedir.'/'.$dfn)) {
+                    $sheetxml = join('',<$fh>);
+                } else {
+                    $sheetxml='<field row="0" col="A">'.
+                        '"Unable to load spreadsheet"</field>';
+                }
+                %f=%{&parse_sheet(\$sheetxml)};
             }
         }
         # Cache and set
@@ -1860,6 +1882,14 @@ sub makenewsheet {
     $sheet->{'mapid'} = $ENV{'form.mapid'};
     $sheet->{'resid'} = $ENV{'form.resid'};
     $sheet->{'cid'}   = $ENV{'request.course.id'};
+    if (! exists($Section{$uname.':'.$udom})) {
+        my $classlist = &Apache::loncoursedata::get_classlist();
+        foreach my $student (keys(%$classlist)) {
+            my ($studentDomain,$studentName,undef,undef,undef,$studentSection,
+                undef,undef)   =   @{$classlist->{$student}};
+            $Section{$studentName.':'.$studentDomain} = $studentSection;
+        }
+    }
     $sheet->{'csec'}  = $Section{$uname.':'.$udom};
     $sheet->{'coursefilename'}   = $ENV{'request.course.fn'};
     $sheet->{'cnum'}  = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
@@ -2072,8 +2102,27 @@ sub parmval {
     # second, check map parms
     my $thisparm = $parmhash{$symbparm};
     return $thisparm if (defined($thisparm));
+
     # first, check default
-    return &Apache::lonnet::metadata($fn,$rwhat.'.default');
+    $thisparm = &Apache::lonnet::metadata($fn,$rwhat.'.default');
+    return $thisparm if (defined($thisparm));
+
+    #Cascade Up
+    my $space=$what;
+    $space=~s/\.\w+$//;
+    if ($space ne '0') {
+	my @parts=split(/_/,$space);
+	my $id=pop(@parts);
+	my $part=join('_',@parts);
+	if ($part eq '') { $part='0'; }
+	my $newwhat=$rwhat;
+	$newwhat=~s/\Q$space\E/$part/;
+	my $partgeneral=&parmval($newwhat,$symb,$uname,$udom,$csec);
+	if (defined($partgeneral)) { return $partgeneral; }
+    }
+
+    #nothing defined
+    return '';
 }
 
 
@@ -2369,7 +2418,7 @@ sub updatestudentassesssheet {
         unless ((exists($sheet->{'rowlabel'}->{$usy}) && 
                  (defined($sheet->{'rowlabel'}->{$usy})) || (!$1) ||
                  ($formula =~ /^(~~~|---)/) )) {
-            $f{$_}='!!! Obsolete';
+            $f{$cell}='!!! Obsolete';
             $changed=1;
         }
     }
@@ -2893,7 +2942,8 @@ sub cachedssheets {
     $uname = $uname || $sheet->{'uname'};
     $udom  = $udom  || $sheet->{'udom'};
     if (! $loadedcaches{$uname.'_'.$udom}) {
-        my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets',
+        my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets_'.
+                                        $ENV{'request.course.id'},
                                         $sheet->{'udom'},
                                         $sheet->{'uname'});
         if ($tmp[0] !~ /^error/) {
@@ -3123,7 +3173,7 @@ ENDSCRIPT
     # If a new formula had been entered, go from work copy
     if ($ENV{'form.unewfield'}) {
         $r->print('<h2>Modified Workcopy</h2>');
-        $ENV{'form.unewformula'}=~s/\'/\"/g;
+        #$ENV{'form.unewformula'}=~s/\'/\"/g;
         $r->print('<p>Cell '.$ENV{'form.unewfield'}.' = <pre>');
         $r->print(&HTML::Entities::encode($ENV{'form.unewformula'}).
                   '</pre></p>');
@@ -3189,6 +3239,7 @@ ENDSCRIPT
         $oldsheets{'course'} ne $sheet->{'cid'}) {
         undef %oldsheets;
         undef %loadedcaches;
+        undef %Section;
     }
     $oldsheets{'course'} = $sheet->{'cid'};
     #
@@ -3255,8 +3306,8 @@ ENDSCRIPT
     }
     $r->print('>');
     #
-    # CSV format checkbox (classcalc sheets only)
-    $r->print(' Output as <select name="output" size="1" onClick="submit()">'.
+    # output format select box 
+    $r->print(' Output as <select name="output" size="1" onChange="submit()">'.
               "\n");
     foreach my $mode (qw/HTML CSV Excel/) {
         $r->print('<option value="'.$mode.'"');