function emailCheck(emailStr)
{
	var checkTLD		= 1; // Verify that the address ends in a two-letter country or well-known TLD.  1 means check it, 0 means don't.
	var knownDomsPat	= /^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/; // List of known TLDs that an e-mail address must end with.
	var emailPat		= /^(.+)@(.+)$/; // Check if the entered e-mail address fits the user@domain format.  It also is used to separate the username from the domain.
	var specialChars	= "\\(\\)><@,;:\\\\\\\"\\.\\[\\]"; // Pattern for matching all special characters.  Don't want to allow special characters in the address.
	var validChars		= "\[^\\s" + specialChars + "\]"; // Range of characters allowed in a username or domainname.  It really states which chars aren't allowed.
	var quotedUser		= "(\"[^\"]*\")"; // Applies if quoted user (there are no rules about which characters are allowed), i.e. "jiminy cricket"@disney.com is legal.
	var ipDomainPat		= /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/; //Applies for domains that are IP addresses, i.e. joe@[123.124.233.4] is a legal address.
	var atom			= validChars + '+'; // An atom, basically a series of non-special characters.
	var word			= "(" + atom + "|" + quotedUser + ")"; // One word in the typical username.
	var userPat			= new RegExp("^" + word + "(\\." + word + ")*$"); // Describes the structure of the user.
	var domainPat		= new RegExp("^" + atom + "(\\." + atom +")*$"); // Describes the structure of a normal symbolic domain, as opposed to ipDomainPat above.

	/* Begin with the coarse pattern to simply break up user@domain into different pieces that are easy to analyze. */
	var matchArray = emailStr.match(emailPat);
	if(matchArray == null) {
		/* Too many/few @'s or something; this address doesn't fit the general mould of a valid e-mail address. */
		alert("Email address seems incorrect (check @ and .'s)");
		return false;
	}

	var user	= matchArray[1];
	var domain	= matchArray[2];

	// Start by checking that only basic ASCII characters are in the strings (0-127).
	for(i = 0; i < user.length; i++) {
		if(user.charCodeAt(i) > 127) {
			alert("Ths username contains invalid characters.");
			return false;
		}
	}
	for(i = 0; i < domain.length; i++) {
		if(domain.charCodeAt(i) > 127) {
			alert("Ths domain name contains invalid characters.");
			return false;
		}
	}

	// See if "user" is valid.
	if(user.match(userPat) == null) {
		alert("The username doesn't seem to be valid.");
		return false;
	}

	/* If the e-mail address is at an IP address (as opposed to a symbolic host name) make sure the IP address is valid. */
	var IPArray	= domain.match(ipDomainPat);
	if(IPArray != null) {
		for(var i = 1;i <= 4; i++) {
			if(IPArray[i] > 255) {
				alert("Destination IP address is invalid!");
				return false;
			}
		}
		return true;
	}

	// Domain is symbolic name.  Check if it's valid.
	var atomPat	= new RegExp("^" + atom + "$");
	var domArr	= domain.split(".");
	var len		= domArr.length;

	for(i = 0; i < len; i++) {
		if(domArr[i].search(atomPat) == -1) {
			alert("The domain name does not seem to be valid.");
			return false;
		}
	}

	/* Domain name seems valid, now make sure that it ends in a known top-level domain, two-letters representing a country, and that there's a hostname preceding. */
	if(checkTLD && domArr[domArr.length - 1].length != 2 && domArr[domArr.length - 1].search(knownDomsPat) == -1) {
		alert("The address must end in a well-known domain or two letter " + "country.");
		return false;
	}

	// Make sure there's a host name preceding the domain.
	if(len < 2) {
		alert("This address is missing a hostname!");
		return false;
	}

	// If we've gotten this far, everything's valid!
	return true;
}


function validate(form)
{
	// Validate the fields if the "Submit" button was pressed.  Repeated on server side...
	if(form.name.value == "") {
		alert("Your name is empty.");
		return false;
	}
	if(form.area.value == "") {
		alert("The Guidebook Area is empty.");
		return false;
	}
	if(form.notes.value == "") {
		alert("Your notes are empty.");
		return false;
	}
	if(form.email_address.value == "") {
		alert("Your e-mail address is empty.");
		return false;
	}
	if(form.photo.value == "") {
		alert("You must choose a photo to upload.");
		return false;
	}
	if(form.use.value != "on") {
		alert("You must accept the intended use terms & conditions.");
		return false;
	}
	return emailCheck(form.email_address.value);
}

