package EnsEMBL::Web::Component::Help::ArchiveList;
use strict;
use warnings;
no warnings "uninitialized";
use EnsEMBL::Web::OldLinks;
use base qw(EnsEMBL::Web::Component::Help);
use CGI qw(escapeHTML unescape);
sub _init {
my $self = shift;
$self->cacheable( 1 );
$self->ajaxable( 0 );
$self->configurable( 0 );
}
sub content {
my $self = shift;
my $object = $self->object;
my $url = CGI::unescape($object->param('url'));
$url =~ s#^/##;
my $html;
## is this a species page?
my ($path, $param) = split('\?', $object->param('url'));
my @check = split('/', $path);
my ($part1, $part2, $part3, $species, $type, $action);
if ($object->param('url') =~ m#^/#) {
($part1, $part2, $part3) = ($check[1], $check[2], $check[3]);
}
else {
($part1, $part2, $part3) = ($check[0], $check[1], $check[2]);
}
if ($part1 =~ /^[A-Z][a-z]+_[a-z]+$/) {
$species = $part1;
$type = $part2;
$action = $part3;
}
else {
$type = $part1;
$action = $part2;
}
my %archive;
if ($species) {
%archive = %{$object->species_defs->get_config($species, 'ENSEMBL_ARCHIVES')};
if (keys %archive) {
$html .= "<p>The following archives are available for this page:</p>
<ul>\n";
my $missing = 0;
if ($type =~ /\.html/ || $action =~ /\.html/) {
foreach my $release (reverse sort keys %archive) {
next if $release == $object->species_defs->VERSION;
$html .= $self->_output_link(\%archive, $release, $url);
}
}
else {
my ($old_view, $initial_release) = EnsEMBL::Web::OldLinks::get_archive_redirect($type, $action);
foreach my $release (reverse sort keys %archive) {
next if $release == $object->species_defs->ENSEMBL_VERSION;
if ($release < 51) {
if ($release >= $initial_release) {
$url = $species.'/'.$old_view;
## Transform parameters
my @params = split(';', $param);
my (%parameter, @new_params);
foreach my $pair (@params) {
my @a = split('=', $pair);
$parameter{$a[0]} = CGI::unescape($a[1]);
}
if ($type eq 'Location') {
my $location = $parameter{'r'};
my ($chr, $start, $end) = $location =~ /^([a-zA-Z0-9]+):([0-9]+)\-([0-9]+)$/;
@new_params = ('chr='.$chr, 'start='.$start, 'end='.$end);
}
elsif ($type eq 'Gene') {
@new_params = ('gene='.$parameter{'g'});
}
elsif ($type eq 'Variation') {
@new_params = ('snp='.$parameter{'v'});
}
elsif ($type eq 'Transcript') {
@new_params = ('transcript='.$parameter{'t'});
}
else {
@new_params = @params;
}
$url .= '?'.join(';', @new_params) if scalar(@new_params);
}
else {
$missing = 1;
}
}
$html .= $self->_output_link(\%archive, $release, $url);
}
}
$html .= qq(</ul>\n);
if ($missing) {
$html .= qq(<p>Some earlier archives are available, but this view was not present in those releases</p>\n);
}
}
else {
$html .= "<p>This is a new species, so there are no archives containing equivalent data.</p>\n";
}
}
else {
%archive = %{$object->species_defs->ENSEMBL_ARCHIVES};
## TO DO - map static content moves!
$html .= qq(<ul>\n);
foreach my $release (reverse sort keys %archive) {
next if $release == $object->species_defs->ENSEMBL_VERSION;
$html .= $self->_output_link(\%archive, $release, $url);
}
$html .= qq(</ul>\n);
}
$html .= qq(<p><a href="/info/website/archives/" class="cp-external">More information about the Ensembl archives</a></p>);
return $html;
}
sub _output_link {
my ($self, $archive, $release, $url) = @_;
my $sitename = $self->object->species_defs->ENSEMBL_SITETYPE;
my $date = $archive->{$release};
my $month = substr($date, 0, 3);
my $year = substr($date, 3, 4);
return qq(<li><a href="http://$date.archive.ensembl.org/$url" class="cp-external">$sitename $release: $month $year</a></li>);
}
1;