--- loncom/interface/spreadsheet/Spreadsheet.pm	2003/05/22 21:16:35	1.3
+++ loncom/interface/spreadsheet/Spreadsheet.pm	2003/05/23 21:03:29	1.6
@@ -1,5 +1,5 @@
 #
-# $Id: Spreadsheet.pm,v 1.3 2003/05/22 21:16:35 matthew Exp $
+# $Id: Spreadsheet.pm,v 1.6 2003/05/23 21:03:29 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -97,6 +97,7 @@ sub new {
         chome    => $ENV{'course.'.$ENV{'request.course.id'}.'.home'},
         coursedesc => $ENV{'course.'.$ENV{'request.course.id'}.'.description'},
         coursefilename => $ENV{'request.course.fn'},
+        temporary => '',
         #
         # blackout is used to determine if any data needs to be hidden from the
         # student.
@@ -1109,6 +1110,24 @@ sub calcsheet {
 ## Output Helpers
 ##
 ###########################################################
+sub display {
+    my $self = shift;
+    my ($r) = @_;
+    $self->compute($r);
+    my $outputmode = 'html';
+    if ($ENV{'form.output_format'} =~ /^(html|excel|csv)$/) {
+        $outputmode = $ENV{'form.output_format'};
+    }
+    if ($outputmode eq 'html') {
+        $self->outsheet_html($r);
+    } elsif ($outputmode eq 'excel') {
+        $self->outsheet_excel($r);
+    } elsif ($outputmode eq 'csv') {
+        $self->outsheet_csv($r);
+    }
+    return;
+}
+
 ############################################
 ##         HTML output routines           ##
 ############################################
@@ -1211,6 +1230,55 @@ sub html_row {
     return $row_html;
 }
 
+sub html_header {
+    my $self = shift;
+    return '' if (! $ENV{'request.role.adv'});
+    return "<table>\n".
+        '<tr><th align="center">Output Format</th><tr>'."\n".
+        '<tr><td>'.&output_selector()."</td></tr>\n".
+        "</table>\n";
+}
+
+sub output_selector {
+    my $output_selector = '<select name="output_format" size="3">'."\n";
+    my $default = 'html';
+    if (exists($ENV{'form.output_format'})) {
+        $default = $ENV{'form.output_format'} 
+    } else {
+        $ENV{'form.output_format'} = $default;
+    }
+    foreach (['html','HTML'],
+             ['excel','Excel'],
+             ['csv','Comma Seperated Values']) {
+        my ($name,$description) = @{$_};
+        $output_selector.=qq{<option value="$name"};
+        if ($name eq $default) {
+            $output_selector .= ' selected';
+        }
+        $output_selector .= ">$description</option>\n";
+    }
+    $output_selector .= "</select>\n";
+    return $output_selector;
+}
+
+################################################
+##          Excel output routines             ##
+################################################
+sub excel_output_row {
+    my $self = shift;
+    my ($worksheet,$rownum,$rows_output,@prepend) = @_;
+    my $cols_output = 0;
+    #
+    my @rowdata = $self->get_row($rownum);
+    foreach my $cell (@prepend,@rowdata) {
+        my $value = $cell;
+        $value = $cell->{'value'} if (ref($value));
+        $value =~ s/\&nbsp;/ /gi;
+        $worksheet->write($rows_output,$cols_output++,$value);
+    }
+    return;
+}
+
 sub create_excel_spreadsheet {
     my $self = shift;
     my ($r) = @_;
@@ -1236,6 +1304,103 @@ sub create_excel_spreadsheet {
     return ($workbook,$filename);
 }
 
+sub outsheet_excel {
+    my $self = shift;
+    my ($r) = @_;
+    $r->print("<h2>Preparing Excel Spreadsheet</h2>");
+    #
+    # Create excel worksheet
+    my ($workbook,$filename) = $self->create_excel_spreadsheet($r);
+    return if (! defined($workbook));
+    #
+    # Create main worksheet
+    my $worksheet = $workbook->addworksheet('main');
+    my $rows_output = 0;
+    my $cols_output = 0;
+    #
+    # Write excel header
+    foreach my $value ($self->get_title()) {
+        $cols_output = 0;
+        $worksheet->write($rows_output++,$cols_output,$value);
+    }
+    $rows_output++;    # skip a line
+    #
+    # Write summary/export row
+    $cols_output = 0;
+    $self->excel_output_row($worksheet,0,$rows_output++,'Summary');
+    $rows_output++;    # skip a line
+    #
+    $self->excel_rows($worksheet,$cols_output,$rows_output);
+    #
+    #
+    # Close the excel file
+    $workbook->close();
+    #
+    # Write a link to allow them to download it
+    $r->print('<br />'.
+              '<a href="'.$filename.'">Your Excel spreadsheet.</a>'."\n");
+    return;
+}
+
+#################################
+## CSV output routines         ##
+#################################
+sub outsheet_csv   {
+    my $self = shift;
+    my ($r) = @_;
+    my $csvdata = '';
+    my @Values;
+    #
+    # Open the csv file
+    my $filename = '/prtspool/'.
+        $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
+        time.'_'.rand(1000000000).'.csv';
+    my $file;
+    unless ($file = Apache::File->new('>'.'/home/httpd'.$filename)) {
+        $r->log_error("Couldn't open $filename for output $!");
+        $r->print("Problems occured in writing the csv file.  ".
+                  "This error has been logged.  ".
+                  "Please alert your LON-CAPA administrator.");
+        $r->print("<pre>\n".$csvdata."</pre>\n");
+        return 0;
+    }
+    #
+    # Output the title information
+    foreach my $value ($self->get_title()) {
+        print $file "'".&Apache::loncommon::csv_translate($value)."'\n";
+    }
+    #
+    # Output the body of the spreadsheet
+    $self->csv_rows($file);
+    #
+    # Close the csv file
+    close($file);
+    $r->print('<br /><br />'.
+              '<a href="'.$filename.'">Your CSV spreadsheet.</a>'."\n");
+    #
+    return 1;
+}
+
+sub csv_output_row {
+    my $self = shift;
+    my ($filehandle,$rownum,@prepend) = @_;
+    #
+    my @rowdata = ();
+    if (defined($rownum)) {
+        @rowdata = $self->get_row($rownum);
+    }
+    my @output = ();
+    foreach my $cell (@prepend,@rowdata) {
+        my $value = $cell;
+        $value = $cell->{'value'} if (ref($value));
+        $value =~ s/\&nbsp;/ /gi;
+        $value = "'".$value."'";
+        push (@output,$value);
+    }
+    print $filehandle join(',',@output )."\n";
+    return;
+}
+
 ############################################
 ##          XML output routines           ##
 ############################################
@@ -1400,6 +1565,8 @@ sub save {
     my $self = shift;
     my ($makedef)=@_;
     my $cid=$self->{'cid'};
+    # If we are saving it, it must not be temporary
+    $self->temporary(0);
     if (&Apache::lonnet::allowed('opa',$cid)) {
         my %f=$self->formulas();
         my $stype = $self->{'type'};
@@ -1442,6 +1609,7 @@ sub save_tmp {
            $self->{'filename'};
     $fn=~s/\W/\_/g;
     $fn=$Apache::lonnet::tmpdir.$fn.'.tmp';
+    $self->temporary(1);
     my $fh;
     if ($fh=Apache::File->new('>'.$fn)) {
         my %f = $self->formulas();
@@ -1472,12 +1640,23 @@ sub load_tmp {
         }
         $spreadsheet_file->close();
     }
+    # flag the sheet as temporary
+    $self->temporary(1);
     $self->formulas(\%formulas);
     $self->set_row_sources();
     $self->set_row_numbers();
     return;
 }
 
+sub temporary {
+    my $self=shift;
+    if (@_) {
+        ($self->{'temporary'})= @_;
+    }
+    $self->logthis('temporary = '.$self->{'temporary'});
+    return $self->{'temporary'};
+}
+
 sub modify_cell {
     # studentcalc overrides this
     my $self = shift;