chiark / gitweb /
Merge branch 'refs/remote/t.fa.mason'
[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 <& style.css &>
132   body { color: #000000; background: #c5c7ae; }
133   div.query { background: #d7d8b3; padding: 1em; }
134   div.results { padding: 1em; }
135   table.data { background: #b5b686; }
136   tr.datarow0 { background: #e3e3e3; }
137   tr.datarow1 { background: #ffffff; }
138 </style>
139 <&| script &>
140   function register_onload(f) {
141     var previous_onload= window.onload;
142     window.onload= function() {
143       if (previous_onload) previous_onload();
144       f();
145     };
146   }
147 </&script>
148 </head><body>
149
150 % if (!printable($m)) {
151 <div class="navoptbar">
152 <a href="<% $m->current_comp()->name() |u %>">YARRG</a> -
153  Yet Another Revenue Research Gatherer
154 |
155 <a href="intro">introduction</a>
156 |
157 <a href="docs">documentation</a>
158 |
159 <a href="devel">development</a>
160 <p>
161 % }
162 <%perl>
163
164 foreach my $var (@vars) {
165         my $lname= lc $var->{Name};
166         next unless exists $ARGS{$lname};
167         $baseqf{$lname}= $ARGS{$lname};
168 }
169
170 foreach my $var (keys %ARGS) {
171         next unless $var =~
172                 m/^(?: (?:route|commod|capacity|capital|island)string |
173                         lossperleague | distance |
174                         commodid |
175                         islandid \d |
176                         archipelago \d |
177                         debug |
178                         [RT]\w+
179                     )$/x;
180         my $val= $ARGS{$var};
181         next if $val eq 'none';
182         $queryqf{$var}= $val;
183 }
184
185 my $quri= sub {
186         my $uri= URI->new('lookup');
187         $uri->query_form(@_);
188         $uri->path_query();
189 };
190
191 my $prselector_core= sub {
192         my ($var)= @_;
193         return if printable($m);
194         my $name= $var->{Name};
195         my $lname= lc $var->{Name};
196         my $delim= $var->{Before};
197         my $canon= &{$var->{CmpCanon}}($styles{$name});
198         my $cvalix= 0;
199         foreach my $valr (@{ $var->{Values} }) {
200                 print $delim;  $delim= "\n|\n";
201                 my ($value,$html) = @$valr;
202                 my $iscurrent= &{$var->{CmpCanon}}($value) eq $canon;
203                 my $after;
204                 if ($iscurrent) {
205                         print '<b>';
206                         $after= '</b>';
207                 } else {
208                         my %qf= (%baseqf,%queryqf);
209                         delete $qf{$lname};
210                         $qf{$lname}= $value if $cvalix;
211 </%perl>
212 <a href="<% $quri->(%qf) |h %>">
213 <%perl>
214                         $after= '</a>';
215                 }
216                 print $html, $after;
217                 $cvalix++;
218         }
219         print "<p>\n\n";
220 };
221
222 my $prselector= sub {
223         my ($name)= @_;
224         foreach my $var (@vars) {
225                 if ($var->{Name} eq $name) {
226                         $prselector_core->($var);
227                         return;
228                 }
229         }
230         die $name;
231 };
232
233 foreach my $var (@vars) {
234         next if $var->{QuerySpecific};
235         $prselector_core->($var);
236 }
237
238 #---------- initial checks, startup, main entry form ----------
239
240 die if $styles{Query} =~ m/[^a-z]/;
241
242 my $mydbh;
243 my $dbh= ($mydbh= dbw_connect($styles{Ocean}));
244
245 my $results_head_done=0;
246 my $someresults= sub {
247         return if $results_head_done;
248         $results_head_done=1;
249         my ($h)= @_;
250         $h= 'Results' if !$h;
251         print "\n<h1>$h</h1>\n";
252 };
253
254 </%perl>
255 <%args>
256 $debug => 0
257 </%args>
258
259 % if (!printable($m)) {
260 </div>
261 <hr>
262 % }
263
264 <& "query_$styles{Query}", %baseqf, %queryqf, %styles,
265     quri => $quri, dbh => $dbh,
266     baseqf => \%baseqf, queryqf => \%queryqf, allargs => \%ARGS,
267     prselector => $prselector,
268     someresults => $someresults,
269     emsgokorprint => sub {
270         my ($emsg) = @_;
271         return 1 unless defined $emsg and length $emsg;
272         $someresults->();
273         print $emsg;
274         return 0;
275     }
276  &>
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>