#!/usr/local/bin/perl

## This file is profFormEditClasslistFiles.pl
## It provides access to utilities for downloading Classlist files
##

####################################################################
# Copyright @ 1995-1998 University of Rochester
# All Rights Reserved
####################################################################

use lib '.'; use webworkInit; # WeBWorKInitLine
use CGI qw(:standard);
use Global;
use Auth;
use strict;
use File::Copy;

# begin Timing code
use Benchmark;
my $beginTime = new Benchmark;
# end Timing code

&CGI::ReadParse;
my %inputs =%main::in;

# get information from CGI inputs  (see also below for additional information)

my $Course 			= $inputs{'course'};
my $User 			= $inputs{'user'};
my $Session_key 	= $inputs{'key'};

my @array = %inputs;
# print "inputs are @array";

# verify that information has been received
unless($Course && $User && $Session_key) {
    &wwerror("$0","The script did not receive the proper input data.","","");
}


# establish environment for this script

&Global::getCourseEnvironment($inputs{'course'});

my $cgiURL   				= getWebworkCgiURL;
my $databaseDirectory 		= getCourseDatabaseDirectory;
my $htmlURL       			= getCourseHtmlURL;
my $scriptDirectory   		= getWebworkScriptDirectory;
my $templateDirectory 		= getCourseTemplateDirectory;
my $DAT                     = getDat;
my $dd                      = getDirDelim;

require "${scriptDirectory}$Global::DBglue_pl";
require "${scriptDirectory}$Global::FILE_pl";
require "${scriptDirectory}$Global::HTMLglue_pl";
require "${scriptDirectory}$Global::SCRtools_pl";

# log access
&Global::log_info('', query_string);


my $permissionsFile = &Global::getCoursePermissionsFile($inputs{'course'});
my $permissions = &get_permissions($inputs{'user'}, $permissionsFile);
my $keyFile = &Global::getCourseKeyFile($inputs{'course'});
my $defaultClasslistFile = getCourseClasslistFile($Course);

#verify session key
&verify_key($inputs{'user'}, $inputs{'key'}, $keyFile, $inputs{'course'});

# verify permissions are correct
if ($permissions != $Global::instructor_permissions ) {
    print "permissions = $permissions instructor_permissions = $Global::instructor_permissions\n";
    print &html_NO_PERMISSION;
    exit(0);
}
# get the rest of the information from the submitted form

my $fileName        = $inputs{'fileName'};
my $action          = $inputs{'action'};
my $readWrite       = $inputs{'readWrite'};



## if totals file is the only one selected, view it immediately

OPTIONSWITCH: {
    if ($action eq '') {
        &selectFilesForm();
        last  OPTIONSWITCH;
    }
    if ($action eq 'readFromFile') {
        &createFormFromFile("${templateDirectory}$fileName");
        last  OPTIONSWITCH;
    }
    if ($action eq 'saveToFile') {
        &saveToFile(\%inputs);
        last  OPTIONSWITCH;
    }
    if ($action eq 'duplicateLastRow') {
        &duplicateLastRow(\%inputs);
        last  OPTIONSWITCH;
    }    
    if ($action eq 'addEmptyRow') {
        &addEmptyRow(\%inputs);
        last  OPTIONSWITCH;
    }
    if ($action eq 'deleteLastRow') {
        &deleteLastRow(\%inputs);
        last  OPTIONSWITCH;
    }        

}

# begin Timing code
my $endTime = new Benchmark;
&Global::logTimingInfo($beginTime,$endTime,"profClasslist.pl",$inputs{'course'},$inputs{'user'});
# end Timing code

exit;

## subroutines


sub selectFilesForm {

# print HTML text
print &htmlTOP("Select Classlist File for simple editing");

# print navigation buttons
print qq!
<A HREF="${cgiURL}profClasslist.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}">
<IMG SRC="${Global::upImgUrl}" align="right" BORDER=1 ALT="[Up]"></A><p>
!;

print <<EOF;
<h3 align="left">Simple editing of classlist files for $Course</h3> <p>
EOF


print <<EOF;
<P>
<HR NOSHADE>
<H4 ALIGN=LEFT>
Select files:
</H4>

		<FORM METHOD = "POST" ACTION= "${cgiURL}profFormEditClasslistFiles.pl">
         <INPUT TYPE="SUBMIT" VALUE="Edit file">

EOF

 ## find the available files
 
opendir CLASSLISTDIR, $templateDirectory or wwerror($0,"Can't open directory $templateDirectory","","");
my @allFiles = grep !/^\./, readdir CLASSLISTDIR;        
closedir  CLASSLISTDIR;

    ## sort the files
    
my @classlistFiles = grep /\.lst$/,@allFiles;
my @sortedNames = sort @classlistFiles;
    ## put the default classlist file first if it exists
my $shortFileName = $defaultClasslistFile;                                                                                                                                                                                                                                                                                                                                                                                                                                    
    if ($shortFileName =~ m|$dd|)  {                                                                                                                                                                                                                                   
        $shortFileName =~ m|$dd([^$dd]*)$|;  ## extract filename from full path name                                                                                                                                                                                   
        $shortFileName = $1;                                                                                                                                                                                                                                           
    }       
my @newSortedNames  = grep !/^$shortFileName$/, @sortedNames;
if ($#newSortedNames != $#sortedNames) {
    unshift @newSortedNames,$shortFileName;
    @sortedNames = @newSortedNames;
}    
        
    ## print list of files
  
print qq! <SELECT Name="fileName" >\n!; 
my ($ind,$label,$date,@stat);
for $ind (@sortedNames) { 
    $fileName = "${templateDirectory}$ind";  
	    if (-e $fileName) {
	        @stat = stat($fileName);
	        $date = $stat[9];
	        $date = formatDateAndTime($date);
	        $date =~ s|\s*at.*||;
	        $label = "  Last Changed $date";	        
	    }   
    
	print "<OPTION VALUE = \"$ind\">$ind $label\n";
}
    print qq!</SELECT>\n!;

 ## resume printing the rest of the form

print <<EOF;
         <INPUT TYPE="HIDDEN" NAME="user" VALUE="$inputs{'user'}">
         <INPUT TYPE="HIDDEN" NAME="key" VALUE="$inputs{'key'}">
         <INPUT TYPE="HIDDEN" NAME="course" VALUE="$inputs{'course'}">
         <INPUT TYPE="HIDDEN" NAME="action" VALUE="readFromFile">
         </FORM>
EOF
print &htmlBOTTOM("profFormEditClasslistFiles.pl", \%inputs);
}



sub selectionError {
  print"content-type:\n\n<H2>Error:  You must make a selection!</H2>\n";
  print "<FORM METHOD=POST ACTION=\"${cgiURL}profFormEditClasslistFiles.pl\"><P>";
  print &sessionKeyInputs(\%inputs);
print <<"ENDOFHTML";
<INPUT TYPE=SUBMIT VALUE="Return to Form Edit Classlist Files Page">
</FORM>
ENDOFHTML
  print &htmlBOTTOM("profFormEditClasslistFiles.pl", \%inputs);
}


sub createFormFromFile {
    my ($fileName) = @_;
    &printTopOfForm();
    print  'Three backups of your file will be kept, but please be careful.<BR>
    The format is: <pre> Student_ID  Last_Name  First_Name  Status   Comment  Section  Recitation  Email_Address  Student_Login</pre>';
	my $string = &delim2html($fileName,'htmlform');
    print "${string}<BR>";    
    &printSubmitButtons();
    &printBottomOfForm();
}

sub createFormFromDelimitedArray {
    my ($inArrayref,$fileName) = @_;
    &printTopOfForm();
    print  'Three backups of your file will be kept, but please be careful.<BR>
    The format is: <pre> Student_ID  Last_Name  First_Name  Status   Comment  Section  Recitation  Email_Address  Student_Login</pre>';
    
    my $shortFileName = $fileName;                                                                                                                                                                                                                                                                                                                                                                                                                                    
    if ($shortFileName =~ m|$dd|)  {                                                                                                                                                                                                                                   
        $shortFileName =~ m|$dd([^$dd]*)$|;  ## extract filename from full path name                                                                                                                                                                                   
        $shortFileName = $1;                                                                                                                                                                                                                                           
    }                                                                                                                                                                                                                                                                  
    $shortFileName =~ s|\..*||;      ## remove extension   
	my $string = &delimitedArray2html($inArrayref, $shortFileName,'htmlform');
    print "${string}<BR>";
    &printSubmitButtons();
    &printBottomOfForm();
}

sub saveToFile {
    my ($inputsref) = @_;
    my $outString = &htmlForm2delim($inputsref);
#print "$outString";

#print "readWrite is $readWrite";

    unless ($readWrite eq 'readWrite') {
        &readWriteError();
        exit;
    }

    my $fulFileName     =   $inputs{'fileName'};
    my $shortFileName   =   $fulFileName;
    if ($shortFileName  =~  m|$dd|)  {
        $shortFileName  =~  m|$dd([^$dd]*)$|;  ## extract filename from full path name
        $shortFileName  =   $1;
    }    
    $shortFileName      =~  s|\..*||;      ## remove extension
    
    $fulFileName = "${templateDirectory}$fulFileName";
    
    my @outArray = split /\n/, $outString;
    my $msg = checkClasslistArray($Global::noOfFieldsInClasslist,\@outArray,'form');

    unless ($msg eq 'OK') {
        $msg .= "<BR>GO BACK AND CORRECT YOUR FORM. <BR>FILE NOT SAVED.";
        &wwerror("$0","$msg","","", query_string());
    }    	
    ## now that we know the file has a valid format, we can save it
	
    &backupFile("$fulFileName");   ##make up to three backups
    my $gid = $Global::numericalGroupID;
    $gid = $Global::numericalGroupID;    ## hack to remove warning message about $Global::numericalGroupID used only once
    my $tmpFileName = "${fulFileName}.tmp";
    &createFile($tmpFileName, $Global::classlist_file_permission, $gid);
    open(CLASSLISTFH,">$tmpFileName")   or
      &wwerror("$0","Can't open $tmpFileName");
    print CLASSLISTFH "$outString";
    close CLASSLISTFH;
    move("$tmpFileName","$fulFileName") or
      &wwerror("$0","Can't save $fulFileName");
    &readWriteSuccess($fulFileName);
}

sub readWriteError {
    print"content-type:\n\n<H2>No changes made:  You are in read only mode</H2>\n";
    print "Use your browser's BacK Button to return to the previous page or<BR>";
    print "<FORM METHOD=POST ACTION=\"${cgiURL}profClasslist.pl\"><P>";
    print &sessionKeyInputs(\%inputs);
    print <<"ENDOFHTML";
    <INPUT TYPE=SUBMIT VALUE="Return to Classlist Page">
    </FORM>
ENDOFHTML
    print &htmlBOTTOM("profFormEditClasslistFiles.pl", \%inputs);
}

sub readWriteSuccess {
  my ($savedFile) = @_;
  print"content-type:\n\n<H2>Success, file saved. </H2>\n";
  print "The contentsof your page have been saved in the file:<BR>$savedFile";
    
  print "<FORM METHOD=POST ACTION=\"${cgiURL}profClasslist.pl\"><P>";
  print &sessionKeyInputs(\%inputs);
print <<"ENDOFHTML";
<INPUT TYPE=SUBMIT VALUE="Return to Classlist Page">
</FORM>
ENDOFHTML
  print &htmlBOTTOM("profFormEditClasslistFiles.pl", \%inputs);
}

sub duplicateLastRow {
    my ($inputsref) = @_;
    my $inString = &htmlForm2delim($inputsref);
# print "$inString";
	my @inArray = split("\n",$inString);
	my $row = $inArray[$#inArray];	
	push @inArray, $row;			
    &createFormFromDelimitedArray(\@inArray,$fileName);
    exit;
}

sub addEmptyRow {
    my ($inputsref) = @_;
    my $inString = &htmlForm2delim($inputsref);
# print "$inString";
	my @inArray = split("\n",$inString);
	my $row = $inArray[$#inArray];	
	$row =~ s|[^,]*?,|,|g;
	$row =~ s|,[^,]*|,|g;	
	push @inArray, $row;			
    &createFormFromDelimitedArray(\@inArray,$fileName);
    exit;
}

sub deleteLastRow {
    my ($inputsref) = @_;
    my $inString = &htmlForm2delim($inputsref);
#print "$inString";
	my @inArray = split("\n",$inString);
	pop @inArray;				
    &createFormFromDelimitedArray(\@inArray,$fileName);
    exit;
}



sub printTopOfForm {
    print "content-type: text/html \n\n" ;
    
    # print navigation buttons
    print qq!
    <A HREF="${cgiURL}profClasslist.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}">
    <IMG SRC="${Global::upImgUrl}" align="right" BORDER=1 ALT="[Up]"></A><p>
    !;
    &printSubmitButtons;

}

sub printSubmitButtons {
    print <<EOF;
		<FORM METHOD = "POST" ACTION= "${cgiURL}profFormEditClasslistFiles.pl">
		<INPUT TYPE="SUBMIT" NAME = "action" VALUE='saveToFile'>
		<INPUT TYPE="SUBMIT" NAME = "action" VALUE='duplicateLastRow'>
		<INPUT TYPE="SUBMIT" NAME = "action" VALUE='addEmptyRow'>
		<INPUT TYPE="SUBMIT" NAME = "action" VALUE='deleteLastRow'>
		<INPUT TYPE="RESET" VALUE = "Reset Form"> <BR>
        <INPUT TYPE="radio" CHECKED NAME="readWrite" VALUE="readOnly" > Read Only Mode for saveToFile <BR>
        <INPUT TYPE="radio" NAME="readWrite" VALUE="readWrite"> Read/Write Mode for saveToFile<BR> 
        <strong>Changes are not saved until the "saveToFile" button is pressed and you see the message "Success, file saved".</strong><BR>

EOF
}

sub printBottomOfForm {
   print <<EOF;
         <INPUT TYPE="HIDDEN" NAME="user" VALUE="$inputs{'user'}">
         <INPUT TYPE="HIDDEN" NAME="key" VALUE="$inputs{'key'}">
         <INPUT TYPE="HIDDEN" NAME="course" VALUE="$inputs{'course'}">
         <INPUT TYPE="HIDDEN" NAME="fileName" VALUE="$fileName">
         </FORM>
EOF
print &htmlBOTTOM("profFormEditClasslistFiles.pl", \%inputs);
}


