MG.namespace("MG.util.Form");
MG.util.Form = (function() {
	/***************************************************************************
	 ****	FORMS & INPUT HANDLING											****
	 ***************************************************************************/
	
	/**
	 * Handles client-side error checking on form submission.
	 * @param {String} form_id	ID of the form to submit.
	 * @param {Boolean} synchronous  Real form submit flag
	 * @param {Function}	successCb	Callback to call if the form submit status is "success"
	 */
	function submit(form_id, synchronous, successCb) {
		var el, i, n, f = gel(form_id), params = {}, valid = false;
		
		if(typeof form_id !== 'string') {
			f = form_id;
		}
		
		valid = validateForm(f);
		
		if(valid === true) {
			MG.util.Modal.showSaving();
			$.jGrowl("Submitting information.<br/>One moment please.", {
				theme : 'standard'
			});
			
			if(synchronous === true) {
				f.submit();
			} else {
				for(i=0, n=f.elements.length; i<n; i++) {
					if(f.elements[i].type == 'button') {
						continue;
					}
					if(f.elements[i].type == 'checkbox' || f.elements[i].type == 'radio') {
						if(f.elements[i].checked != true) {
							continue;
						}
					}
					params[f.elements[i].name] = $(f.elements[i]).val();
				}
				
				$.ajax(MG.util.Async.getConfig({
					data	: params,
					success : function(json) {
						MG.util.Modal.hideModal();
						var o = MG.util.Async.handleMessaging(json);
						
						if(o !== null && o.status == 'success' && typeof successCb == 'function') {
							setTimeout(function() {
								successCb(o);
							}, 1000);
						}
					}
				}));
			}
		}
		
		return false;
	}

	
	/**
	 * Validates form inputs.
	 * If inputs have a class "required", they cannot be empty
	 * If inputs have a class "email", they must pass email verification
	 * @param	{HTMLForm} f
	 * @return	{Boolean}
	 */
	function validateForm(f) {
		var valid=true, seenRequiredMessage=false, addressMessageShown = false, el;
		
		for(i=0, n=f.elements.length; i<n; i++) {
			if(f.elements[i].type == 'button') {
				continue;
			}
			
			el = $(f.elements[i]);
			el.removeClass("error");
			
			if(el.hasClass("required") && el.attr("value") == "") {
				el.addClass("error");
				
				if(seenRequiredMessage === false) {
					$.jGrowl("Errors or omissions were found.  Please check the highlighted fields.", { sticky : true });
					seenRequiredMessage = true;
				}
				valid = false;
			} else if(el.hasClass("email-address")) {
				if(!MG.isValidEmail(el.attr("value"))) {
					el.addClass("error");
					
					if(addressMessageShown === false) {
						$.jGrowl("Please check your email address - it does not validate.", {sticky:true});
						addressMessageShown = true;
					}
					valid = false;
				}
			}
		}
		
		return valid;
	}
	
	
	return {
		submit				: submit,
		validateForm		: validateForm
	};
})();
