#!/usr/bin/env perl
use strict;
use warnings;

use CGI qw/ :standard /;
use CGI::Carp qw( fatalsToBrowser );
use Cwd;

my $GRIDPROGRAM = "./gridder.pl";

my %globals = (
    'x' => 4,
    'y' => 4,
    'n' => 7,
    'xspace' => 50,
    'yspace' => 50,
    'offset' => 0,
    'proximity' => 10,
    'min' => 55,
    'max' => 200,
    );
#my $query=CGI::new();
print header('text/html');
print start_html(
    -title => 'Map Course'
);

if (param('go')) {
    make_course();
} else {
    print_query_form();
}

print end_html;
exit 0;

sub print_query_form {
    print h1('Create Map Course');
    print start_form;
    load_globals();
    save_globals();
    print table(
	Tr(
	    td(
		strong("Number of points in course: "),
	    ),
	    td(
		textfield(
		    -name      => 'n',
		    -default   => ($globals{'n'} ? $globals{'n'} : "7"),
		    -size      => 3,
		    -maxlength => 3,
		),
	    ),
	),
	Tr(
	    td(
		strong("Minimum leg length (meters): "),
	    ),
	    td(
		textfield(
		    -name      => 'min',
		    -default   => ($globals{'min'} ? $globals{'min'} : "55"),
		    -size      => 3,
		    -maxlength => 3,
		),
	    ),
	),
	Tr(
	    td(
		strong("Maximum leg length (meters): "),
	    ),
	    td(
		textfield(
		    -name      => 'max',
		    -default   => ($globals{'max'} ? $globals{'max'} : "200"),
		    -size      => 3,
		    -maxlength => 3,
		),
	    ),
	),
	Tr(
	    td(
		strong("Grid points (east-west): ")
	    ),
	    td(
		textfield(
		    -name      => 'x',
		    -default   => ( $globals{'x'} ? $globals{'x'} : "4" ),
		    -size      => 3,
		    -maxlength => 3,
		),
	    ),
	),
	Tr(
	    td(
		strong("Grid points (north-south): "),
	    ),
	    td(
		textfield(
		    -name      => 'y',
		    -default   => ($globals{'y'} ? $globals{'y'} : "4"),
		    -size      => 3,
		    -maxlength => 3,
		)
	    )
	),
	Tr(
	    td(hr),
	    td(hr),
	),
	Tr(
	    td(
		strong("East-west spacing (meters): "),
	    ),
	    td(
		textfield(
		    -name      => 'xspace',
		    -default   => ($globals{'xspace'} ? $globals{'xspace'} : "50"),
		    -size      => 3,
		    -maxlength => 3,
		),
	    ),
	),
	Tr(
	    td(
		strong("North-south spacing (meters): "),
	    ),
	    td(
		textfield(
		    -name      => 'yspace',
		    -default   => ($globals{'yspace'} ? $globals{'yspace'} : "50"),
		    -size      => 3,
		    -maxlength => 3,
		),
	    ),
	),
	Tr(
	    td(
		strong("Bearing offset (degrees): "),
	    ),
	    td(
		textfield(
		    -name      => 'offset',
		    -default   => ($globals{'offset'} ? $globals{'offset'} : "0"),
		    -size      => 3,
		    -maxlength => 3,
		),
	    ),
	),
	Tr(
	    td(
		strong("Path/point proximity (meters): "),
	    ),
	    td(
		textfield(
		    -name      => 'proximity',
		    -default   => ($globals{'proximity'} ? $globals{'proximity'} : "10"),
		    -size      => 3,
		    -maxlength => 3,
		),
	    ),
	),
	Tr(
	    td(),
	    td(
		submit('go', 'Go', 'go'),
	    ),
	),
	);  
    save_globals();
    print end_form;
}

sub make_course {
    print start_form;
    load_globals();
    save_globals();

    my $CMD="./gridder.pl";
    my $x = $globals{'x'};
    my $y = $globals{'y'};
    my $n = $globals{'n'};
    my $xspace = $globals{'xspace'};
    my $yspace = $globals{'yspace'};
    my $offset = $globals{'offset'};
    my $proximity = $globals{'proximity'};
    my $min = $globals{'min'};
    my $max = $globals{'max'};

    my $runcmd = $CMD . " --x " . $x . " --y " . $y . " --n " . $n . 
	" --xspace " . $xspace . " --yspace " . $yspace . 
	" --bearingoffset " . $offset . " --proximity " . $proximity .
	" --min " . $min . " --max " . $max .
	" --format html";
    my @output = `$runcmd`;
    for (@output) {
	print;
    }
    print p(
	"Reload page for new course, or ",
	(a ( { href => "./gridder.cgi" }, "set new course parameters")),
	 "."
	);
    save_globals();
    print end_form;
}

sub load_globals {
    for (param) {
	next unless /^h_/;
	my $key = $_;
	s/^h_//;
	$globals{$_} = param($key);

	#param($_) = param($key);
    }
}

sub save_globals {
    for (param) {
	next if /^h_/;
	$globals{$_} = param($_);
	next if (($_ eq "go") or ($_ eq "another") or ($_ eq "return"));
	print hidden(
	    -name     => 'h_' . $_,
	    -default  => param($_),
	    -override => 1
	    );
    }
}
