chiark / gitweb /
683fd12b8ddf4b60c35c71e4a0f06cd8d4c056ce
[ypp-sc-tools.web-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                                 [ '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 amount 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></head><body>
122
123 <a href="<% $m->current_comp()->name() |u %>">YARRG</a> -
124  Yet Another Revenue Research Gatherer
125 |
126 <a href="docs">documentation</a>
127 <p>
128 <%perl>
129
130 foreach my $var (@vars) {
131         my $lname= lc $var->{Name};
132         next unless exists $ARGS{$lname};
133         $baseqf{$lname}= $ARGS{$lname};
134 }
135
136 foreach my $var (keys %ARGS) {
137         next unless $var =~
138                 m/^(?:(?:route|commod)string|islandid\d|archipelago\d|debug)$/;
139         my $val= $ARGS{$var};
140         next if $val eq 'none';
141         $queryqf{$var}= $val;
142 }
143
144 my $quri= sub {
145         my $uri= URI->new('lookup');
146         $uri->query_form(@_);
147         $uri->path_query();
148 };
149
150 my $prselector_core= sub {
151         my ($var)= @_;
152         my $name= $var->{Name};
153         my $lname= lc $var->{Name};
154         my $delim= $var->{Before};
155         my $canon= &{$var->{CmpCanon}}($styles{$name});
156         my $cvalix= 0;
157         foreach my $valr (@{ $var->{Values} }) {
158                 print $delim;  $delim= "\n|\n";
159                 my ($value,$html) = @$valr;
160                 my $iscurrent= &{$var->{CmpCanon}}($value) eq $canon;
161                 my $after;
162                 if ($iscurrent) {
163                         print '<b>';
164                         $after= '</b>';
165                 } else {
166                         my %qf= (%baseqf,%queryqf);
167                         delete $qf{$lname};
168                         $qf{$lname}= $value if $cvalix;
169 </%perl>
170 <a href="<% $quri->(%qf) |h %>">
171 <%perl>
172                         $after= '</a>';
173                 }
174                 print $html, $after;
175                 $cvalix++;
176         }
177         print "<p>\n\n";
178 };
179
180 my $prselector= sub {
181         my ($name)= @_;
182         foreach my $var (@vars) {
183                 if ($var->{Name} eq $name) {
184                         $prselector_core->($var);
185                         return;
186                 }
187         }
188         die $name;
189 };
190
191 foreach my $var (@vars) {
192         next if $var->{QuerySpecific};
193         $prselector_core->($var);
194 }
195
196 #---------- initial checks, startup, main entry form ----------
197
198 die if $styles{Query} =~ m/[^a-z]/;
199
200 my $mydbh;
201 my $dbh= ($mydbh= dbw_connect($styles{Ocean}));
202
203 my $results_head_done=0;
204 my $someresults= sub {
205         return if $results_head_done;
206         $results_head_done=1;
207         print "\n<h1>Results</h1>\n";
208 };
209
210 </%perl>
211 <%args>
212 $debug => 0
213 </%args>
214
215 <hr>
216
217 <& "query_$styles{Query}", %baseqf, %queryqf, %styles,
218     quri => $quri, dbh => $dbh,
219     prselector => $prselector,
220     someresults => $someresults,
221     emsgokorprint => sub {
222         my ($emsg) = @_;
223         return 1 unless defined $emsg and length $emsg;
224         $someresults->();
225         print $emsg;
226         return 0;
227     }
228  &>
229
230 <p>
231
232 %#---------- debugging and epilogue ----------
233
234 % if ($debug) {
235 <p>
236 <pre id="debug_log">
237 Debug log:
238 </pre>
239 % }
240
241 <&| script &>
242 function debug (m) {
243 % if ($debug) {
244   var node= document.getElementById('debug_log');
245   node.innerHTML += "\n" + m + "\n";
246 % }
247 }
248 </&script>
249
250 <& footer &>
251
252 <%init>
253 use CommodsWeb;
254 use HTML::Entities;
255 use URI::Escape;
256
257 </%init>
258 <%cleanup>
259
260 $mydbh->rollback() if $mydbh;
261
262 </%cleanup>