[public] / misc / unitconverter.cgi  

View of /misc/unitconverter.cgi

Parent Directory | Revision Log
Revision: 2132 - (download)
Thu Jan 18 07:29:53 2007 UTC (6 years, 4 months ago) by miyagawa
File size: 8166 byte(s)
fixed inch to meter conversion
#!/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)" -%]
<html>
<head>
<title>[% title %]</title>
<style>
body,input,td { font-size: 11px; font-family: trebuchet MS }
input { background: #fff }
h1 { font-size: 2em }
h2 { font-size: 1.6em }
</style>
[% prototype.define_javascript_functions %]
<script>
var url = "[% cgi.url %]";
function doConvert(input, from, to, unit) {
  var spinner = unit + "-spinner";
  $(to).value = ''; // clear
  $(spinner).innerHTML = "<img src=\"[% cgi.url %]?spinner=1\" style=\"vertical-align:middle\" />";
  var query = "value=" + encodeURIComponent(input.value) + "&from=" + from + "&to=" + to;
  new Ajax.Request(
    url,
    { method: 'get',
      parameters: query,
      onComplete: function(req) { $(to).value = req.responseText; $(spinner).innerHTML = ""; } }
  );
}
</script>
</head>
<body>
<h1>[% title %]</h1>

<h2>Currency</h2>
<p>
<input type="text" size="12" id="usd" onchange="doConvert(this, 'usd', 'jpy', 'currency')" /> USD =
<input type="text" size="12" id="jpy" onchange="doConvert(this, 'jpy', 'usd', 'currency')" /> JPY
<span id="currency-spinner"></span>
</p>

<h2>Length</h2>
<p>
<input type="text" size="12" id="feet" onchange="doConvert(this, 'feet', 'inch', 'length');doConvert(this, 'inch', 'meter', 'length')" /> feet =
<input type="text" size="12" id="inch" onchange="doConvert(this, 'inch', 'meter', 'length');doConvert(this, 'inch', 'feet', 'length')" /> inches =
<input type="text" size="12" id="meter" onchange="doConvert(this, 'meter', 'inch', 'length');doConvert(this, 'inch', 'feet', 'length')" /> meters
<span id="length-spinner"></span>
</p>

<h2>Weight</h2>
<p>
<input type="text" size="12" id="pound" onchange="doConvert(this, 'pound', 'oz', 'weight');doConvert(this, 'pound', 'g', 'weight')" /> pounds =
<input type="text" size="12" id="oz" onchange="doConvert(this, 'oz', 'pound', 'weight');doConvert(this, 'pound', 'g', 'weight')" /> oz =
<input type="text" size="12" id="g" onchange="doConvert(this, 'g', 'pound', 'weight');doConvert(this, 'pound', 'oz', 'weight')" /> g
<span id="weight-spinner"></span>
</p>

<h2>Dimensions</h2>
<p>
<input type="text" size="12" id="sqf" onchange="doConvert(this, 'sqf', 'sqm', 'dimensions')" /> square feet =
<input type="text" size="12" id="sqm" onchange="doConvert(this, 'sqm', 'sqf', 'dimensions')" /> m<sup>2</sup>
<span id="dimensions-spinner"></span>
</p>


TEMPLATE
}

sub show_spinner {
    my $query = shift;
    print $query->header('image/gif'), decode_base64(<<IMAGE);
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
ISADghsLBDEhIwRfGyMWGA8NXBEAOw==
IMAGE
}

Tatsuhiko Miyagawa

Powered by ViewCVS 1.0-dev

ViewCVS and CVS Help