#!@@_perl_root_@@/bin/perl.exe 
package GetSeq;

##########################################################
#                                                        #
# dictyBase Extension of GetSeq                          #
#                                                        #
##########################################################

use GetSeq_base;

BEGIN { %GetSeq:: = %GetSeq_base:: }

#
#  had to change GetSeq_base to use 2 argument bless in order to extend (add new method)
#
#

#
#
#  returns plan text sequence (called by cgi-bin/dictyBase/getSeq_raw
#
#

######################################################################
sub start_RAW{
######################################################################

    	my ($self) = @_;

	$configUrl = ConfigURLdictyBase->new;
	$dblink = $configUrl->dblink($self->database);
	
	if (!$self->{'_query'} && !$self->{'_chr'}) {
	    $self->printEntryForm;
	    exit;
	}
	$dbh = &ConnectToDatabase($self->database);
 
	$self->setVariables;

	$self->setTitle;
        $self->setSeqType;
    print header;
    $self->getSequence;
	exit;
}

sub printDifferentFormat{return "";}



#
# took out a bunch of links
#
#
########################################################################
sub printLinks {
########################################################################
    my ($self) = @_;

    my $query;
    my $restrictionQuery;

    if ($self->{'_kind'} =~ /^feature/i) {

       my $suffix = 'nuc';
       $suffix = 'prot' if (($self->{'_map'} eq 'pmap') ||
                         ($self->{'_map'} eq 'p2map') ||
                         ($self->{'_map'} eq 'p3map'));

       $query = "?name=".$self->{'_seqname'}."&suffix=$suffix";
       $restrictionQuery="?locus=".$self->{'_seqname'};
    }


    if (($self->{'_kind'} =~ /^cds/i) || ($self->{'_kind'} =~ /^gb/i)) {
       $query = "?id=".$$;
       $restrictionQuery="?id=" . $$;
 
    }


    if (($self->{'_chr'}) || ($self->{'_kind'} =~ /^clone/i)) {
       
       $restrictionQuery = "?chr=" .$self->{'_chrnum'} ."&beg=" 
       .$self->{'_beg'} .
       "&end=" . $self->{'_end'} . "&rev=" . $self->{'_rev'};
    }

    print p, center(a({-href=>$configUrl->dictyBaseCGIRoot."$dblink/suggestion",
                       -target=>'infowin'},
                      "Send questions or suggestions to dictyBase")), p;

    if (($self->{'_chr'}) || ($self->{'_kind'} =~ /^clone/i)) {
       print "Temporary problem with analysis forms: For a very short time the sequence below will not be automatically included within the analysis forms. Please copy the sequence below and paste it into the forms. ", p;
    }


#   my $link = a({-href=>$configUrl->DictyosteliumServerRoot."cgi-bin-dev/dictyBase/nph-blast2dictyBase$query", -target=>'infowin'}, "BLAST search")." | ".
#               a({-href=>$configUrl->DictyosteliumServerRoot."cgi-bin-dev/dictyBase/nph-fastadictyBase$query", -target=>'infowin'}, "FASTA search");

   my $link = a({-href=>$configUrl->DictyosteliumServerRoot."cgi-bin/blast.pl$query", -target=>'infowin'}, "BLAST search");

#    if ($self->{'_kind'} =~ /^(gb|cds)/i) {
#        $link .= " | ";
#        if ($self->{'_map'} !~ /^p/i) {
#            $link .= a({-href=>$configUrl->dictyBaseCGIRoot."$dblink/PATMATCH/RestrictionMapper$restrictionQuery", -target=>'infowin'}, "Genome Restriction Map")." | ".
#                     a({-href=>$configUrl->DictyosteliumServerRoot."cgi-bin-dev/dictyBase/web-primer?id=$$", -target=>'infowin'}, "Design Primers")." | ";
#        }
#        $link .= a({-href=>$configUrl->ncbiUrlRoot2."query?db=n&form=6&uid=".param('query')."&dopt=g", -target=>'infowin'}, "NCBI Entrez")." for this sequence";
#    }
#    elsif ($self->{'_map'} !~ /^p/i) {
#        $link .= " | ".a({-href=>$configUrl->dictyBaseCGIRoot."$dblink/PATMATCH/RestrictionMapper$restrictionQuery", -target=>'infowin'}, "Genome Restriction Map")." | ".a({-href=>$configUrl->DictyosteliumServerRoot."cgi-bin-dev/dictyBase/web-primer?id=$$", -target=>'infowin'}, "Design Primers")." for this sequence";
#
#    }
    print p, center($link),p, center(hr({-width=>'35%'})), p;

}


#
# had to change to dicty chromosomes
#
#
########################################################################
sub getChromosome {
########################################################################
  my ($self) = shift;

  my %chrHash = ('1'=>'1', '2'=>'2', '3'=>'3', 
	       '4'=>'4', '5'=>'5', '6'=>'6', '7'=>'M', 
	       '8'=>'2F', '9'=>'3F', '10'=>'F');

  my $chromosome_no = $self->{'_chrnum'};

  return "Chromosome $chrHash{$chromosome_no} Sequence";

}


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

  my ($name, $chr, $reverse, $cut);

  $chr = $self->{'_chrnum'};
#
# was breaking for features with no chromosome
#
#  if (!$chr) {
#     $chr = $self->('_chr');
#  }

  if ($self->{_rev} eq '-REV') {
     $reverse = " reverse complement";
  }

  if ((($self->{_map} =~ /^a/i)
       && (param('flankl')>0 || param('flankr')>0)
       && param('flankl')!=1000 &&  param('flankr')!=1000) 
       || (param('chr'))){

      $cut = "  from " . $self->{'_beg'} . " to " . $self->{'_end'} . " ";
  }


  return "$name Chr $chr $cut $reverse";
}

#
# 
#  changed slightly to not show feature name if its a locus
#
#
########################################################################
sub setVariables {
########################################################################
    my ($self) = @_;

    $self->{'_query'} = uc($self->{'_query'});

    my $query = $self->{'_query'};

    &DeleteUnwantedChar(\$query);

    if ($query) {

	my $seqObj = SeqParamTranslator->new(dbh=>$dbh,
					     query=>$query);
	

	if ($seqObj->error) {
	    $self->err_report($seqObj->error);
	}
 
	$self->{'_kind'} = $seqObj->type;

	my $locusObj = $seqObj->locusObject;
	my $featObj = $seqObj->featureObject;

	if (!$featObj && $locusObj) {
	    $self->err_report("There is no feature_name associated with '$query' in database.");
	}
   
	if ($featObj) {
	    $self->{'_chrnum'} = $featObj->chromosome;
	    $self->{'_beg'} = $featObj->start_coord;
	    $self->{'_end'} = $featObj->stop_coord;
	    $self->{'_showNm'} = $featObj->feature_name;
	    $self->{'_seqname'} = $featObj->feature_name;
	    if ($featObj->locus_name) {
		$self->{'_showNm'} = $featObj->locus_name;
	    }
	}
	elsif ($self->{'_kind'} =~ /^clone/i) {
	    $self->{'_chrnum'} = $seqObj->chromosome;
	    $self->{'_beg'} = $seqObj->start_coord;
	    $self->{'_end'} = $seqObj->stop_coord;
	    $self->{'_showNm'} = $query;
	    $self->{'_seqname'} = $query;
	}
	elsif ($self->{'_kind'} =~ /^cds/i) {
	    $self->{'_seqname'} = $seqObj->seqin;
	    $self->{'_beg'} = $seqObj->start_coord;
	    $self->{'_end'} = $seqObj->stop_coord;
	    $self->{'_showNm'} = $query;
	    $self->{'_showNm'} =~ s/.CDS/.cds/;
	}
	elsif ($self->{'_kind'} =~ /^gb/i) {
	    $self->{'_seqname'} = $seqObj->seqin;
	    $self->{'_showNm'} = $query;
	}
    }
    elsif ($self->{'_chr'}) {
 
	if ($self->{'_beg'} =~ /^\-/ || $self->{'_end'} =~ /^\-/) {
	    $self->err_report("You should enter positive numbers for coordinates. Please go back, correct them and submit again. Thanks!");
	}

	my $chrObj = Chromosome->new(dbh=>$dbh,
				     chromosome=>$self->{'_chr'});

	if (!$chrObj) {
	    $self->err_report("The chromosome number = ".$self->{'_chr'}." is not found in database.");
	}
	if ($self->{'_beg'} >= $chrObj->physical_length) {
	    $self->err_report("The starting coordinate is larger than or equal to the chromosome size (".$chrObj->physical_length."). Please go back and enter a smaller number. Thanks!");
	}
	elsif ($self->{'_end'} > $chrObj->physical_length) {
	    $self->err_report("The ending coordinate is larger than the chromosome size (".$chrObj->physical_length."). Please go back and enter a smaller number. Thanks!");
	}
	$self->{'_chrnum'} = $self->{'_chr'};	
	if (!$self->{'_beg'} && !$self->{'_end'}) {
	    $self->{'_beg'} = 1;
	    $self->{'_end'} = 10000;
	}
	elsif (($self->{'_beg'} == 0 && $self->{'_end'} == 0) ||
	    $self->{'_beg'} == $self->{'_end'}) {

	    $self->err_report("The beginning and ending coordinates (nucleotide numbers) must be specified and be different values.");

	}
    }
}
########################################################################
1; #####################################################################
########################################################################



















