<%perl>
my %a;
my @vars;
# for output:
my @archipelagoes;
my @islandids;
my %islandid2;
#---------- "mode" argument parsing and mode menu at top of page ----------
# for debugging, invoke as
# http://www.chiark.greenend.org.uk/ucgi/~clareb/mason/pirates/pirate-route?debug=1
@vars= ({ Name => 'Ocean',
Before => 'Ocean: ',
CmpCanon => sub { ucfirst lc $_[0] },
Values => [ ocean_list() ]
}, { Name => 'Dropdowns',
Before => 'Interface: ',
CmpCanon => sub { !!$_[0] },
Values => [ [ 0, 'Type in names' ],
[ 4, 'Select from menus' ] ]
});
foreach my $var (@vars) {
my $name= $var->{Name};
my $lname= lc $name;
$var->{Before}= '' unless exists $var->{Before};
$var->{CmpCanon}= sub { $_[0]; } unless exists $var->{CmpCanon};
foreach my $val (@{ $var->{Values} }) {
next if ref $val;
$val= [ $val, encode_entities($val) ];
}
if (exists $ARGS{$lname}) {
$a{$name}= $ARGS{$lname};
} else {
$a{$name}= $var->{Values}[0][0];
}
}
my %baseqf;
foreach my $var (@vars) {
my $lname= lc $var->{Name};
next unless exists $ARGS{$lname};
$baseqf{$lname}= $ARGS{$lname};
}
my %queryqf;
foreach my $var (keys %ARGS) {
next unless $var =~
m/^(?:routestring|islandid\d|archipelago\d|debug)$/;
$queryqf{$var}= $ARGS{$var};
}
my $uri= URI->new($m->current_comp()->name());
my $quri= sub { $uri->query_form(@_); $uri->path_query(); };
foreach my $var (@vars) {
my $name= $var->{Name};
my $lname= lc $var->{Name};
my $delim= $var->{Before};
my $canon= &{$var->{CmpCanon}}($a{$name});
my $cvalix= 0;
foreach my $valr (@{ $var->{Values} }) {
print $delim; $delim= "\n|\n";
my ($value,$html) = @$valr;
my $iscurrent= &{$var->{CmpCanon}}($value) eq $canon;
my $after;
if ($iscurrent) {
print '';
$after= '';
} else {
my %qf= (%baseqf,%queryqf);
delete $qf{$lname};
$qf{$lname}= $value if $cvalix;
print '';
$after= '';
}
print $html, $after;
$cvalix++;
}
print "\n\n";
}
#---------- initial checks, startup, main entry form ----------
die "unknown ocean $a{Ocean} ?"
unless grep { $_ eq $a{Ocean} } ocean_list();
db_setocean($a{Ocean});
db_connect();
%perl>
<%args>
$debug => 0
$routestring => ''
%args>
Specify route
<%perl>
#========== result computations ==========
my $results_head;
$results_head= sub {
print "Results
\n";
$results_head= sub { };
};
#---------- result computation - textstring ----------
if (!$a{Dropdowns}) {
if (length $routestring) {
$results_head->();
my $rsr= $m->comp('routetextstring',
ocean => $a{Ocean},
string => $routestring,
format => 'return'
);
if (length $rsr->{Error}) {
print encode_entities($rsr->{Error});
} else {
foreach my $entry (@{ $rsr->{Results} }) {
push @archipelagoes,
defined $entry->[1] ? undef : $entry->[0];
push @islandids, $entry->[1];
}
}
}
} else { #---------- results - dropdowns ----------
my $argorundef= sub {
my ($dd,$base) = @_;
my $thing= $ARGS{"${base}${dd}"};
$thing= undef if defined $thing and $thing eq 'none';
return $thing;
};
for my $dd (0..$a{Dropdowns}-1) {
my $arch= $argorundef->($dd,'archipelago');
my $island= $argorundef->($dd,'islandid');
next unless defined $arch or defined $island;
if (defined $island and defined $arch) {
my $ii= $islandid2{$island};
my $iarch= $ii->{Arch};
if ($iarch ne $arch) {
$results_head->();
%perl>
Specified archipelago <% $arch %> but
island <% $ii->{Name} %>
which is in <% $iarch %>; using the island.
<%perl>
}
$arch= undef;
}
push @archipelagoes, $arch;
push @islandids, $island;
}
}#---------- result processing, common stuff
%perl>
% if (@islandids) {
% $results_head->();
<& routetrade, islandids => \@islandids, archipelagoes => \@archipelagoes &>
% }
%#---------- debugging and epilogue ----------
% if ($debug) {
Debug log:
% }
<%init>
use CommodsWeb;
use HTML::Entities;
use URI::Escape;
%init>