function FormHandler(form, div, eDiv, url, btn) {
	var feedbackDiv = div;
	var errorDiv = eDiv;
	var theForm = form;
	var submitUrl = url;
	var submitBtn = btn;
	var submitBtnTxt = submitBtn.value;
	
	this.errorMessage = errorMessage;
	this.showFeedback = showFeedback;
	this.resetForm = resetForm;
	this.submitForm = submitForm;
	
	function errorMessage(/* string */txt, /* boolean */reset) {
		errorDiv.style.display = "block";
		if (reset) {
			errorDiv.innerHTML = "<p class=\"error\">" + txt + "</p>";
		} else {
			errorDiv.innerHTML += "<p class=\"error\">" + txt + "</p>";
		}
		submitBtn.value = submitBtnTxt;
		submitBtn.disabled = "";
	}
	
	function showFeedback(/* string */txt) {
		dojo.debug("Should be logging feedback '" + txt + "'");
		feedbackDiv.style.display = "block";
		feedbackDiv.innerHTML = "<p>" + txt + "</p>";
		dojo.debug("innerHTML=" + feedbackDiv.innerHTML);
		submitBtn.value = submitBtnTxt;
		submitBtn.disabled = "";
	}
	
	function resetForm() {
		feedbackDiv.innerHTML = "";
		feedbackDiv.style.display = "none";
		theForm.style.display = "block";
	}
	
	function submitForm() {
		var bindArgs = {
			url:			submitUrl,
			mimetype:	"text/plain",
			method:		"POST",
			error:		function(type, errorObj) { processError(errorObj); },
			load:			function(type, data, evt) { processResult(data); },
			formNode: theForm,
			content:	{
				f: "xml"
			}
		}
		
		submitBtn.value = "Sending...";
		submitBtn.disabled = "disabled";
		
		return dojo.io.bind(bindArgs);
	}
	
	function processError(/* object */eo) {
		dojo.debug(eo.message);
		errorMessage("Sorry, there was an error processing your form.  Please try again.  We apologize for the inconvenience.", true);
	}
	
	function processResult(/* string */data) {
		dojo.debug("Result: ", data);

		try {
			var xmlDoc = dojo.dom.createDocumentFromText(data);
		} catch (e) {
			dojo.debug("Error creating DOM doc: " + e.message);
		}
		
		try {
			var parser = new dojo.xml.Parse();
		} catch(e) {
			dojo.debug("Error instantiating Parse: " + e.message);
		}
		
		try {
			var topElm = dojo.dom.firstElement(xmlDoc);
		} catch(e) {
			dojo.debug("Error getting firstElement() in DOM doc: " + e.message);
		}
		
		try {
			var parsedNodes = parser.parseElement(topElm, false, false, 0);
		} catch(e) {
			dojo.debug("Error running parseElement(): " + e.message);
		}
		
		if (parsedNodes.error) {
			errorMessage(parsedNodes.error[0].value, true);
			return false;
		}
		
		if (parsedNodes.success) {
			theForm.style.display = "none";
			showFeedback(parsedNodes.success[0].value);
		}
	}
}

function FormValidator() {
	
	this.isValidEmail = isValidEmail;

/**
 * Email validation script. Based on code from SmartWebby.com (http://www.smartwebby.com/dhtml/)
 */
	function isValidEmail(str) {
		var at = "@";
		var dot = ".";
		var lat = str.indexOf(at);
		var lstr = str.length;
		var ldot = str.indexOf(dot);
		
		if (str.indexOf(at) == -1) {
			 return false;
		}
	
		if (str.indexOf(at) == -1 || str.indexOf(at) == 0 || str.indexOf(at) == lstr) {
			 return false;
		}
	
		if (str.indexOf(dot) == -1 || str.indexOf(dot) == 0 || str.indexOf(dot) == lstr) {
			return false;
		}
	
		if (str.indexOf(at, (lat+1)) != -1) {
			return false;
		}
		
		if (str.substring(lat-1, lat) == dot || str.substring(lat+1, lat+2) == dot) {
			return false;
		}
		
		if (str.indexOf(dot, (lat+2)) == -1) {
			return false;
		}
		
		if (str.indexOf(" ") != -1) {
			return false;
		}
		
		return true;
	}
	
}
