/* Allow the calling page to decide the main container id */
var contentId;
if (typeof(contentId) == "undefined") {
	contentId = "body";
}

/* Don't initialize the forms until the document has loaded */
YAHOO.util.Event.onContentReady(contentId, initForms);

/* Prepare all the forms to use the AJAX validation */
function initForms(oBody) {
	var aForms = YAHOO.util.Dom.getElementsByClassName("ajaxForm", "form", oBody);
	for ( var i = 0; i < aForms.length; i++ ) {
		YAHOO.util.Event.addListener(aForms[i], "submit", ajaxValidate);
		aForms[i]._isSubmitting = false;
	}
}

/* Make the AJAX call */
function ajaxValidate(eFormSubmit) {
	var oForm = this;
	/* Stop the Submission */
	YAHOO.util.Event.stopEvent(eFormSubmit);
	/* Check/Set Status, only allow one submission at a time */
	if (oForm._isSubmitting) {
		return;
	} else {
		oForm._isSubmitting = true;
	}
	/* AJAX callback Object */
	var formCallback = {
		success: function (oResponse) { ajaxSuccess(oResponse, oForm); },
		failure: function (oResponse) { oForm.submit(); }
	};
	/* Do AJAX */
	YAHOO.util.Connect.setForm(oForm);
	YAHOO.util.Connect.asyncRequest(oForm.method, oForm.action, formCallback, 'ajaxCall=1');
}

/* Handle a successful ajax call */
function ajaxSuccess (oResponse, oForm) {
	var bFormValid = true,
		errorMsg = "",
		key = "";
	try {
		//handle a successful response
		if ( oResponse.responseText.length > 0 ) {
			/* Parse the JSON response */
			var response = oResponse.responseText.parseJSON();
			/* Clear Error Styles */
			for (var i = 0; i < oForm.elements.length; i++) {
				if ( oForm.elements[i].type !== undefined ) {
					setFieldRequired(oForm.elements[i], false);
					removeError(oForm.elements[i], "change");
				}
			}
			/* Loop over the response */
			for ( var i = 0; i < response.names.length; i++ ) {
				key = response.names[i];
				bFormValid = bFormValid & response.fields[key].valid;
				setFieldRequired(oForm[key], response.fields[key].required);
				if ( !response.fields[key].valid ) {
					if ( response.fields[key].errorMsg.length > 0 ) {
						errorMsg += "\n - " + response.fields[key].errorMsg;
					}
					addError(oForm[key]);
				}
			}
		}
	} finally {
		oForm._isSubmitting = false;
		if ( bFormValid ) {
			//We want to submit the form the regular way, even if the response is bad
			oForm.submit();
		} else {
			alert("Please correct the following errors:" + errorMsg);
		}
	}
}

/* Called to add error to a field */
function addError (oField) {
	YAHOO.util.Dom.addClass(getFieldContainer(oField), "error");
	YAHOO.util.Event.addListener(oField, "change", eRemoveError);
}

/* Called to remove error class */
function removeError (oField, eType) {
	YAHOO.util.Dom.removeClass(getFieldContainer(oField), "error");
	YAHOO.util.Event.removeListener(oField, eType, eRemoveError);
}

/* Called to remove an error based on a field event */
function eRemoveError (eField) {
	removeError(YAHOO.util.Event.getTarget(eField), eField.type);
}

/* Set the "required" class for a field */
function setFieldRequired (oField, isRequired) {
	if (isRequired) {
		YAHOO.util.Dom.addClass(getFieldContainer(oField), "required");
	} else {
		YAHOO.util.Dom.removeClass(getFieldContainer(oField), "required");
	}
}

/* Get the object reference to the field's container */
function getFieldContainer (oField) {
	return YAHOO.util.Dom.getAncestorByClassName(oField, "fieldContainer");
}
