chiark / gitweb /
Redo aggregation
[ypp-sc-tools.db-test.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                                 [ 'age', 'Data age' ] ]
61         }, {    Name => 'BuySell',
62                 Before => '',
63                 Values => [     [ 'buy_sell',   'Buy and sell' ],
64                                 [ 'sell_buy',   'Sell and buy' ],
65                                 [ 'buy',        'Buy offers only' ],
66                                 [ 'sell',       'Sell offers only' ],
67                         ],
68                 QuerySpecific => 1,
69         }, {    Name => 'ShowBlank',
70                 Before => '',
71                 Values => [     [ 0, 'Omit islands with no offers' ],
72                                 [ 'show', 'Show all islands' ],
73                         ],
74                 QuerySpecific => 1,
75         }, {    Name => 'ShowStalls',
76                 Before => '',
77                 Values => [     [ 0, 'Show total quantity at each price' ],
78                                 [ 1, 'Show individual stalls' ],
79                         ],
80                 QuerySpecific => 1,
81         });
82
83 foreach my $var (@vars) {
84         my $name= $var->{Name};
85         my $lname= lc $name;
86         $var->{Before}= '' unless exists $var->{Before};
87         $var->{CmpCanon}= sub { $_[0]; } unless exists $var->{CmpCanon};
88         foreach my $val (@{ $var->{Values} }) {
89                 next if ref $val;
90                 $val= [ $val, encode_entities($val) ];
91         }
92         if (exists $ARGS{$lname}) {
93                 $styles{$name}= $ARGS{$lname};
94                 my @html= grep { $_->[0] eq $styles{$name} }
95                                 @{ $var->{Values} };
96                 $ahtml{$name}= @html==1 ? $html[0][1] : '???';
97         } else {
98                 $styles{$name}= $var->{Values}[0][0];
99                 $ahtml{$name}= $var->{Values}[0][1];
100         }
101 }
102
103 </%perl>
104
105 <%shared>
106 my %baseqf;
107 my %queryqf;
108 </%shared>
109
110 <%method formhidden>
111 <%args>
112 $ours
113 </%args>
114 % foreach my $n (keys %baseqf, keys %queryqf) {
115 %       next if $ours->($n);
116 %       my $v= exists $baseqf{$n} ? $baseqf{$n} : $queryqf{$n};
117 <input type=hidden name=<% $n %> value="<% $v |h %>">
118 % }
119 </%method>
120
121 <html><head><title><% ucfirst $ahtml{Query} %> - YARRG</title>
122 <style type="text/css">
123 body {
124   color: #000000;
125   background: #ffffff;
126 }
127 tr.datarow0 { background: #ffffff; }
128 tr.datarow1 { background: #e3e3e3; }
129 </style>
130 </head><body>
131
132 <a href="<% $m->current_comp()->name() |u %>">YARRG</a> -
133  Yet Another Revenue Research Gatherer
134 |
135 <a href="docs">documentation</a>
136 <p>
137 <%perl>
138
139 foreach my $var (@vars) {
140         my $lname= lc $var->{Name};
141         next unless exists $ARGS{$lname};
142         $baseqf{$lname}= $ARGS{$lname};
143 }
144
145 foreach my $var (keys %ARGS) {
146         next unless $var =~
147                 m/^(?: (?:route|commod)string |
148                         islandid \d |
149                         archipelago \d |
150                         debug |
151                         [RT]\w+
152                     )$/x;
153         my $val= $ARGS{$var};
154         next if $val eq 'none';
155         $queryqf{$var}= $val;
156 }
157
158 my $quri= sub {
159         my $uri= URI->new('lookup');
160         $uri->query_form(@_);
161         $uri->path_query();
162 };
163
164 my $prselector_core= sub {
165         my ($var)= @_;
166         my $name= $var->{Name};
167         my $lname= lc $var->{Name};
168         my $delim= $var->{Before};
169         my $canon= &{$var->{CmpCanon}}($styles{$name});
170         my $cvalix= 0;
171         foreach my $valr (@{ $var->{Values} }) {
172                 print $delim;  $delim= "\n|\n";
173                 my ($value,$html) = @$valr;
174                 my $iscurrent= &{$var->{CmpCanon}}($value) eq $canon;
175                 my $after;
176                 if ($iscurrent) {
177                         print '<b>';
178                         $after= '</b>';
179                 } else {
180                         my %qf= (%baseqf,%queryqf);
181                         delete $qf{$lname};
182                         $qf{$lname}= $value if $cvalix;
183 </%perl>
184 <a href="<% $quri->(%qf) |h %>">
185 <%perl>
186                         $after= '</a>';
187                 }
188                 print $html, $after;
189                 $cvalix++;
190         }
191         print "<p>\n\n";
192 };
193
194 my $prselector= sub {
195         my ($name)= @_;
196         foreach my $var (@vars) {
197                 if ($var->{Name} eq $name) {
198                         $prselector_core->($var);
199                         return;
200                 }
201         }
202         die $name;
203 };
204
205 foreach my $var (@vars) {
206         next if $var->{QuerySpecific};
207         $prselector_core->($var);
208 }
209
210 #---------- initial checks, startup, main entry form ----------
211
212 die if $styles{Query} =~ m/[^a-z]/;
213
214 my $mydbh;
215 my $dbh= ($mydbh= dbw_connect($styles{Ocean}));
216
217 my $results_head_done=0;
218 my $someresults= sub {
219         return if $results_head_done;
220         $results_head_done=1;
221         my ($h)= @_;
222         $h= 'Results' if !$h;
223         print "\n<h1>$h</h1>\n";
224 };
225
226 </%perl>
227 <%args>
228 $debug => 0
229 </%args>
230
231 <hr>
232
233 <& "query_$styles{Query}", %baseqf, %queryqf, %styles,
234     quri => $quri, dbh => $dbh,
235     prselector => $prselector,
236     someresults => $someresults,
237     emsgokorprint => sub {
238         my ($emsg) = @_;
239         return 1 unless defined $emsg and length $emsg;
240         $someresults->();
241         print $emsg;
242         return 0;
243     }
244  &>
245
246 <p>
247
248 %#---------- debugging and epilogue ----------
249
250 % if ($debug) {
251 <p>
252 <pre id="debug_log">
253 Debug log:
254 </pre>
255 % }
256
257 <&| script &>
258 function debug (m) {
259 % if ($debug) {
260   var node= document.getElementById('debug_log');
261   node.innerHTML += "\n" + m + "\n";
262 % }
263 }
264 </&script>
265
266 <& footer &>
267
268 <%init>
269 use CommodsWeb;
270 use HTML::Entities;
271 use URI::Escape;
272
273 </%init>
274 <%cleanup>
275
276 $mydbh->rollback() if $mydbh;
277
278 </%cleanup>