chiark / gitweb /
2f67760c487d6f1281b37bcb819ca6a7b2dd3d01
[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 {
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 <a href="<% $m->current_comp()->name() |u %>">YARRG</a> -
150  Yet Another Revenue Research Gatherer
151 |
152 <a href="intro">introduction</a>
153 |
154 <a href="docs">documentation</a>
155 |
156 <a href="devel">development</a>
157 <p>
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         my $name= $var->{Name};
190         my $lname= lc $var->{Name};
191         my $delim= $var->{Before};
192         my $canon= &{$var->{CmpCanon}}($styles{$name});
193         my $cvalix= 0;
194         foreach my $valr (@{ $var->{Values} }) {
195                 print $delim;  $delim= "\n|\n";
196                 my ($value,$html) = @$valr;
197                 my $iscurrent= &{$var->{CmpCanon}}($value) eq $canon;
198                 my $after;
199                 if ($iscurrent) {
200                         print '<b>';
201                         $after= '</b>';
202                 } else {
203                         my %qf= (%baseqf,%queryqf);
204                         delete $qf{$lname};
205                         $qf{$lname}= $value if $cvalix;
206 </%perl>
207 <a href="<% $quri->(%qf) |h %>">
208 <%perl>
209                         $after= '</a>';
210                 }
211                 print $html, $after;
212                 $cvalix++;
213         }
214         print "<p>\n\n";
215 };
216
217 my $prselector= sub {
218         my ($name)= @_;
219         foreach my $var (@vars) {
220                 if ($var->{Name} eq $name) {
221                         $prselector_core->($var);
222                         return;
223                 }
224         }
225         die $name;
226 };
227
228 foreach my $var (@vars) {
229         next if $var->{QuerySpecific};
230         $prselector_core->($var);
231 }
232
233 #---------- initial checks, startup, main entry form ----------
234
235 die if $styles{Query} =~ m/[^a-z]/;
236
237 my $mydbh;
238 my $dbh= ($mydbh= dbw_connect($styles{Ocean}));
239
240 my $results_head_done=0;
241 my $someresults= sub {
242         return if $results_head_done;
243         $results_head_done=1;
244         my ($h)= @_;
245         $h= 'Results' if !$h;
246         print "\n<h1>$h</h1>\n";
247 };
248
249 </%perl>
250 <%args>
251 $debug => 0
252 </%args>
253
254 <hr>
255
256 <& "query_$styles{Query}", %baseqf, %queryqf, %styles,
257     quri => $quri, dbh => $dbh, queryqf => \%queryqf, allargs => \%ARGS,
258     prselector => $prselector,
259     someresults => $someresults,
260     emsgokorprint => sub {
261         my ($emsg) = @_;
262         return 1 unless defined $emsg and length $emsg;
263         $someresults->();
264         print $emsg;
265         return 0;
266     }
267  &>
268
269 <p>
270
271 %#---------- debugging and epilogue ----------
272
273 % if ($debug) {
274 <p>
275 <pre id="debug_log">
276 Debug log:
277 </pre>
278 % }
279
280 <&| script &>
281 function debug (m) {
282 % if ($debug) {
283   var node= document.getElementById('debug_log');
284   node.innerHTML += "\n" + m + "\n";
285 % }
286 }
287 </&script>
288
289 <& footer &>
290
291 <%init>
292 use CommodsWeb;
293 use HTML::Entities;
294 use URI::Escape;
295
296 </%init>
297 <%cleanup>
298
299 $mydbh->rollback() if $mydbh;
300
301 </%cleanup>