#!/usr/bin/perl
package Task;

#######################################################################
##### Author :	Shuai Weng
##### Date   :  Oct. 2000
##### Description : This package contains all necessary methods for dictyBase
#####               curators to curate task info in oracle database. 
#####              
#######################################################################
use strict;
use DBI;
use CGI qw/:all :html3/;
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 Dbuser;
use ConfigURLdictyBase;

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

my $dbh;
my $dblink; 
my $configUrl = ConfigURLdictyBase->new;

#######################################################################
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'} : "Code 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(b(a({-href=>url."?user=$user&type=new"}, "Enter a New Task"))), p;

	my $colHeader = param('colHeader');
	if (!$colHeader) { $colHeader = 'TASK_NO';}
	$self->printTopForm($colHeader);
	my $filterBy = param('filterBy');
	my $start = param('start');
	if (!$start) { $start = 1; }
	my $deleteGif = $configUrl->dictyBaseImages.'delete.gif';
 	my $editGif = $configUrl->dictyBaseImages.'edit.gif';
 	my ($i, $stop, $end);
	my @tabRows;
 	my $arrayRef = $self->getTaskDetail($colHeader, $filterBy);
 	foreach my $rowRef (@$arrayRef) {
 	    $i++;
	    if ($i < $start) { next; }
	    if ($i >= $start + 50) {
		if (!$stop) { $stop = $i - 1;}
		next;
	    }
	    my ($taskNo, $taskNm, $status, $priority, $curator, $programmer, 
		$url, $desc, $comments, $showstoppers, $dateEntered,
		$dateModified) = @$rowRef;
	    $priority = $priority || br;
	    $curator = $curator || br;
	    $programmer = $programmer || br;
	    my $linkUrl;
	    if ($url =~ /^\~/) {
		$linkUrl = $configUrl->breadServerRoot.$url;
	    }
	    elsif ($url =~ /^http/) {
		$linkUrl = $url;
	    }
	    if ($linkUrl =~ /^http/) {
		$url = a({-href=>"$linkUrl",
			  -target=>'infowin'},
			 $url);
            }
	    my $images = a({-href=>url."?user=$user&taskNo=$taskNo&type=delete"},img({-src=>"$deleteGif",-width=>'20',-height=>'20',-border=>'0',-alt=>'Delete'})).a({-href=>url."?user=$user&taskNo=$taskNo&type=edit"},img({-src=>"$editGif",-width=>'20',-height=>'20',-border=>'0',-alt=>'Edit'}));

	    
	    my $innerRows;
	    if ($url) {
		$innerRows = Tr(td({-bgcolor=>'#b7d8e4'}, "URL").
				td({-colspan=>'9'}, $url));
	    }
	    if ($desc) {
		$innerRows .= Tr(td({-bgcolor=>'#b7d8e4'}, "Description").
				 td({-colspan=>'9'}, $desc));
	    }
	    if ($comments) {
		$innerRows .= Tr(td({-bgcolor=>'#b7d8e4'}, "Comments").
				 td({-colspan=>'9'}, $comments));
	    }
	    if ($showstoppers) {
		$innerRows .= Tr(td({-bgcolor=>'#b7d8e4'}, "Showstoppers").
				 td({-colspan=>'9'}, $showstoppers));
            }
	    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'},
						"Task Number").
					     td({-bgcolor=>'#d8d8d8'}, 
						$taskNo).
					     td({-bgcolor=>'#b7d8e4'},
						"Priority").
					     td({-bgcolor=>'#d8d8d8'},
						$priority).
					     td({-bgcolor=>'#b7d8e4'},
						"Status").
					     td({-bgcolor=>'#d8d8d8'},
						$status).
					     td({-bgcolor=>'#b7d8e4'},
						"Curator").
					     td({-bgcolor=>'#d8d8d8'},
						$curator).
					     td({-bgcolor=>'#b7d8e4'},
						"Programmer").
					     td({-bgcolor=>'#d8d8d8'},
						$programmer)
		                          ).
					  Tr(td({-bgcolor=>'#b7d8e4'},
						"Name").
					     td({-colspan=>'9'},
						$taskNm) 
					  ).
					  $innerRows.
					  Tr(td({-bgcolor=>'#b7d8e4'},
						"Date Entered").
					     td({-colspan=>'4',
						 -bgcolor=>'#d8d8d8'},
						$dateEntered).
					     td({-colspan=>'3',
						 -bgcolor=>'#b7d8e4'},
						"Date Modified").
					     td({-colspan=>'3',
						 -bgcolor=>'#d8d8d8'},
						$dateModified)
					  )
				    )
				 )
			      )
			);
	    push(@tabRows, Tr($table));
	    push(@tabRows, Tr(td({-colspan=>'8'},br)));
 	}
	$end = $i;
	if (!$stop) { $stop = $end; }
	$self->printPrevNext($start, $stop, $end, $colHeader, $filterBy);
	print center(table({-border=>0}, @tabRows));
	$self->printPrevNext($start, $stop, $end, $colHeader, $filterBy);
	
	if (!$i) {
	    print p, center(b(font({-color=>'red'}, "There is no data available in task table."))), p;
        }
	&printEndPage;
}


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

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

	my $user = $self->user;
        print p, b(font({-size=>'+2'},"Enter a New Task:")),p;
		
	print 
	    startform.
	    hidden('user', "$user"),
 	    hidden('type', 'new');
	$self->printEntryBox();
	print p,
	    submit('commit', 'Submit'),
	    endform;      

	&printEndPage;
}


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

	&printStartPage($self->database, $self->title, $self->help);
	my $user = $self->user;
	my $taskNo = param('taskNo');
	print p, b(font({-size=>'+2'},"Edit the task:")),p;
	$self->getTaskInfo($taskNo);

	print startform;
	$self->printEntryBox();
	print 
	    hidden('taskNo', "$taskNo"),
	    hidden('user', "$user"),
 	    hidden('type', 'edit'),
	    submit('commit', 'Submit'),
	    endform, p;   
	print a({-href=>url."?user=$user"}, 
		b("Back to Task Table Display"));
	&printEndPage;
}


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

	&printStartPage($self->database, $self->title, $self->help);
	my $taskNo = param('taskNo');
	my $user = $self->user;
	$self->getTaskInfo($taskNo);
	print p, b(font({-size=>'+2', color=>'red'},"Please confirm that you want to delete this task from the database.")), p; 
	print 
	    startform,
	    hidden('user', "$user"),
	    hidden('taskNo', "$taskNo"),
 	    hidden('type', 'delete');
	$self->printEntry4delete();
	# $self->printLogBox("Delete log comments");
	print p,
	    submit('commit', 'Confirm'),
	    endform;  
	print a({-href=>url."?user=$user"}, 
		b("Back to Task Table Display"));
	&printEndPage;
}

########################################################################
sub commitInfo {
########################################################################
    my ($self) = shift;
    &printStartPage($self->database, $self->title, $self->help);
    ##################

    my $type = param('type');
    if ($type =~ /edit/i) {
	$self->DoUpdate;
    }
    elsif ($type =~ /delete/i) {
	$self->DoDelete;
    }
    elsif ($type =~ /new/i) {
	$self->DoInsert;
    }
    ##################
    my $user = $self->user;
    print a({-href=>url."?user=$user"}, 
		b("Return to Task Table Display")), p;
    print a({-href=>$configUrl->dictyBaseCGIRoot.'$dblink/curatorLogin?user=$user'}, b("Return to dictyBase Curator Central"));
    ##################
    
    ##################
    &printEndPage;
    ##################         
}

#######################################################################
sub DoUpdate {
#######################################################################
    my ($self) = @_;
    my $taskNo = param('taskNo');
    my $log = param('log');
    my $taskNm = param('taskNm');

    $self->getTaskInfo($taskNo);

    &DeleteUnwantedChar(\$log);
    &DeleteUnwantedChar(\$taskNm);

    if ($taskNm ne $self->{'_taskNm'}) {
	my $newTaskNo = $self->getTaskNoBYtaskNm($taskNm);
	if ($newTaskNo) {
	    print "The new task name '<font color=red>$taskNm</font>' you want to update is already in database. Please go back, change the name and try again.<p>";
	    return;
	}
    }

    my $status = param('status');
    my $priority = param('priority');
    my $curator = param('curator');
    my $programmer = param('programmer');

    my $url = param('url');
    &DeleteUnwantedChar(\$url);

    my $desc = param('desc');
    &DeleteUnwantedChar(\$desc);

    my $comments = param('comments');
    &DeleteUnwantedChar(\$comments);

    my $showstoppers = param('showstoppers');
    &DeleteUnwantedChar(\$showstoppers);
    
    my $setStmt;
    if ($taskNm ne $self->{'_taskNm'}) {
	$taskNm =~ s/\'/\'\'/g;
	$setStmt = "name = '$taskNm'";
    }
    if ($status ne $self->{'_status'}) {
	$setStmt .= ", status = '$status'";
    }
    if ($priority != $self->{'_priority'}) {
	$setStmt .= ", priority = $priority";
    }
    if ($curator ne $self->{'_curator'}) {
	$setStmt .= ", curator = '$curator'";
    }
    if ($programmer ne $self->{'_programmer'}) {
	$setStmt .= ", programmer = '$programmer'";
    }
    if ($url ne $self->{'_url'}) {
	$url =~ s/\'/\'\'/g;
	$setStmt .= ", url = '$url'";
    }
    if ($desc ne $self->{'_desc'}) {
	$desc =~ s/\'/\'\'/g;
	$setStmt .= ", description = '$desc'";
    }
    if ($comments ne $self->{'_comments'}) {
	$comments =~ s/\'/\'\'/g;
	$setStmt .= ", comments = '$comments'";
    }
    if ($showstoppers ne $self->{'_showstoppers'}) {
	$showstoppers =~ s/\'/\'\'/g;
        $setStmt .= ", showstoppers = '$showstoppers'";
    }    
    $setStmt .= ", date_modified = sysdate";
    $setStmt =~ s/^\, //;
    if ($setStmt) {
	$dbh->do("
             UPDATE bert.task
             SET    $setStmt
             WHERE  task_no = $taskNo
        ");
	$dbh->commit;
	print "The task entry for task_no = $taskNo has been updated.<p>";
	if ($log) {
	    if ($taskNm ne $self->{'_taskNm'}) {
		&updateUpdateLog($dbh, "TASK", "name", $taskNo,
				 $self->{'_taskNm'}, $taskNm, $log);
		print "The update log comment for updating task name has been inserted into update_log table.", p;
	    }
	    if ($status ne $self->{'_status'}) {
		&updateUpdateLog($dbh, "TASK", "status", $taskNo,
				 $self->{'_status'}, $status, $log);
		print "The update log comment for updating task status has been inserted into update_log table.", p;
	    }
	    if ($priority ne $self->{'_priority'}) {
		&updateUpdateLog($dbh, "TASK", "priority", $taskNo,
				 $self->{'_priority'}, $priority, $log);
		print "The update log comment for updating task priority has been inserted into update_log table.", p; 
	    }
	    if ($curator ne $self->{'_curator'}) {
		&updateUpdateLog($dbh, "TASK", "curator", $taskNo,
				 $self->{'_curator'}, $curator, $log);
		print "The update log comment for updating task curator has been inserted into update_log table.", p;
	    }
	    if ($programmer ne $self->{'_programmer'}) {
		&updateUpdateLog($dbh, "TASK", "programmer", $taskNo,
				 $self->{'_programmer'}, $programmer, $log);
		print "The update log comment for updating task programmer has been inserted into update_log table.", p;
	    }
	    if ($url ne $self->{'_url'}) {
		&updateUpdateLog($dbh, "TASK", "url", $taskNo,
				 $self->{'_url'}, $url, $log);
		print "The update log comment for updating task url has been inserted into update_log table.", p;
	    }
	    if ($desc ne $self->{'_desc'}) {
		&updateUpdateLog($dbh, "TASK", "description", $taskNo,
				 $self->{'_desc'}, $desc, $log);
		print "The update log comment for updating task description has been inserted into update_log table.", p;
	    }
	    if ($comments ne $self->{'_comments'}) {
		&updateUpdateLog($dbh, "TASK", "comments", $taskNo,
				 $self->{'_comments'}, $comments, $log);
		print "The update log comment for updating task comments has been inserted into update_log table.", p;
	    }
	    if ($showstoppers ne $self->{'_showstoppers'}) {
		&updateUpdateLog($dbh, "TASK", "showstoppers", $taskNo,
				 $self->{'_showstoppers'}, $showstoppers,
				 $log);
		print "The update log comment for updating task showstoppers has been inserted into update_log table.", p;
	    }
	}
    }
}


#######################################################################
sub DoDelete {
#######################################################################
    my ($self) = @_;
    my $taskNo = param('taskNo');
    my $log = param('log');
    &DeleteUnwantedChar(\$log);
    
    ##################
    my $sth = $dbh->prepare("
         SELECT * 
         FROM   bert.task
         WHERE  task_no = ?
    ");
    $sth->execute($taskNo);
    my $deletedRow;
    while (my (@deletedRow) = $sth->fetchrow()) {
	$deletedRow = join("\t", @deletedRow);
    }
    ###################
    my $deleteStmt = $dbh->prepare("
         DELETE from bert.task
         WHERE  task_no = ?
    ");
    eval { $deleteStmt->execute($taskNo);};
    if ($@) {
	print "An error occurred: $@",br;
	$dbh->rollback;
    }
    else {
	$dbh->commit;
        print "The task entry for task_no = $taskNo has been deleted from task table.", p;
	if ($log) {
	    &updateDeleteLog($dbh, "TASK", $deletedRow, $log);
	    $dbh->commit;
	    print "The delete log has been inserted into delete_log table.<br>";
	}
    }

}

#######################################################################
sub DoInsert {
#######################################################################
    my ($self) = @_;
    my $taskNm = param('taskNm');
    my $taskNo = $self->getTaskNoBYtaskNm($taskNm);
    if ($taskNo) {
	print "The task name '<font color=red>$taskNm</font>' is already in database. Please go back, change the name and try again.<p>";
	return;
    }
    my $status = param('status');
    my $priority = param('priority');
    my $curator = param('curator');
    my $programmer = param('programmer');
    my $url = param('url');
    my $desc = param('desc');
    my $comments = param('comments');
    my $showstoppers = param('showstoppers');

    &DeleteUnwantedChar(\$taskNm);
    &DeleteUnwantedChar(\$url);
    &DeleteUnwantedChar(\$desc);
    &DeleteUnwantedChar(\$comments);
    &DeleteUnwantedChar(\$showstoppers);
    
    my $user = $self->user;
    $user = "\U$user";

    my $insertStmt = $dbh->prepare("
        INSERT INTO bert.task(task_no, name, status, priority, 
                      curator, programmer, url, description,
                      comments, showstoppers, created_by, 
                      modified_by, date_created, date_modified)
        VALUES(bert.taskno_seq.nextval,?,?,?,?,?,?,?,?,?,?,?,SYSDATE,SYSDATE)
    ");
    eval {$insertStmt->execute($taskNm, $status, $priority, $curator,
			       $programmer, $url, $desc, $comments, 
			       $showstoppers, $user, $user);};
    if ($@) {
	print "An error occurred: $@",br;
	$dbh->rollback;
    }
    else {
	$dbh->commit;
        print "The new task entry has been inserted into task table.", p;
    }

} 

########################################################################
sub printPrevNext {
########################################################################
    my($self, $start, $stop, $end, $colHeader, $filterBy) = @_;
    my ($preStart, $nextStart);
    if ($end > $stop+1) {
	$nextStart = $stop + 1;
    }
    if ($start > 1) {
	$preStart = $start - 50;
	if ($preStart < 1) { $preStart = 1; }
    }
    if (!$preStart && !$nextStart) { return; }
    print table({-width=>'96%',-border=>0,-cellspacing=>1,-align=>'CENTER',-bordercolor=>'#BBBBEE',-bordercolordark=>'#0000FF',-bordercolorlight=>'#FFFFFF'},
		$self->prevNext($preStart, $nextStart, $colHeader,$filterBy)
    );
}

########################################################################
sub prevNext {
########################################################################
    my ($self, $preStart, $nextStart, $colHeader, $filterBy) = @_;
    my $user = $self->user;
    if ($preStart && !$nextStart) {
	return Tr(td({-align=>'LEFT'},a({-href=>url."?user=$user&start=$preStart&colHeader=$colHeader&filterBy=$filterBy"},img=>({-src=>$configUrl->dictyBaseImages.'arr_next_uic_r.gif',-width=>'55',-height=>'18',border=>'0',-alt=>'Prev'})))
        );
    }
    elsif (!$preStart && $nextStart) {
	return Tr(td({-align=>'LEFT'},a({-href=>url."?user=$user&start=$nextStart&colHeader=$colHeader&filterBy=$filterBy"},img({-src=>$configUrl->dictyBaseImages.'arr_next_uic_r.gif',-width=>'55',-height=>'18',border=>'0',alt=>'Next'})))
        );
    }
    else {
	return Tr(td({-align=>'LEFT'},a({-href=>url."?user=$user&start=$preStart&colHeader=$colHeader&filterBy=$filterBy"},img({-src=>$configUrl->dictyBaseImages.'arr_prev_uoi_l.gif',-width=>'55',-height=>'18',-border=>'0',-alt=>'Prev'})),a({-href=>url."?user=$user&start=$nextStart&colHeader=$colHeader&filterBy=$filterBy"},img({-src=>$configUrl->dictyBaseImages.'arr_next_uic_r.gif',-width=>'55',-height=>'18',border=>'0',-alt=>'Next'})))
	);
    }
}

########################################################################
sub printTopForm {
########################################################################
    my ($self, $colHeader) = @_;
    my %typeLabels = ('TASK_NO'=>'Task_no',
		      'NAME'=>'Name',
		      'STATUS'=>'Status',
		      'PRIORITY'=>'Priority',
		      'CURATOR'=>'Curator',
		      'PROGRAMMER'=>'Programmer',
		      'URL'=>'URL',
                      'DESCRIPTION'=>'Description',
                      'COMMENTS'=>'Comments',
                      'SHOWSTOPPER'=>'Showstopper',
                      'DATE_MODIFIED'=>'Date_modified');
    my @typeValues = qw/TASK_NO NAME STATUS PRIORITY CURATOR PROGRAMMER URL DESCRIPTION COMMENTS SHOWSTOPPER DATE_CREATED/;
    my $defaultType = "$colHeader";
    my $user = $self->user;

    ########################
    print
    startform;
     
    print table({-border=>1,-cellspacing=>1,-align=>'CENTER',-bordercolor=>"#BBBBEE",-bordercolordark=>"#0000FF",-bordercolorlight=>"#FFFFFF"},
		      Tr({-align=>'CENTER'},[
			 th({-bgcolor=>"#a4abc2",-width=>650},"Task Table Display",br)]),
		      Tr({-align=>'LEFT'}, 
                      [
			 td("List Sorted by Column Header: ",
			 popup_menu(-name=>'colHeader',
				    -size=>-1,
				    -"values"=>\@typeValues,
				    -default=>$defaultType,
				    -labels=>\%typeLabels
				    ),
		         'List filtered (on Sort Header):',
			 textfield(-name=>'filterBy',
				   -size=>14,
				   -override=>1),
			 hidden(-name=>'user', -value=>"$user"),
			 submit(-name=>'Re-list', -value=>'Re-list'))
			 ])
	);
    print endform,br,br;


}

########################################################################
sub getTaskNoBYtaskNm {
########################################################################
    my ($self, $taskNm) = @_;
    $taskNm = "\U$taskNm";
    my $sth = $dbh->prepare("
         SELECT task_no
         FROM   bert.task
         WHERE  upper(name) = ?
    ");
    $sth->execute($taskNm);
    my $taskNo = $sth->fetchrow();
    return $taskNo;
}

########################################################################
sub getTaskInfo {
########################################################################
    my ($self, $taskNo) = @_;
    my $sth= $dbh->prepare("
        SELECT name, status, priority, curator, programmer, url, 
               description, comments, showstoppers
        FROM   bert.task
        WHERE  task_no = ?
    ");
    $sth->execute($taskNo);
    my ($taskNm, $status, $priority, $curator,$programmer, $url, 
        $description, $comments, $showstoppers) = $sth->fetchrow();
    $self->{'_taskNm'} = $taskNm;
    $self->{'_status'} = $status;
    $self->{'_priority'} = $priority;
    $self->{'_curator'} = $curator;
    $self->{'_programmer'} = $programmer;
    $self->{'_url'} = $url;
    $self->{'_description'} = $description;
    $self->{'_comments'} = $comments;
    $self->{'_showstoppers'} = $showstoppers;
}

########################################################################
sub getTaskDetail {
########################################################################
    my ($self, $colHeader, $filterBy) = @_;
    my $orderby = $colHeader;
    if ($orderby =~ /priority/i) {
	$orderby .= " desc";
    }
    my $sth;
    if ($filterBy) {
	$filterBy =~ s/\*/\%/g;
	$filterBy = "\U$filterBy";
	$sth = $dbh->prepare("
             SELECT task_no, name, status, priority, curator, programmer, 
                    url, description, comments, showstoppers, 
                    date_created, date_modified
             FROM   bert.task
             WHERE  upper($colHeader) like ?
             ORDER BY $orderby
        ");
	$sth->execute($filterBy);
    }
    else {
	$sth = $dbh->prepare("
             SELECT task_no, name, status, priority, curator, programmer,
                    url, description, comments, showstoppers, 
                    date_created, date_modified
             FROM   bert.task
             ORDER BY $orderby
        ");
	$sth->execute;
    }
    my $arrayRef = $sth->fetchall_arrayref();
    return $arrayRef;
}

########################################################################
sub tableHeader {
########################################################################
    return
	Tr({-align=>'LEFT'},
	   th({-width=>'8%',-align=>'CENTER'},
	      font({-size=>'3'},strong(['Del/Edit']))),
           th({-width=>'5%',-align=>'CENTER'},
	      font({-size=>'3'},strong(['Task_no']))),
	   th({-width=>'10%',-align=>'CENTER'},
	      font({-size=>'3'},strong(['Name']))),
	   th({-width=>'10%',-align=>'CENTER'},
	      font({-size=>'3'},strong(['Status']))),
	   th({-width=>'5%',-align=>'CENTER'},
	      font({-size=>'3'},strong(['Priority']))),
	   th({-width=>'8%',-align=>'CENTER'},
              font({-size=>'3'},strong(['Curator']))),
           th({-width=>'8%',-align=>'CENTER'},
	      font({-size=>'3'},strong(['Programmer']))),
	   th({-width=>'10%',-align=>'CENTER'},
	      font({-size=>'3'},strong(['URL']))),
	   th({-width=>'10%',-align=>'CENTER'},
	      font({-size=>'3'},strong(['Description']))),
	   th({-width=>'10%',-align=>'CENTER'},
	      font({-size=>'3'},strong(['Comments']))),
           th({-width=>'10%',-align=>'CENTER'},
              font({-size=>'3'},strong(['Showstoppers']))),
           th({-width=>'5%',-align=>'CENTER'},
              font({-size=>'3'},strong(['Date_Modified'])))
     );
}


#######################################################################
sub oneRow {
#######################################################################
    my ($self, $one, $two, $essential) = @_;
    my $color;
    if (!$essential){
	$color = "#b7d8e4";
    }
    else{
	$color = "#a4abc2";
    }
    if (param('type') =~ /delete/i) {
	if (!$two) { $two = "<br>"; }
	return (th({-bgcolor=>$color},
		   $one).td({-bgcolor=>'#d8d8d8'}, $two));
    }
    else {
	return (th({-bgcolor=>$color},
		   $one).td($two));
    }
}

#######################################################################
sub printEntryBox{
########################################################################
    my ($self) = @_;

    my @curators = ("");
    my @programmers = ("");

    my $arrayRef = Dbuser->GetDbuserDetail(dbh=>$dbh);
    foreach my $rowRef (@$arrayRef) {
	my ($userid, $fname, $lname, $status, $email) = @$rowRef;
	if ($userid =~ /^OTTO/i || $status !~ /^current/i) { next; }
	push(@curators, $userid);
	push(@programmers, $userid);
    }

    print
	table(Tr([     
	     $self->oneRow("Task Name", 
		     textfield(-name=>'taskNm',
			       -value=>$self->{'_taskNm'},
			       -size=>60), 1),
	     $self->oneRow("Status", 
		     popup_menu(-name=>'status',
				-"values"=>['Unassigned', 'In progress', 'Done'],
				-default=>$self->{'_status'}), 1),
	     $self->oneRow("Priority", 
		     popup_menu(-name=>'priority',
				-"values"=>['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
				-default=>$self->{'_priority'})."&nbsp(9 is highest, 0 is lowest)"),

	     $self->oneRow("Curator", 
		     popup_menu(-name=>'curator',
				-"values"=>\@curators,
				-default=>$self->{'_curator'})),
	      
	     $self->oneRow("Programmer", 
		     popup_menu(-name=>'programmer',
				-"values"=>\@programmers,
				-default=>$self->{'_programmer'})),

	     $self->oneRow("URL", 
		     textfield(-name=>'url',
			       -size=>60,
			       -default=>$self->{'_url'})),

	     $self->oneRow("Description", 
		     textarea(-name=>'desc',
			      -rows=>4,
			      -cols=>60,
			      -wrap=>'virtual',
			      -value=>$self->{'_description'}), 1),
	      
	     $self->oneRow("Comments", 
		     textarea(-name=>'comments',
			      -rows=>6,
			      -cols=>60,
			      -wrap=>'virtual',
			      -value=>$self->{'_comments'})),

	     $self->oneRow("Show Stoppers", 
		     textarea(-name=>'showstoppers',
			      -rows=>4,
			      -cols=>60,
			      -wrap=>'virtual',
			      -value=>$self->{'_showstoppers'}))

       ]));
 
}


#######################################################################
sub printEntry4delete{
########################################################################
    my ($self) = @_;

    print
	table(Tr([     
	     $self->oneRow("Task Name", $self->{'_taskNm'}, 1),
	     $self->oneRow("Status", $self->{'_status'}, 1),
	     $self->oneRow("Priority", $self->{'_priority'}),
	     $self->oneRow("Curator", $self->{'_curator'}),
	     $self->oneRow("Programmer", $self->{'_programmer'}),
	     $self->oneRow("URL", $self->{'_url'}),
	     $self->oneRow("Description", $self->{'_description'}, 1),
	     $self->oneRow("Comments", $self->{'_comments'}),
	     $self->oneRow("Show Stoppers", $self->{'_showstoppers'})
       ]));
 
}


######################################################################
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=>72)))
 	);
}

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

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



















