chiark / gitweb /
Make query dumping conditional on debug
[ypp-sc-tools.db-live.git] / yarrg / web / query_route
1 <%doc>
2
3  This is part of the YARRG website.  YARRG is a tool and website
4  for assisting players of Yohoho Puzzle Pirates.
5
6  Copyright (C) 2009 Ian Jackson <ijackson@chiark.greenend.org.uk>
7  Copyright (C) 2009 Clare Boothby
8
9   YARRG's client code etc. is covered by the ordinary GNU GPL (v3 or later).
10   The YARRG website is covered by the GNU Affero GPL v3 or later, which
11    basically means that every installation of the website will let you
12    download the source.
13
14  This program is free software: you can redistribute it and/or modify
15  it under the terms of the GNU Affero General Public License as
16  published by the Free Software Foundation, either version 3 of the
17  License, or (at your option) any later version.
18
19  This program is distributed in the hope that it will be useful,
20  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  GNU Affero General Public License for more details.
23
24  You should have received a copy of the GNU Affero General Public License
25  along with this program.  If not, see <http://www.gnu.org/licenses/>.
26
27  Yohoho and Puzzle Pirates are probably trademarks of Three Rings and
28  are used without permission.  This program is not endorsed or
29  sponsored by Three Rings.
30
31
32  This Mason component generates the core of the `trade route' query.
33
34
35 </%doc>
36 <%args>
37 $quri
38 $dbh
39 $routestring => '';
40 $someresults
41 $emsgokorprint
42 </%args>
43
44 <%perl>
45 my $emsg;
46 my @archipelagoes;
47 my @islandids;
48 my %islandid2;
49
50 my $qa= \%ARGS;
51 </%perl>
52
53 %#---------- textbox, user enters route as string ----------
54 % if (!$qa->{Dropdowns}) {
55
56 <h1>Specify route</h1>
57
58 Enter route (islands, or archipelagoes, separated by |s or commas;
59  abbreviations are OK):<br>
60
61 <form action="<% $quri->() |h %>" method="get">
62
63 <&| qtextstring, qa => $qa, dbh => $dbh,
64     thingstring => 'routestring', emsgstore => \$emsg,
65     perresult => sub {
66         my ($canonname, $island, $arch) = @_;
67         push @islandids, $island;
68         push @archipelagoes, defined $island ? undef : $arch;
69     }
70  &>
71  size=80
72 </&>
73
74 % } else { #---------- dropdowns, user selects from menus ----------
75
76 <%perl>
77 my ($sth,$row);
78 my @archlistdata;
79 my %islandlistdata;
80 $islandlistdata{'none'}= [ [ "none", "Select island..." ] ];
81
82 my $optionlistmap= sub {
83         my ($optlist, $selected) = @_;
84         my $out='';
85         foreach my $entry (@$optlist) {
86                 $out.= sprintf('<option value="%s" %s>%s</option>',
87                         encode_entities($entry->[0]),
88                         defined $selected && $entry->[0] eq $selected
89                                 ? 'selected' : '',
90                         encode_entities($entry->[1]));
91         }
92         return $out;
93 };
94
95 $sth= $dbh->prepare("SELECT DISTINCT archipelago FROM islands
96                             ORDER BY archipelago;");
97 $sth->execute();
98
99 while ($row=$sth->fetchrow_arrayref) {
100         my ($arch)= @$row;
101         push @archlistdata, [ $arch, $arch ];
102         $islandlistdata{$arch}= [ [ "none", "Whole arch" ] ];
103 }
104
105 $sth= $dbh->prepare("SELECT islandid,islandname,archipelago
106                             FROM islands
107                             ORDER BY islandname;");
108 $sth->execute();
109
110 while ($row=$sth->fetchrow_arrayref) {
111         my $arch= $row->[2];
112         push @{ $islandlistdata{'none'} }, [ @$row ];
113         push @{ $islandlistdata{$arch} }, [ @$row ];
114         $islandid2{$row->[0]}= { Name => $row->[1], Arch => $arch };
115 }
116
117 my %resetislandlistdata;
118 foreach my $arch (keys %islandlistdata) {
119         $resetislandlistdata{$arch}=
120                 $optionlistmap->($islandlistdata{$arch}, '');
121 }
122
123 </%perl>
124
125 <&| script &>
126 ms_lists= <% to_json_protecttags(\%resetislandlistdata) %>;
127 function ms_Setarch(dd) {
128   debug('ms_SetArch '+dd+' arch='+arch);
129   var arch= document.getElementsByName('archipelago'+dd).item(0).value;
130   var got= ms_lists[arch];
131   if (got == undefined) return; // unknown arch ?  hrm
132   debug('ms_SetArch '+dd+' arch='+arch+' got ok');
133   var select= document.getElementsByName('islandid'+dd).item(0);
134   select.innerHTML= got;
135   debug('ms_SetArch '+dd+' arch='+arch+' innerHTML set');
136 }
137 </&script>
138
139 <table style="table-layout:fixed; width:90%;">
140
141 <tr>
142 %       for my $dd (0..$qa->{Dropdowns}-1) {
143 <td>
144 <select name="archipelago<% $dd %>" onchange="ms_Setarch(<% $dd %>)">
145 <option value="none">Whole ocean</option>
146 <% $optionlistmap->(\@archlistdata, $ARGS{"archipelago$dd"}) %></select></td>
147 %       }
148 </tr>
149
150 <tr>
151 %       for my $dd (0..$qa->{Dropdowns}-1) {
152 %               my $arch= $ARGS{"archipelago$dd"};
153 %               $arch= 'none' if !defined $arch;
154 <td>
155 <select name="islandid<% $dd %>">
156 <% $optionlistmap->($islandlistdata{$arch}, $ARGS{"islandid$dd"}) %>
157 </select></td>
158 %       }
159 </tr>
160
161 </table>
162
163 % } #---------- end of dropdowns, now common middle of page code ----------
164
165 <input type=submit name=submit value="Go">
166 % my $ours= sub { $_[0] =~ m/^island|^archipelago|^routestring/; };
167 <& "lookup:formhidden", ours => $ours &>
168 </form>
169
170 <%perl>
171 #========== results ==========
172
173 $emsgokorprint->($emsg) or @islandids=();
174
175 my $argorundef= sub {
176         my ($dd,$base) = @_;
177         my $thing= $ARGS{"${base}${dd}"};
178         $thing= undef if defined $thing and $thing eq 'none';
179         return $thing;
180 };
181
182 for my $dd (0..$qa->{Dropdowns}-1) {
183         my $arch= $argorundef->($dd,'archipelago');
184         my $island= $argorundef->($dd,'islandid');
185         next unless defined $arch or defined $island;
186         if (defined $island and defined $arch) {
187                 my $ii= $islandid2{$island};
188                 my $iarch= $ii->{Arch};
189                 if ($iarch ne $arch) {
190                         $someresults->();
191 </%perl>
192  Specified archipelago <% $arch %> but
193  island <% $ii->{Name} %>
194  which is in <% $iarch %>; using the island.<br>
195 <%perl>
196                 }
197                 $arch= undef;
198         }
199         push @archipelagoes, $arch;
200         push @islandids, $island;
201 }
202
203 </%perl>
204
205 % if (@islandids) {
206 %       $someresults->();
207 <& routetrade,
208    dbh => $dbh,
209    islandids => \@islandids,
210    archipelagoes => \@archipelagoes,
211    qa => $qa
212  &>
213 % }