chiark / gitweb /
printable trading plans
[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, queryqf => \%queryqf, allargs => \%ARGS,
263     prselector => $prselector,
264     someresults => $someresults,
265     emsgokorprint => sub {
266         my ($emsg) = @_;
267         return 1 unless defined $emsg and length $emsg;
268         $someresults->();
269         print $emsg;
270         return 0;
271     }
272  &>
273
274 <p>
275
276 %#---------- debugging and epilogue ----------
277
278 % if ($debug) {
279 <p>
280 <pre id="debug_log">
281 Debug log:
282 </pre>
283 % }
284
285 <&| script &>
286 function debug (m) {
287 % if ($debug) {
288   var node= document.getElementById('debug_log');
289   node.innerHTML += "\n" + m + "\n";
290 % }
291 }
292 </&script>
293
294 <& footer &>
295
296 <%init>
297 use CommodsWeb;
298 use HTML::Entities;
299 use URI::Escape;
300
301 </%init>
302 <%cleanup>
303
304 $mydbh->rollback() if $mydbh;
305
306 </%cleanup>