print '<p>';
}
-db_setocean($a{'ocean'});
+db_setocean($a{Ocean});
db_connect();
</%perl>
% if (!$a{Dropdowns}) {
Enter route (islands, or archipelagoes, separated by commas;
- abbreviations are OK):<br>
+ abbreviations are OK):<br/>
<script type="text/javascript">
+textRoute_uri= "routetextstring?format=json"
+ + "&ocean=<% uri_escape($a{Ocean}) %>";
+
textRoute_timeout=false;
textRoute_request=false;
textRoute_done='';
textRoute_Request();
}
function textRoute_Request(){
- if (textRoute_request || textRoute_needed==textRoute_done) {
- alert('unneeded');
- return;
- }
+ if (textRoute_request || textRoute_needed==textRoute_done) return;
textRoute_done= textRoute_needed;
- alert(String.concat('needed! ',textRoute_done));
+ textRoute_request= new XMLHttpRequest();
+ uri= textRoute_uri+'&string='+encodeURIComponent(textRoute_needed);
+ textRoute_request.open('GET', uri);
+ textRoute_request.onreadystatechange= textRoute_Ready;
+ textRoute_request.send(null);
+}
+function textRoute_Ready() {
+ if (textRoute_request.readyState != 4) return;
+ if (textRoute_request.status == 200) {
+ response= textRoute_request.responseText;
+ //alert('got [[ '+response+' ]]');
+ eval('results='+response);
+ toedit= document.getElementsByName('routeresults').item(0);
+ toedit.innerHTML= results['show'];
+ }
+ textRoute_request= false;
+ textRoute_Request();
}
</script>
<input type="text" name="routestring" size=80
onchange="textRoute_element= event.currentTarget; textRoute_Needed();"
onkeydown="textRoute_element= event.currentTarget; textRoute_Later();"><br>
-<div name="results"></div></br>
+<div name="routeresults"></div><br/>
% } else {
<option name="none">Select island...</option>
<% $islandlistdata %></select></td>
% }
-% }
</tr>
</table>
+% }
<input type=submit name=submit value="Go">
</form>
<%init>
use CommodsWeb;
use HTML::Entities;
+use URI::Escape;
</%init>
--- /dev/null
+<%args>
+$ocean
+$format
+$ctype => undef
+$string
+</%args>
+<%perl>
+
+use CommodsWeb;
+use HTML::Entities;
+use JSON;
+
+db_setocean($ocean);
+db_connect();
+
+my $sth= $dbh->prepare("SELECT archipelago,islandid,islandname
+ FROM islands WHERE islandname LIKE ?
+ UNION ALL SELECT DISTINCT archipelago,NULL,archipelago
+ FROM islands WHERE archipelago LIKE ?");
+
+my (@results, $canontext);
+my ($output, $output_wrong);
+
+if ($format =~ 'json') {
+ $r->content_type($ctype or $format);
+ $output= sub { print to_json({
+ success => 1,
+ show => encode_entities($canontext),
+ })};
+ $output_wrong= sub { print to_json({
+ success => 0,
+ show => encode_entities($_[0]),
+ })};
+}
+
+foreach my $each (split m#[/|,]#, $string) {
+ $each =~ s/^\s*//; $each =~ s/\s*$//; $each =~ s/\s+/ /g;
+ next if !length $each;
+ my $pat= "\%$each\%";
+ my $nrows= $sth->execute($pat,$pat);
+ my $err= sub {
+ my $msg= sprintf $_[0], encode_entities($each);
+ $output_wrong->($msg);
+ $m->abort();
+ };
+ my $results= $sth->fetchall_arrayref();
+ if (!@$results) {
+ $err->('no island or arch matches "%s"');
+ } elsif (@$results > 3) {
+ $err->('');
+ } elsif (@$results > 1) {
+ my @m= map { $_->[2] } @$results;
+ $err->('ambiguous island or arch "%s", could be '.
+ join(', ', @m));
+ }
+ push @results, $results->[0];
+}
+
+$canontext= join ' | ', map { encode_entities($_->[2]) } @results;
+
+$output->();
+
+</%perl>