
// ************************************
//
// Title :		Form validation
//
// Description : 	v0.1
//
// ************************************

Event.observe(window, 'load', bsForms, false);

function bsForms () {
	
// ************************************
	
	
	
// ************************************
	
	var bsForms = document.forms;
	
	// For each form in the page
	for (var i = 0; i < bsForms.length; i++) {		
		bsFields = Form.getElements(bsForms[i]);
		
		// get each submit button
		for (var j = 0; j < bsFields.length; j++) {
			if ((bsFields[j].tagName == "INPUT") && (bsFields[j].getAttribute("type") == "submit")) {
				// Change function to button to avoid submission
				bsFields[j].setAttribute("type", "button");
				// Attatch validation event
				Event.observe(bsFields[j], 'click', clickSubmit, false);
			}
		}
	}
	
// ************************************
	
	function clickSubmit(e) {
		var parent = this.parentNode;
		var formErrors = 0;
		var formFocus;
		var formFocusFlag = 0;
		
		while (parent != document.body) {
			if (parent.tagName == "FORM") {
				var parentForm = parent;
				break;
			}
			parent = parent.parentNode;			
		}
		
		// If the parent form was found
		if (parentForm) {
			// For each of the forms fields
			fields = Form.getElements(parentForm);
			for (var i = 0; i < fields.length; i++) {
				// Remove field errors
				removeFieldError(fields[i], parentForm);
				
				// Validate required form fields
				formErrors += validateReq(fields[i], parentForm);
				
				// Validate fields with max characters
				formErrors += validateMaxChars(fields[i], parentForm);
								
				if (formErrors > 0) {
					if (formFocusFlag == 0) {
						formFocus = fields[i];
						formFocusFlag = 1;
					}	
				}								
			}
			
			if (formErrors > 0) {			
				alert("There are some problems with your submission. Please review the form and try again.");
				formFocus.focus()
			} else {
				parentForm.submit();
			}
		}		
	}
		
// ************************************
	
	function validateReq(field, form) {	
		if ((field.getAttribute("fReq") == "true") && (field.value == "")) {
			addFieldError(field, form, "This is a required field.");
			return 1;
		} else {
			return 0;
		}
	}
	
	function validateMaxChars(field, form) {	
		if ((field.getAttribute("fMaxChars") != null) && (field.value.length > field.getAttribute("fMaxChars"))) {
			addFieldError(field, form, "This field has an upper limit of " + field.getAttribute("fMaxChars") + " characters.");
			return 1;
		} else {
			return 0;			
		}
	}
	
// ************************************
	
	function addFieldError(field, form, message) {		
		var assocLabel;				
		if (assocLabel = returnAssociatedLabel(field, form)) {
			assocLabel.appendChild(createLabelError(message));
		}

		Element.addClassName(field, "js-fError");
	}
	
	function removeFieldError(field, form, message) {
		Element.removeClassName(field, "js-fError");	
		
		if (returnAssociatedLabel(field, form)) {
			var label = returnAssociatedLabel(field, form);		
			
			for (i = 0; i < label.childNodes.length; i++) {
				if ((label.childNodes[i].tagName == "SPAN") && (Element.hasClassName(label.childNodes[i], "js-fError"))) {
					label.childNodes[i].parentNode.removeChild(label.childNodes[i]);
				}
			}
		}	
	}
	
// ************************************
	
	function returnAssociatedLabel(field, form) {		
		var labels = form.getElementsByTagName("LABEL");
		
		for (var i = 0; i < labels.length; i++) {
			if (labels[i].getAttribute("for") == field.getAttribute("id")) {
				return labels[i];
			}
		}		
		return false;
	}
	
	function createLabelError(message) {
		var error = document.createElement("SPAN");
		
		error.className = "js-fError";		
		error.appendChild(document.createTextNode(" - " + message));
		
		return error;
	}
	
// ************************************
}

