chiark / gitweb /
Merge branch 'ceb'
[ypp-sc-tools.db-live.git] / yarrg / web / lookup
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 main `lookup' page, including
33  all the entry boxes etc. for every query.
34
35
36 </%doc>
37 <%perl>
38 my %ahtml;
39 my @vars;
40 my %styles;
41
42 #---------- "mode" argument parsing and mode menu at top of page ----------
43
44 # for debugging, invoke as
45 #  http://www.chiark.greenend.org.uk/ucgi/~clareb/mason/pirates/pirate-route?debug=1
46
47 @vars= ({       Name => 'Ocean',
48                 Before => 'Ocean: ',
49                 CmpCanon => sub { ucfirst lc $_[0] },
50                 Values => [ ocean_list() ]
51         }, {    Name => 'Dropdowns',
52                 Before => 'Interface: ',
53                 CmpCanon => sub { !!$_[0] },
54                 Values => [     [ 0, 'Type in names' ],
55                                 [ 4, 'Select from menus' ] ]
56         }, {    Name => 'Query',
57                 Before => 'Query: ',
58                 Values => [     [ 'route', 'Trades for route' ],
59                                 [ 'commod', 'Prices for commodity' ],
60                                 [ 'offers', 'Offers at location' ],
61                                 [ 'routesearch', 'Find profitable route' ],
62                                 [ 'age', 'Data age' ] ]
63         }, {    Name => 'BuySell',
64                 Before => '',
65                 Values => [     [ 'buy_sell',   'Buy and sell' ],
66                                 [ 'sell_buy',   'Sell and buy' ],
67                                 [ 'buy',        'Buy offers only' ],
68                                 [ 'sell',       'Sell offers only' ],
69                         ],
70                 QuerySpecific => 1,
71         }, {    Name => 'ShowBlank',
72                 Before => '',
73                 Values => [     [ 0, 'Omit islands with no offers' ],
74                                 [ 'show', 'Show all islands' ],
75                         ],
76                 QuerySpecific => 1,
77         }, {    Name => 'ShowStalls',
78                 Before => '',
79                 Values => [     [ 0, 'Show total quantity at each price' ],
80                                 [ 1, 'Show individual stalls' ],
81                                 [ 2, "Also be cautious about stalls'".
82                                         " poe reserves",
83                                         '<a href="docs#poelimit">[?]</a>' ]
84                         ],
85                 QuerySpecific => 1,
86         }, {    Name => 'RouteSearchType',
87                 Before => 'Type of routes to search for: ',
88                 Values => [     [ 0, 'Open-ended' ],
89                                 [ 1, 'Circular' ],
90                         ],
91                 QuerySpecific => 1,
92         });
93
94 foreach my $var (@vars) {
95         my $name= $var->{Name};
96         my $lname= lc $name;
97         $var->{Before}= '' unless exists $var->{Before};
98         $var->{CmpCanon}= sub { $_[0]; } unless exists $var->{CmpCanon};
99         foreach my $val (@{ $var->{Values} }) {
100                 next if ref $val;
101                 $val= [ $val, encode_entities($val) ];
102         }
103         if (exists $ARGS{$lname}) {
104                 $styles{$name}= $ARGS{$lname};
105                 my @html= grep { $_->[0] eq $styles{$name} }
106                                 @{ $var->{Values} };
107                 $ahtml{$name}= @html==1 ? $html[0][1] : '???';
108         } else {
109                 $styles{$name}= $var->{Values}[0][0];
110                 $ahtml{$name}= $var->{Values}[0][1];
111         }
112 }
113
114 </%perl>
115
116 <%shared>
117 my %baseqf;
118 my %queryqf;
119 </%shared>
120
121 <%method formhidden>
122 <%args>
123 $ours
124 </%args>
125 % foreach my $n (keys %baseqf, keys %queryqf) {
126 %       next if $ours->($n);
127 %       my $v= exists $baseqf{$n} ? $baseqf{$n} : $queryqf{$n};
128 <input type=hidden name=<% $n %> value="<% $v |h %>">
129 % }
130 </%method>
131
132 <html lang="en"><head><title><% ucfirst $ahtml{Query} %> - YARRG</title>
133 <style type="text/css">
134 <& style.css &>
135   body { margin: 0; color: #000000; background: #c5c7ae; }
136   div.query { background: #d7d8b3; padding: 1em; }
137   div.results { padding: 1em; }
138   table.data { background: #b5b686; }
139   tr.datarow0 { background: #ffffff; }
140   tr.datarow1 { background: #e3e3e3; }
141 </style>
142 <&| script &>
143   function register_onload(f) {
144     var previous_onload= window.onload;
145     window.onload= function() {
146       if (previous_onload) previous_onload();
147       f();
148     };
149   }
150 </&script>
151 </head><body>
152
153 % if (!printable($m)) {
154 <div class="navoptbar">
155 <& navbar &>
156 <p>
157 % }
158 <%perl>
159
160 foreach my $var (@vars) {
161         my $lname= lc $var->{Name};
162         next unless exists $ARGS{$lname};
163         $baseqf{$lname}= $ARGS{$lname};
164 }
165
166 foreach my $var (keys %ARGS) {
167         next unless $var =~
168                 m/^(?: (?:route|commod|capacity|capital|island)string |
169                         lossperleague | distance |
170                         commodid |
171                         islandid \d |
172                         archipelago \d |
173                         debug |
174                         [RT]\w+
175                     )$/x;
176         my $val= $ARGS{$var};
177         next if $val eq 'none';
178         $queryqf{$var}= $val;
179 }
180
181 my $quri= sub {
182         my $uri= URI->new('lookup');
183         $uri->query_form(@_);
184         $uri->path_query();
185 };
186
187 my $prselector_core= sub {
188         my ($var)= @_;
189         return if printable($m);
190         my $name= $var->{Name};
191         my $lname= lc $var->{Name};
192         my $delim= $var->{Before};
193         my $canon= &{$var->{CmpCanon}}($styles{$name});
194         my $cvalix= 0;
195         foreach my $valr (@{ $var->{Values} }) {
196                 print $delim;  $delim= "\n|\n";
197                 my ($value,$html,$finally) = @$valr;
198                 my $iscurrent= &{$var->{CmpCanon}}($value) eq $canon;
199                 my $after;
200                 if ($iscurrent) {
201                         print '<b>';
202                         $after= '</b>';
203                 } else {
204                         my %qf= (%baseqf,%queryqf);
205                         delete $qf{$lname};
206                         delete $qf{$_} foreach grep { m/^[A-Z]/ } keys %qf;
207                         $qf{$lname}= $value if $cvalix;
208 </%perl>
209 <a href="<% $quri->(%qf) |h %>">
210 <%perl>
211                         $after= '</a>';
212                 }
213                 print $html, $after;
214                 print " ", $finally if defined $finally;
215                 $cvalix++;
216         }
217         print "<p>\n\n";
218 };
219
220 my $prselector= sub {
221         my ($name)= @_;
222         foreach my $var (@vars) {
223                 if ($var->{Name} eq $name) {
224                         $prselector_core->($var);
225                         return;
226                 }
227         }
228         die $name;
229 };
230
231 foreach my $var (@vars) {
232         next if $var->{QuerySpecific};
233         $prselector_core->($var);
234 }
235
236 #---------- initial checks, startup, main entry form ----------
237
238 die if $styles{Query} =~ m/[^a-z]/;
239
240 my $mydbh;
241 my $dbh= ($mydbh= dbw_connect($styles{Ocean}));
242
243 my $results_head_done=0;
244 my $someresults= sub {
245         return if $results_head_done;
246         $results_head_done=1;
247         my ($h)= @_;
248         $h= 'Results' if !$h;
249         print "\n<h1>$h</h1>\n";
250 };
251
252 </%perl>
253 <%args>
254 $debug => 0
255 </%args>
256
257 % if (!printable($m)) {
258 </div>
259 <hr>
260 % }
261
262 <& "query_$styles{Query}", %baseqf, %queryqf, %styles,
263     quri => $quri, dbh => $dbh,
264     baseqf => \%baseqf, queryqf => \%queryqf, allargs => \%ARGS,
265     prselector => $prselector,
266     someresults => $someresults,
267     emsgokorprint => sub {
268         my ($emsg) = @_;
269         return 1 unless defined $emsg and length $emsg;
270         $someresults->();
271         print $emsg;
272         return 0;
273     }
274  &>
275
276 %#---------- debugging and epilogue ----------
277
278 % if ($debug) {
279 <div class="results">
280 <pre id="debug_log">
281 Debug log:
282 </pre>
283 </div>
284 % }
285
286 <&| script &>
287 function debug (m) {
288 % if ($debug) {
289   var node= document.getElementById('debug_log');
290   node.innerHTML += "\n" + m + "\n";
291 % }
292 }
293 </&script>
294
295 <& footer &>
296
297 <%init>
298 use CommodsWeb;
299 use HTML::Entities;
300 use URI::Escape;
301
302 </%init>
303 <%cleanup>
304
305 $mydbh->rollback() if $mydbh;
306
307 </%cleanup>