function verifyFields() {
	// form fields to grab data from
	var fields = ["from", "name", "custom Company", "custom Zip or Postal Code", 
			"custom Country", "custom Taken previous course", "custom Colleague",
			"custom Print ad", "custom Search engine", "custom Zip Code"];
	
	// string to be POSTed
	var postStr = "";

	// reset the error field's text to empty
	_getElementById("errorField").innerHTML = "";

	// grab each of the field's values, build post string
	for (var i = 0; i < fields.length; i++) {
		var field = document.getElementsByName(fields[i]);

		// test that the field exists
		if (field.length == 0) {
			debug("couldn't find field " + fields[i]);
		} else {
			// build the post string
			var fieldStr = fields[i] + "=" + field[0].value;
			postStr += (postStr == "") ? fieldStr : ("&" + fieldStr);

			// reset the field's border
			field[0].style.border = "";
		}
	}

	// URL of newsletter signup processor
	var url = "/newsletter-process.php";

	// fire of the XMLHTTPRequest
	_xmlHttpRequest(url, postStr, function(text) {
		// if there was a failure
		if (text != "success") {
			// set error field text
			_getElementById("errorField").innerHTML = "missing required fields";

			// split the response to get field names for failed fields
			var badFields = text.split(";");

			// iterate through the field names
			for (var i = 0; i < badFields.length; i++) {
				// get field element(s)
				var fields = document.getElementsByName(badFields[i]);

				// if we got exactly one field element
				if (fields.length == 1) {
					// set the border to be red
					fields[0].style.border = "2px solid red";
				} else {
					// throw debug msg otherwise
					debug("field not found: " + badFields[i]);
				}
			}
		} else {
			// otherwise, success, so just redirect to confirmation page
			window.location = "http://www.carldyke.com/wordpress/newsletter-confirmed/";
		}

	});
}
