1 <% objToJson($return) %>
6 my $url='http://www.ffiec.gov/Geocode/default.aspx';
8 my $sub = $cgi->param('sub');
15 use HTTP::Request::Common qw( GET POST );
18 if ( $sub eq 'censustract' ) {
20 my %arg = $cgi->param('arg');
21 warn join('', map "$_: $arg{$_}\n", keys %arg )
24 my $ua = new LWP::UserAgent;
25 my $res = $ua->request( GET( $url ) );
30 unless ($res->code eq '200') {
32 $error = $res->message;
36 my $content = $res->content;
37 my $p = new HTML::TokeParser \$content;
40 while (my $token = $p->get_tag('input') ) {
41 if ($token->[1]->{name} eq '__VIEWSTATE') {
42 $viewstate = $token->[1]->{value};
44 if ($token->[1]->{name} eq '__EVENTVALIDATION') {
45 $eventvalidation = $token->[1]->{value};
47 last if $viewstate && $eventvalidation;
50 unless ($viewstate && $eventvalidation ) {
52 $error = "either no __VIEWSTATE or __EVENTVALIDATION found";
56 my($zip5, $zip4) = split('-',$arg{zip});
58 $arg{year} ||= '2011';
59 #ugh workaround a mess at ffiec
60 $arg{year} = " $arg{year}" if $arg{year} ne '2011';
62 __VIEWSTATE => $viewstate,
63 __EVENTVALIDATION => $eventvalidation,
64 ddlbYear => $arg{year},
65 ddlbYear => '2011', #' 2009',
66 txtAddress => $arg{address},
67 txtCity => $arg{city},
68 ddlbState => $arg{state},
70 btnSearch => 'Search',
72 warn join("\n", @ffiec_args )
75 push @{ $ua->requests_redirectable }, 'POST';
76 $res = $ua->request( POST( $url, \@ffiec_args ) );
80 unless ($res->code eq '200') {
82 $error = $res->message;
86 my @id = qw( MSACode StateCode CountyCode TractCode );
87 $content = $res->content;
88 warn $res->content if $DEBUG > 1;
89 $p = new HTML::TokeParser \$content;
90 my $prefix = 'UcGeoResult11_lb';
92 sub { my $t=shift; scalar( grep { lc($t) eq lc("$prefix$_")} @id ) };
94 while (my $token = $p->get_tag('span') ) {
95 next unless ( $token->[1]->{id} && &$compare( $token->[1]->{id} ) );
96 $token->[1]->{id} =~ /^$prefix(\w+)$/;
97 $return->{lc($1)} = $p->get_trimmed_text("/span");
100 $error = "No census tract found" unless $return->{tractcode};
101 $return->{tractcode} .= ' '
102 unless $error || $JSON::VERSION >= 2; #broken JSON 1 workaround
104 } #unless ($res->code eq '200')
106 } #unless ($viewstate)
108 } #unless ($res->code eq '200')
110 $error = "FFIEC Geocoding error: $error" if $error;
111 $return->{'error'} = $error;