#!/usr/bin/perl use strict; use warnings; use CGI; use HTML::Prototype; use MIME::Base64; use Template; my $query = CGI->new; $query->charset("utf-8"); dispatch($query); sub dispatch { my $query = shift; if ($query->param('from')) { do_convert($query); } elsif ($query->param('spinner')) { show_spinner($query); } else { show_form($query); } } sub do_convert { my $query = shift; my $from = validate_unit($query->param('from')); my $to = validate_unit($query->param('to')); my $func = "convert_${from}_${to}"; no strict 'refs'; my $value = eval { $func->(validate_number($query->param('value'))) }; if ($@) { print $query->header, "ERR: Can't do $from to $to conversion: $@"; return; } my $format = $value > 0 ? '%.4f' : '%.8f'; $value = sprintf $format, $value; print $query->header, $value; } sub validate_unit { my $input = shift; return ($input =~ /^(\w+)$/)[0]; } sub validate_number { my $input = shift; return ($input =~ /^([\-\+\d\.]+)/)[0]; } sub convert_usd_jpy { require Finance::Currency::Convert::Yahoo; Finance::Currency::Convert::Yahoo::convert($_[0], 'USD', 'JPY'); } sub convert_jpy_usd { require Finance::Currency::Convert::Yahoo; Finance::Currency::Convert::Yahoo::convert($_[0], 'JPY', 'USD'); } sub convert_inch_meter { return 0.0254 * $_[0]; } sub convert_meter_inch { return $_[0] / 0.0254; } sub convert_inch_feet { return $_[0] / 12; } sub convert_feet_inch { return $_[0] * 12; } sub convert_oz_pound { return $_[0] / 16; } sub convert_pound_oz { return $_[0] * 16; } sub convert_g_pound { return $_[0] / 453.59237; } sub convert_pound_g { return $_[0] * 453.59237; } sub convert_sqf_sqm { return $_[0] * 0.09290304; } sub convert_sqm_sqf { return $_[0] / 0.09290304; } sub show_form { my $query = shift; my $tt = Template->new; my $template = show_form_template(); my $stash; $stash->{prototype} = HTML::Prototype->new; $stash->{cgi} = $query; print $query->header('text/html'); $tt->process(\$template, $stash); } sub show_form_template { return <<'TEMPLATE'; [% SET title = "Unit Converter (Japan and United States)" -%] [% title %] [% prototype.define_javascript_functions %]

[% title %]

Currency

USD = JPY

Length

feet = inches = meters

Weight

pounds = oz = g

Dimensions

square feet = m2

TEMPLATE } sub show_spinner { my $query = shift; print $query->header('image/gif'), decode_base64(<