The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/local/bin/perl

# This script illustrates how to use JavaScript to validate fill-out
# forms.
use CGI qw(:standard);

# Here's the javascript code that we include in the document.
$JSCRIPT=<<EOF;
    // validate that the user is the right age.  Return
    // false to prevent the form from being submitted.
    function validateForm() {
	var today = new Date();
	var birthday = validateDate(document.form1.birthdate);
	if (birthday == 0) {
	    document.form1.birthdate.focus()
	    document.form1.birthdate.select();
	    return false;
	}
	var milliseconds = today.getTime()-birthday;
	var years = milliseconds/(1000 * 60 * 60 * 24 * 365.25);
	if ((years > 20) || (years < 5)) {
	    alert("You must be between the ages of 5 and 20 to submit this form");
	    document.form1.birthdate.focus();
	    document.form1.birthdate.select();
	    return false;
	}
	// Since we've calculated the age in years already,
	// we might as well send it up to our CGI script.
	document.form1.age.value=Math.floor(years);
	return true;
    }

   // make sure that the contents of the supplied
   // field contain a valid date.
   function validateDate(element) {
       var date = Date.parse(element.value);
       if (0 == date) { 
	   alert("Please enter date in format MMM DD, YY");
	   element.focus();
	   element.select();
       }
       return date;
   }

   // Compliments, compliments
    function doPraise(element) {
	if (element.checked) {
	    self.status=element.value + " is an excellent choice!";
	    return true;
	} else {
	    return false;
	}
    }

    function checkColor(element) {
	var color = element.options[element.selectedIndex].text;
	if (color == "blonde") {
	    if (confirm("Is it true that blondes have more fun?"))
		alert("Darn.  That leaves me out.");
	} else
	    alert(color + " is a fine choice!");
    }
EOF
    ;

# here's where the execution begins
print header;
print start_html(-title=>'Personal Profile',-script=>$JSCRIPT);

print h1("Big Brother Wants to Know All About You"),
    strong("Note: "),"This page uses JavaScript and requires ",
    "Netscape 2.0 or higher to do anything special.";

&print_prompt();
print hr;
&print_response() if param;
print end_html;

sub print_prompt {
    print start_form(-name=>'form1',
		     -onSubmit=>"return validateForm()"),"\n";
    print "Birthdate (e.g. Jan 3, 1972): ", 
          textfield(-name=>'birthdate',
			-onBlur=>"validateDate(this)"),"<p>\n";
    print "Sex: ",radio_group(-name=>'gender',
				  -value=>[qw/male female/],
				  -onClick=>"doPraise(this)"),"<p>\n";
    print "Hair color: ",popup_menu(-name=>'color',
					-value=>[qw/brunette blonde red gray/],
					-default=>'red',
					-onChange=>"checkColor(this)"),"<p>\n";
    print hidden(-name=>'age',-value=>0);
    print submit();
    print end_form;
}

sub print_response {
    import_names('Q');
    print h2("Your profile"),
	"You claim to be a ",b($Q::age)," year old ",b($Q::color,$Q::gender),".",
	"You should be ashamed of yourself for lying so ",
	"blatantly to big brother!",
	hr;
}