chiark / gitweb /
6021531c39b6b631fcf0c638db27ac2de0dca8f8
[ypp-sc-tools.main.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 { color: #000000; background: #c5c7ae; }
132   div.query { background: #d7d8b3; padding: 1em; }
133   div.results { padding: 1em; }
134   table.data { background: #b5b686; }
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 <div class="navoptbar">
151 <a href="<% $m->current_comp()->name() |u %>">YARRG</a> -
152  Yet Another Revenue Research Gatherer
153 |
154 <a href="intro">introduction</a>
155 |
156 <a href="docs">documentation</a>
157 |
158 <a href="devel">development</a>
159 <p>
160 % }
161 <%perl>
162
163 foreach my $var (@vars) {
164         my $lname= lc $var->{Name};
165         next unless exists $ARGS{$lname};
166         $baseqf{$lname}= $ARGS{$lname};
167 }
168
169 foreach my $var (keys %ARGS) {
170         next unless $var =~
171                 m/^(?: (?:route|commod|capacity|capital|island)string |
172                         lossperleague | distance |
173                         commodid |
174                         islandid \d |
175                         archipelago \d |
176                         debug |
177                         [RT]\w+
178                     )$/x;
179         my $val= $ARGS{$var};
180         next if $val eq 'none';
181         $queryqf{$var}= $val;
182 }
183
184 my $quri= sub {
185         my $uri= URI->new('lookup');
186         $uri->query_form(@_);
187         $uri->path_query();
188 };
189
190 my $prselector_core= sub {
191         my ($var)= @_;
192         return if printable($m);
193         my $name= $var->{Name};
194         my $lname= lc $var->{Name};
195         my $delim= $var->{Before};
196         my $canon= &{$var->{CmpCanon}}($styles{$name});
197         my $cvalix= 0;
198         foreach my $valr (@{ $var->{Values} }) {
199                 print $delim;  $delim= "\n|\n";
200                 my ($value,$html) = @$valr;
201                 my $iscurrent= &{$var->{CmpCanon}}($value) eq $canon;
202                 my $after;
203                 if ($iscurrent) {
204                         print '<b>';
205                         $after= '</b>';
206                 } else {
207                         my %qf= (%baseqf,%queryqf);
208                         delete $qf{$lname};
209                         $qf{$lname}= $value if $cvalix;
210 </%perl>
211 <a href="<% $quri->(%qf) |h %>">
212 <%perl>
213                         $after= '</a>';
214                 }
215                 print $html, $after;
216                 $cvalix++;
217         }
218         print "<p>\n\n";
219 };
220
221 my $prselector= sub {
222         my ($name)= @_;
223         foreach my $var (@vars) {
224                 if ($var->{Name} eq $name) {
225                         $prselector_core->($var);
226                         return;
227                 }
228         }
229         die $name;
230 };
231
232 foreach my $var (@vars) {
233         next if $var->{QuerySpecific};
234         $prselector_core->($var);
235 }
236
237 #---------- initial checks, startup, main entry form ----------
238
239 die if $styles{Query} =~ m/[^a-z]/;
240
241 my $mydbh;
242 my $dbh= ($mydbh= dbw_connect($styles{Ocean}));
243
244 my $results_head_done=0;
245 my $someresults= sub {
246         return if $results_head_done;
247         $results_head_done=1;
248         my ($h)= @_;
249         $h= 'Results' if !$h;
250         print "\n<h1>$h</h1>\n";
251 };
252
253 </%perl>
254 <%args>
255 $debug => 0
256 </%args>
257
258 % if (!printable($m)) {
259 </div>
260 <hr>
261 % }
262
263 <& "query_$styles{Query}", %baseqf, %queryqf, %styles,
264     quri => $quri, dbh => $dbh,
265     baseqf => \%baseqf, queryqf => \%queryqf, allargs => \%ARGS,
266     prselector => $prselector,
267     someresults => $someresults,
268     emsgokorprint => sub {
269         my ($emsg) = @_;
270         return 1 unless defined $emsg and length $emsg;
271         $someresults->();
272         print $emsg;
273         return 0;
274     }
275  &>
276 </div>
277
278 %#---------- debugging and epilogue ----------
279
280 % if ($debug) {
281 <div class="results">
282 <pre id="debug_log">
283 Debug log:
284 </pre>
285 </div>
286 % }
287
288 <&| script &>
289 function debug (m) {
290 % if ($debug) {
291   var node= document.getElementById('debug_log');
292   node.innerHTML += "\n" + m + "\n";
293 % }
294 }
295 </&script>
296
297 <& footer &>
298
299 <%init>
300 use CommodsWeb;
301 use HTML::Entities;
302 use URI::Escape;
303
304 </%init>
305 <%cleanup>
306
307 $mydbh->rollback() if $mydbh;
308
309 </%cleanup>