chiark / gitweb /
Fix another case sensitivity error
[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                         ],
82                 QuerySpecific => 1,
83         }, {    Name => 'RouteSearchType',
84                 Before => 'Type of routes to search for: ',
85                 Values => [     [ 0, 'Open-ended' ],
86                                 [ 1, 'Circular' ],
87                         ],
88                 QuerySpecific => 1,
89         });
90
91 foreach my $var (@vars) {
92         my $name= $var->{Name};
93         my $lname= lc $name;
94         $var->{Before}= '' unless exists $var->{Before};
95         $var->{CmpCanon}= sub { $_[0]; } unless exists $var->{CmpCanon};
96         foreach my $val (@{ $var->{Values} }) {
97                 next if ref $val;
98                 $val= [ $val, encode_entities($val) ];
99         }
100         if (exists $ARGS{$lname}) {
101                 $styles{$name}= $ARGS{$lname};
102                 my @html= grep { $_->[0] eq $styles{$name} }
103                                 @{ $var->{Values} };
104                 $ahtml{$name}= @html==1 ? $html[0][1] : '???';
105         } else {
106                 $styles{$name}= $var->{Values}[0][0];
107                 $ahtml{$name}= $var->{Values}[0][1];
108         }
109 }
110
111 </%perl>
112
113 <%shared>
114 my %baseqf;
115 my %queryqf;
116 </%shared>
117
118 <%method formhidden>
119 <%args>
120 $ours
121 </%args>
122 % foreach my $n (keys %baseqf, keys %queryqf) {
123 %       next if $ours->($n);
124 %       my $v= exists $baseqf{$n} ? $baseqf{$n} : $queryqf{$n};
125 <input type=hidden name=<% $n %> value="<% $v |h %>">
126 % }
127 </%method>
128
129 <html lang="en"><head><title><% ucfirst $ahtml{Query} %> - YARRG</title>
130 <style type="text/css">
131 body {
132   color: #000000;
133   background: #ffffff;
134 }
135 tr.datarow0 { background: #e3e3e3; }
136 tr.datarow1 { background: #ffffff; }
137 </style>
138 <&| script &>
139   function register_onload(f) {
140     var previous_onload= window.onload;
141     window.onload= function() {
142       if (previous_onload) previous_onload();
143       f();
144     };
145   }
146 </&script>
147 </head><body>
148
149 % if (!printable($m)) {
150 <a href="<% $m->current_comp()->name() |u %>">YARRG</a> -
151  Yet Another Revenue Research Gatherer
152 |
153 <a href="intro">introduction</a>
154 |
155 <a href="docs">documentation</a>
156 |
157 <a href="devel">development</a>
158 <p>
159 % }
160 <%perl>
161
162 foreach my $var (@vars) {
163         my $lname= lc $var->{Name};
164         next unless exists $ARGS{$lname};
165         $baseqf{$lname}= $ARGS{$lname};
166 }
167
168 foreach my $var (keys %ARGS) {
169         next unless $var =~
170                 m/^(?: (?:route|commod|capacity|capital|island)string |
171                         lossperleague | distance |
172                         commodid |
173                         islandid \d |
174                         archipelago \d |
175                         debug |
176                         [RT]\w+
177                     )$/x;
178         my $val= $ARGS{$var};
179         next if $val eq 'none';
180         $queryqf{$var}= $val;
181 }
182
183 my $quri= sub {
184         my $uri= URI->new('lookup');
185         $uri->query_form(@_);
186         $uri->path_query();
187 };
188
189 my $prselector_core= sub {
190         my ($var)= @_;
191         return if printable($m);
192         my $name= $var->{Name};
193         my $lname= lc $var->{Name};
194         my $delim= $var->{Before};
195         my $canon= &{$var->{CmpCanon}}($styles{$name});
196         my $cvalix= 0;
197         foreach my $valr (@{ $var->{Values} }) {
198                 print $delim;  $delim= "\n|\n";
199                 my ($value,$html) = @$valr;
200                 my $iscurrent= &{$var->{CmpCanon}}($value) eq $canon;
201                 my $after;
202                 if ($iscurrent) {
203                         print '<b>';
204                         $after= '</b>';
205                 } else {
206                         my %qf= (%baseqf,%queryqf);
207                         delete $qf{$lname};
208                         $qf{$lname}= $value if $cvalix;
209 </%perl>
210 <a href="<% $quri->(%qf) |h %>">
211 <%perl>
212                         $after= '</a>';
213                 }
214                 print $html, $after;
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 <hr>
259 % }
260
261 <& "query_$styles{Query}", %baseqf, %queryqf, %styles,
262     quri => $quri, dbh => $dbh,
263     baseqf => \%baseqf, queryqf => \%queryqf, allargs => \%ARGS,
264     prselector => $prselector,
265     someresults => $someresults,
266     emsgokorprint => sub {
267         my ($emsg) = @_;
268         return 1 unless defined $emsg and length $emsg;
269         $someresults->();
270         print $emsg;
271         return 0;
272     }
273  &>
274
275 <p>
276
277 %#---------- debugging and epilogue ----------
278
279 % if ($debug) {
280 <p>
281 <pre id="debug_log">
282 Debug log:
283 </pre>
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>