#!/usr/bin/perl
package EcCurationPage;

#######################################################################
##### Author :	Shuai Weng
##### Date   :  June 2001
##### Description : This package contains all necessary methods for 
#####               dictyBase curators to enter, update or delete expression 
#####               connection info in oracle database. 
#####              
#######################################################################
use strict;
use DBI;
use CGI qw/:all/;
use CGI::Carp qw(fatalsToBrowser);
use lib "/usr/local/dicty/www_dictybase/db/lib/common";
use Login qw (ConnectToDatabase);
use TextUtil qw( DeleteUnwantedChar );
use lib "/usr/local/dicty/www_dictybase/db/lib/dictyBase";
use dictyBaseCentralMod qw(:formatPage :getInfo :logInfo);
use lib "/usr/local/dicty/www_dictybase/db/lib/dictyBase/Objects";
use Expression_connection;
use ConfigURLdictyBase;
use Delete_log;
use Update_log;

#######################################################################
#################### global variables #################################
#######################################################################

my $dbh;
my $dblink;
my $configUrl;

#######################################################################
sub new {      ############ constructor ###############################
#######################################################################
       
	my ($self, %args) = @_;

	$self = {};
	bless $self;

      	$self->{'_database'} = $args{'database'};
	$self->{'_help'}     = defined($args{'help'}) ? 
	                       $args{'help'} : "";
	$self->{'_title'}    = defined($args{'title'}) ? 
	                       $args{'title'} : "Expression Connection Curation Page";
	$self->{'_user'}     = defined($args{'user'}) ? $args{'user'} : "";
	$dbh = &ConnectToDatabase($self->database);
    	return $self;
}

sub help { $_[0]->{_help} }
sub database { $_[0]->{_database} }
sub title { $_[0]->{_title} }
sub user { $_[0]->{_user} }

######################################################################
sub DESTROY {   ############ destructor ##############################
######################################################################
    	if (defined $dbh) {
		$dbh->disconnect;
    	}
}

######################################################################
sub start{
######################################################################

    	my ($self) = @_;
	$configUrl = ConfigURLdictyBase->new;
	$dblink = $configUrl->dblink($self->database);
	if (!$self->user) {
	    print "location: ", $configUrl->dictyBaseCGIRoot, "$dblink/curatorLogin\n";
	    print "Content-type: text/html\n\n";
	    exit;
	}
	my ($dbuser, $dbpasswd) = &getUsernamePassword(uc($self->user),
						       $self->database);
	if (!$dbuser || !$dbpasswd) {
	    print "location: ", $configUrl->dictyBaseCGIRoot, "$dblink/curatorLogin\n";
	    print "Content-type: text/html\n\n";
	    exit;
	}
  	if (param('commit')) {
	    $dbh->disconnect;
	    $dbh = &ConnectToDatabase($self->database, $dbuser, $dbpasswd);
	    $self->commitInfo;
	}
	elsif (param('type') =~ /edit/i) {
	    $self->editInfo;
        }
	elsif (param('type') =~ /delete/i) {
	    $self->deleteInfo;
        }
	elsif (param('type') =~ /new/i) {
	    $self->enterInfo;
        }
        else {
	    $self->displayInfo;
        }
}

#######################################################################
sub displayInfo {
#######################################################################
        my ($self) = shift;

	&printStartPage($self->database, $self->title, $self->help);

	my $user = $self->user;

	print p, center(a({-href=>url."?user=$user&type=new"},
			  b("Enter new entry"))),p;
	my $deleteGif = $configUrl->dictyBaseImages."delete.gif";
	my $editGif = $configUrl->dictyBaseImages."edit.gif";
	my @tabRows;
	my $arrayRef = Expression_connection->GetECDetail(dbh=>$dbh);
	foreach my $rowRef (@$arrayRef) {
	    my ($ecNo, $name, $source, $title, $xblocksize, 
		$yblocksize, $xaxisTitle, $websiteUrl, $queryUrl, 
		$dateCreated, $createdBy) 
		= @$rowRef;
	    my $ec = Expression_connection->new(dbh=>$dbh,
						ec_no=>$ecNo);
	    my $timePoints = $ec->getTimePoints;
	    $xblocksize = $xblocksize || br;
	    $yblocksize = $yblocksize || br;
	    $xaxisTitle = $xaxisTitle || br;
	    $websiteUrl = $websiteUrl || br;
	    $queryUrl = $queryUrl || br;
	    my $images = a({-href=>url."?user=$user&ecNo=$ecNo&type=delete"},
			   img({-src=>"$deleteGif",
				-width=>"20",
				-height=>"20",
				-border=>"0",
				-alt=>'Delete'})).
		         a({-href=>url."?user=$user&ecNo=$ecNo&type=edit"},
			   img({-src=>"$editGif",
				-width=>"20",
				-height=>"20",
				-border=>"0",
				-alt=>'Edit'}));
	    
	    my $innerRows;
	    if ($xblocksize) {
		if ($yblocksize) {
		    $innerRows = td({-bgcolor=>'#b7d8e4'}, "X_blocksize").
			         td({-colspan=>'2'}, $xblocksize);
		}
		else {
		    $innerRows = td({-bgcolor=>'#b7d8e4'}, "X_blocksize").
			         td({-colspan=>'5'}, $xblocksize);
		}
	    }
	    if ($yblocksize) {
		if ($innerRows) {
		    $innerRows .= td({-bgcolor=>'#b7d8e4'}, 
				     "Y_blocksize").
				  td({-colspan=>'2'}, $yblocksize);
		}
		else {
		    $innerRows .= td({-bgcolor=>'#b7d8e4'}, 
				     "Y_blocksize").
				  td({-colspan=>'5'}, $yblocksize);
		}
	    }
	    if ($innerRows) { $innerRows = Tr($innerRows); }
	    if ($xaxisTitle) {
		$innerRows .= Tr(td({-bgcolor=>'#b7d8e4'}, 
				     "Xaxis_Title").
				 td({-colspan=>'5'}, $xaxisTitle));
	    }
	    if ($websiteUrl) {
		$innerRows .= Tr(td({-bgcolor=>'#b7d8e4'}, 
				     "Website_Url").
				 td({-colspan=>'5'}, $websiteUrl));
	    }
	    if ($queryUrl) {
		$innerRows .= Tr(td({-bgcolor=>'#b7d8e4'}, 
				     "Query_Url").
				 td({-colspan=>'5'}, $queryUrl));
	    }
	    if ($timePoints) {
		$innerRows .= Tr(td({-bgcolor=>'#b7d8e4'}, 
				     "Time Points").
				 td({-colspan=>'5'}, $timePoints));
	    }
	    my $table = table({-border=>'1',
			       -width=>'750',
			       -cellpadding=>'2',
			       -cellspacing=>'1'},
			      Tr(td({-width=>'50', 
				     -bgcolor=>'#a4abc2'},
				    $images). 
				 td({-width=>'700'},
				    table({-width=>"100%",
					   -border=>'1',
					   -cellspacing=>'1',
					   -cellpadding=>'2'},
					  Tr(td({-width=>'100',
						 -bgcolor=>'#b7d8e4'},
						"EC_NO").
					     td({-bgcolor=>'#d8d8d8'}, 
						$ecNo).
					     td({-bgcolor=>'#b7d8e4'},
						"Name").
					     td({-bgcolor=>'#d8d8d8'},
						$name).
					     td({-bgcolor=>'#b7d8e4'},
						"Source").
					     td({-bgcolor=>'#d8d8d8'},
						$source)
		                          ).
					  Tr(td({-bgcolor=>'#b7d8e4'},
						"Title").
					     td({-colspan=>'9'},
						$title) 
					  ).
					  $innerRows.
					  Tr(td({-bgcolor=>'#b7d8e4'},
						"Date Created").
					     td({-colspan=>'2',
						 -bgcolor=>'#d8d8d8'},
						$dateCreated).
					     td({-bgcolor=>'#b7d8e4'},
						"Created By").
					     td({-colspan=>'2',
						 -bgcolor=>'#d8d8d8'},
						$createdBy)
					  )
				    )
				 )
			      )
			);
	    push(@tabRows, Tr(td($table)));
	    push(@tabRows, Tr(td({-colspan=>'8'},br)));
	}

	print center(table({-border=>0}, @tabRows));

	&printEndPage;
}

#######################################################################
sub enterInfo {
#######################################################################
        my ($self) = shift;

	&printStartPage($self->database, $self->title, $self->help);

        print p, b(font({-size=>'+2'},"Enter the new expression connection entry below.")),p;
		
	print 
	    startform,
	    hidden(-name=>'user',
		   -value=>$self->user),
	    hidden(-name=>'type',
		   -value=>'new');
	$self->printEntryBox;
	print p,
	    submit(-name=>'commit', 
		   -value=>'Submit'),
	    endform;      

	&printEndPage;
}

#######################################################################
sub editInfo {
#######################################################################
        my ($self) = shift;

	&printStartPage($self->database, $self->title, $self->help);

	my $ec = Expression_connection->new(dbh=>$dbh,
					    ec_no=>param('ecNo'));
	print p, b(font({-size=>'+2'},"Edit the expression connection info below.")),p;

	print 
	    startform,
	    hidden(-name=>'ecNo', 
		   -value=>param('ecNo')),
	    hidden(-name=>'user', 
		   -value=>$self->user),
 	    hidden(-name=>'type', 
		   -value=>'edit');
	$self->printEntryBox($ec->name, $ec->source, $ec->title, 
			     $ec->x_blocksize,$ec->y_blocksize,
			     $ec->xaxis_title, $ec->website_url, 
			     $ec->query_url, $ec->getTimePoints);
	$self->printLogBox("Update log comments");
	print submit(-name=>'commit', 
		   -value=>'Submit'),
	      endform, p;   

	&printEndPage;
}


#######################################################################
sub deleteInfo {
#######################################################################
        my ($self) = shift;

	&printStartPage($self->database, $self->title, $self->help);

	my $ec = Expression_connection->new(dbh=>$dbh,
					    ec_no=>param('ecNo'));

	print p, b(font({-size=>'+2'},"Click 'Delete' to delete this expression connection entry from database.")), p; 

	print 
	    startform,
	    hidden(-name=>'user', 
		   -value=>$self->user),
	    hidden(-name=>'ecNo', 
		   -value=>param('ecNo')),
 	    hidden(-name=>'type', 
		   -value=>'delete');
	$self->printEntryBox($ec->name, $ec->source, $ec->title, 
			     $ec->x_blocksize, $ec->y_blocksize,
			     $ec->xaxis_title, $ec->website_url, 
			     $ec->query_url, $ec->getTimePoints, 
			     "delete");
	$self->printLogBox("Delete log comments");
	print p,
	    submit(-name=>'commit', 
		   -value=>'Delete'),
	    endform;  
	&printEndPage;
}

########################################################################
sub commitInfo {
########################################################################
    my ($self) = shift;
    &printStartPage($self->database, $self->title, $self->help);
    ##################
    if (param('type') =~ /edit/i) {
	$self->DoUpdate;
    }
    elsif (param('type') =~ /delete/i) {
	$self->DoDelete;
    }
    elsif (param('type') =~ /new/i) {
	$self->DoInsert;
    }
    ##################
    print p, b("Return to ".a({-href=>$configUrl->dictyBaseCGIRoot."$dblink/curatorLogin?user=".$self->user}, "dictyBase Curator Central")), br;
    ##################

    ##################
    &printEndPage;
    ##################         
}

#######################################################################
sub DoUpdate {
#######################################################################
    my ($self) = @_;
    my $ecNo = param('ecNo');
    my $name = param('name');
    my $source = param('source');
    my $title = param('title');
    my $xblocksize = param('xblocksize');
    my $yblocksize = param('yblocksize');
    my $xaxisTitle = param('xaxisTitle');
    my $websiteUrl = param('websiteUrl');
    my $queryUrl = param('queryUrl');
    my $timePoints = param('timePoints');

    &DeleteUnwantedChar(\$name);
    &DeleteUnwantedChar(\$source);
    &DeleteUnwantedChar(\$title);
    &DeleteUnwantedChar(\$xblocksize);
    &DeleteUnwantedChar(\$yblocksize);
    &DeleteUnwantedChar(\$xaxisTitle);
    &DeleteUnwantedChar(\$websiteUrl);
    &DeleteUnwantedChar(\$queryUrl);
    &DeleteUnwantedChar(\$timePoints);
    $timePoints	=~ s/ //g;       
    my $log = param('log');
 
    &DeleteUnwantedChar(\$log);
           
    my $ec = Expression_connection->new(dbh=>$dbh,
					ec_no=>$ecNo);
    
    my $timePointsDB = $ec->getTimePoints;
    $timePointsDB =~ s/ //g;
    my (@oldVal, @newVal, @colNm);
    if ($name ne $ec->name) { 
	$ec->updateName($name);
	push(@oldVal, $ec->name);
	push(@newVal, $name);
	push(@colNm, "NAME");
    }
    if ($source ne $ec->source) { 
	$ec->updateSource($source);
	push(@oldVal, $ec->source);
	push(@newVal, $source);
	push(@colNm, "SOURCE");
    }
    if ($title ne $ec->title) { 
	$ec->updateTitle($title);
	push(@oldVal, $ec->title);
	push(@newVal, $title);
	push(@colNm, "TITLE");
    }
    if ($xblocksize ne $ec->x_blocksize) {
	$ec->updateX_blocksize($xblocksize);
	push(@oldVal, $ec->x_blocksize);
	push(@newVal, $xblocksize);
	push(@colNm, "X_BLOCKSIZE");
    }
    if ($yblocksize ne $ec->y_blocksize) {
	$ec->updateY_blocksize($yblocksize);
	push(@oldVal, $ec->y_blocksize);
	push(@newVal, $yblocksize);
	push(@colNm, "Y_BLOCKSIZE");
    }
    if ($xaxisTitle ne $ec->xaxis_title) {
	$ec->updateXaxis_title($xaxisTitle);
	push(@oldVal, $ec->xaxis_title);
	push(@newVal, $xaxisTitle);
	push(@colNm, "XAXIS_TITLE");
    }
    if ($websiteUrl ne $ec->website_url) {
	$ec->updateWebsite_url($websiteUrl);
	push(@oldVal, $ec->website_url);
	push(@newVal, $websiteUrl);
	push(@colNm, "WEBSITE_URL");
    }
    if ($queryUrl ne $ec->query_url) {
	$ec->updateQuery_url($queryUrl);
	push(@oldVal, $ec->query_url);
	push(@newVal, $queryUrl);
	push(@colNm, "QUERY_URL");
    }
    if (@oldVal) {
	eval { $ec->enterUpdates; };
	if ($@) {
	    print "An error occurred:$@", br;
	    $dbh->rollback;
	}
	else {
	    $dbh->commit;
	    print "The expression_connection table has been updated.", br;
	    if ($log) {
		for (my $i = 0; $i <= $#colNm; $i++) {
		    my $ulog = Update_log->new(dbh=>$dbh,
					       tab_name=>'EXPRESSION_CONNECTION',
					       col_name=>$colNm[$i],
					       primary_key=>$ecNo,
					       old_value=>$oldVal[$i],
					       new_value=>$newVal[$i]);
		    $ulog->updateDescription($log);
		    eval { $ulog->enterUpdates($self->user);};
		    if ($@) {
			print "An error occurred when updating update_log table.$@", br;
			$dbh->rollback;
		    }
		    else {
			$dbh->commit;
			print "The update log comment for updating $colNm[$i] has been inserted into update_log table.",p;
		    }
		}
	    }
	}
    }
    if ($timePoints ne $timePointsDB) {
	eval { 
	    $ec->deleteTimePoints;
	    Expression_connection->InsertECPoints(dbh=>$dbh,
						  ec_no=>$ecNo,
						  timePoints=>$timePoints);
	};
        if ($@) {
	    print "An error occurred when updating ec_point table: $@",br;
	}
	else {
	    $dbh->commit;
	    print "The ec_point entry has been updated in database.", p;
	}
    }

}

#######################################################################
sub DoDelete {
#######################################################################
    my ($self) = @_;
    my $ecNo = param('ecNo');
    my $log = param('log');
    &DeleteUnwantedChar(\$log);
    ##################

    my $ec = Expression_connection->new(dbh=>$dbh,
					ec_no=>$ecNo);
    
    my $deletedRow = $ec->getRow;
    
    eval { $ec->delete; };

    if ($@) {
	print "An error occurred: $@",br;
	$dbh->rollback;
    }
    else {
	$dbh->commit;
        print "The expression_connection entry for ec_no = $ecNo has been deleted from expression_connection table.", p;
	if ($log) {
	    my $dlog = Delete_log->new(dbh=>$dbh,
				       tab_name=>'EXPRESSION_CONNECTION',
	    			       deleted_row=>$deletedRow);
	    
	    $dlog->updateDescription($log);
	    eval { $dlog->enterUpdates($self->user); };
	    if ($@) {
	    	print "An error occurred when updating the delete_log table: $@", br;
	    	$dbh->rollback;
	    }
	    else {
	    	$dbh->commit;
	    	print "The delete log has been inserted into delete_log table.", br;
	    }
	}
    }
}

#######################################################################
sub DoInsert {
#######################################################################
    my ($self) = @_;
    
    my $name = param('name');
    my $source = param('source');
    my $title = param('title');
    my $xblocksize = param('xblocksize');
    my $yblocksize = param('yblocksize');
    my $xaxisTitle = param('xaxisTitle');
    my $websiteUrl = param('websiteUrl');
    my $queryUrl = param('queryUrl');
    my $timePoints = param('timePoints');
    &DeleteUnwantedChar(\$name);
    &DeleteUnwantedChar(\$source);
    &DeleteUnwantedChar(\$title);
    &DeleteUnwantedChar(\$xblocksize);
    &DeleteUnwantedChar(\$yblocksize);
    &DeleteUnwantedChar(\$xaxisTitle);
    &DeleteUnwantedChar(\$websiteUrl);
    &DeleteUnwantedChar(\$queryUrl);
    &DeleteUnwantedChar(\$timePoints);
    $timePoints =~ s/ //g;
    
    eval{ 
	Expression_connection->Insert(dbh=>$dbh,
				      literals=>{ec_no=>'CGM_DDB.ecno_seq.nextval'},
				      binds=>{name=>$name,
					     source=>$source,
					     title=>$title,
					     x_blocksize=>$xblocksize,
					     y_blocksize=>$yblocksize,
					     xaxis_title=>$xaxisTitle, 
					     website_url=>$websiteUrl, 
					     query_url=>$queryUrl});
    };
 
    if ($@) {
	print "An error occurred: $@",br;
	$dbh->rollback;
    }
    else {
	$dbh->commit;
        print "The new entry has been inserted into expression_connection table.", p;
    
	my $order;

	eval { 
	    Expression_connection->InsertECPoints(dbh=>$dbh,
					      timePoints=>$timePoints);
	};
	if ($@) {
	    print "An error occurred when inserting ec_point entries: $@",br;
	}
	else {
	    $dbh->commit;
	    print "The ec_point entries have been inserted into database.", p;
	}
    }
} 

#######################################################################
sub printEntryBox{
########################################################################
    my ($self, $name, $source, $title, $xblocksize, $yblocksize, 
	$xaxisTitle, $websiteUrl, $queryUrl, $timePoints, $delete) 
	= @_;
    my $rows;
    if ($delete) {
	$xblocksize = $xblocksize || br;
	$yblocksize = $yblocksize || br;
	$xaxisTitle = $xaxisTitle || br;
	$websiteUrl = $websiteUrl || br;
	$queryUrl = $queryUrl || br;
	$rows = Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Dataset Name").
		   td(font({-size=>"+1"}, $name))).
	        Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Source").
		   td(font({-size=>"+1"}, $source))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Title").
		   td(font({-size=>"+1"}, $title))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "X_Blocksize").
		   td(font({-size=>"+1"}, $xblocksize))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Y_Blocksize").
		   td(font({-size=>"+1"}, $yblocksize))).       
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Xaxis_Title").
		   td(font({-size=>"+1"}, $xaxisTitle))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Website_Url").
		   td(font({-size=>"+1"}, $websiteUrl))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Query_Url").
		   td(font({-size=>"+1"}, $queryUrl))).     
	        Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Time_Points").
		   td(font({-size=>"+1"}, $timePoints)));
		     
    }
    else {
	$rows = Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Dataset Name").
		   td(start_form().
		      textfield(-name=>'name',
				-value=>"$name",
				-size=>60))).
	        Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Source").
		   td(textfield(-name=>'source',
			       -value=>"$source",
			       -size=>60))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Title").
		   td(textfield(-name=>'title',
			       -value=>"$title",
			       -size=>60))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "X_Blocksize").
		   td(textfield(-name=>'xblocksize',
			       -value=>"$xblocksize",
			       -size=>60))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Y_Blocksize").
		   td(textfield(-name=>'yblocksize',
			       -value=>"$yblocksize",
			       -size=>60))).		   
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Xaxis_Title").
		   td(textfield(-name=>'xaxisTitle',
			       -value=>"$xaxisTitle",
			       -size=>60))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Website_Url").
		   td(textfield(-name=>'websiteUrl',
			       -value=>"$websiteUrl",
			       -size=>60))).
		Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Query_Url").
		   td(textfield(-name=>'queryUrl',
			       -value=>"$queryUrl",
			       -size=>60))).
	        Tr({-align=>'left'},
		   th({-bgcolor=>'#a4abc2'}, "Time_Points").
		   td(textfield(-name=>'timePoints',
			       -value=>"$timePoints",
			       -size=>60).br.
		      "(Separate by comma, i.e., 0, 9.5, 11.5, 13.5, 15.5, 18.5, 20.5)"));     
    }
    print table({-width=>650,
		 -border=>1,
		 -cellspacing=>1,
		 -cellpadding=>"+3",
		 -bordercolor=>'#BBBBEE',
		 -bordercolordark=>'#0000FF',
		 -bordercolorlight=>'#FFFFFF'},
 		$rows
	);

}

######################################################################
sub printLogBox {
######################################################################
    my ($self, $text) = @_;

    print table({-width=>650,
		 -border=>1,
		 -cellspacing=>1,
		 -cellpadding=>'+3',
		 -bordercolor=>'#BBBBEE',
		 -bordercolordark=>'#0000FF',
		 -bordercolorlight=>"#FFFFFF"},
   		Tr({-align=>'center'},
  		    th({-colspan=>4,
			-bgcolor=>"#CCCCCC"},
		       $text)),	
 		Tr({-align=>'left'},
 		    td({-colspan=>4},
		       start_form,
 		       textarea(-name=>'log',
				-rows=>3,
				-columns=>65)))
 	);
}

########################################################################
sub err_report {
########################################################################
    my ($self, $err) = @_;
    
    &printStartPage($self->database, $self->title, $self->help);
	
    print b($err);
    
    &printEndPage;
    $dbh->disconnect;
    exit;
}

########################################################################
1;
########################################################################



















