var ajaxValidateSubmit = function() {
	
	var _form;
	var _fields;
	var _errorDiv;
	var _normalClass;
	var _errorClass;
	var _errorImage;
	var _successMsg;
	var _failureMsg;
	var _debugMode;
	
	var _submitUrl;		
	var _postData;
	var _errors;


	return {
		init : function(form, params) {
			_form = form;
			_fields = params.fields;
			_normalClass = params.normalClass;
			_errorClass = params.errorClass;
			_errorImage = params.errorImage;
			_successMsg = params.successMsg;
			if (params.failureMsg) {
				_failureMsg = params.failureMsg;
			} else {
				_failureMsg = params.successMsg;
			}
			_submitUrl = _form.getAttribute('action');
			_errorDiv = document.getElementById(params.errorDiv);
			_debugMode = params.debugMode;
			validateAndSubmit();
		}
	};
		
		
	function validateAndSubmit() {
		if (_debugMode) console.log('Validating fields');
		
		vAlert(0, '');
		vResetFieldClasses();
		_errors = false;
		_postData = "";
		
		if(document.getElementById) {
			for (var i=0; i<_fields.length; i++) {
				switch (_fields[i].type) {
					case 'hidden':
						var textFieldElem = document.getElementById(_fields[i].id);
						_postData += textFieldElem.name + '=' + encodeURIComponent(textFieldElem.value);
						break;
					case 'text':
						var textFieldElem = document.getElementById(_fields[i].id);
						switch (_fields[i].validate) {
							case 'notempty':
								if (textFieldElem.value == '') {
									_errors = true;
									textFieldElem.focus();
									vHighlightErrors(textFieldElem, _errorClass);
									vAlert(1, _fields[i].error, true);
								}
								break;
							case 'email':
								if (!validate_email(textFieldElem.value)) {
									_errors = true;
									textFieldElem.focus();
									vHighlightErrors(textFieldElem, _errorClass);
									vAlert(1, _fields[i].error, true);
								}
								break;
						}
						_postData += textFieldElem.name + '=' + encodeURIComponent(textFieldElem.value);
						break;
					case 'select':
						var selectElem = document.getElementById(_fields[i].id);
						switch (_fields[i].validate) {
							case 'notfirst':
								if (selectElem.selectedIndex == 0) {
									_errors = true;
									selectElem.focus();
									vHighlightErrors(selectElem, _errorClass);
									vAlert(1, _fields[i].error, true);
								}
								break;
						}
						_postData += selectElem.name + '=' + encodeURIComponent(selectElem.options[selectElem.selectedIndex].value);
						break;
					case 'radio':
						var checkedOption = validate_radio(_fields[i].name);
						switch (_fields[i].validate) {
							case 'checked':
								if (!checkedOption) {
									_errors = true;
									vAlert(1, _fields[i].error, true);
								}
								break;
						}
						_postData += _fields[i].name + '=' + checkedOption;
						break;
					case 'checkbox':
						var checkBoxElem = document.getElementById(_fields[i].id);
						switch (_fields[i].validate) {
							case 'checked':
								if (!checkBoxElem.checked) {
									_errors = true;
									checkBoxElem.focus();
									vHighlightErrors(checkBoxElem, _errorClass);
									vAlert(1, _fields[i].error, true);
								}
								break;
						}
						_postData += checkBoxElem.name + '=' + checkBoxElem.value;
						break;
				}
				if (i < _fields.length-1) _postData += '&';
				if (_errors) break;
			}
			
			if (!_errors) doSubmit();
			return false;
			
		} else {
			return true; //continue and use server side
		}
	}
	
	
	function doSubmit() {
		var handleSuccess = function(o) {
			if(o.responseText !== undefined) {
				if (_debugMode) {
					vAlert(1, o.responseText);
				} else {
					vAlert(1, _successMsg);
				}
				vClearFields();
			}
			return false;					
		}
		var handleFailure = function(o) {
			if (_debugMode) {
				vAlert(1, o.responseText);
			} else {
				vAlert(1, _failureMsg);
			}
			vClearFields();
			return false;
		}				
		var callback =
		{
		  success:handleSuccess,
		  failure:handleFailure
		};
		vAlert(1, 'Sending...');
		if (_debugMode) console.log('Posting to: ' + _submitUrl);
		if (_debugMode) console.log('Post Data: ' + _postData);
		var request = YAHOO.util.Connect.asyncRequest('POST', _submitUrl, callback, _postData);
	}
	
	
	function validate_email(str) {
		if (str.indexOf('@') < 0 || str.indexOf('.') < 0 || str.lastIndexOf('.') < str.indexOf('@') || str.lastIndexOf('@') != str.indexOf('@')) {
			return false;
		}
		return true;
	}
	
	
	function validate_radio(radioName) {
		var radioArray = _form[radioName];
		for (var i=0; i<radioArray.length; i++) {
			if (radioArray[i].checked) {
				return radioArray[i].value;
			}
		}
		return false;
	}
	
	
	function vHighlightErrors(elem) {
		elem.className += (" "+_errorClass);
	}
	
	
	function vAlert(visible, message, showImage) {
		if (_errorDiv) {
			if (visible == 1) {
				if (showImage && _errorImage != undefined) {
					_errorDiv.innerHTML = '<p><img src="' + _errorImage + '" /> ' + message + '</p>';
				} else {
					_errorDiv.innerHTML = '<p>' + message + '</p>';
				}
				_errorDiv.style.display = 'block';
			} else {
				_errorDiv.innerHTML = message;
				_errorDiv.style.display = 'none';
			}
		}
	}
	
	
	function vClearFields() {
		for (var i=0; i<_fields.length; i++) {
			switch (_fields[i].type) {
				case 'text':
					var textFieldElem = document.getElementById(_fields[i].id);
					textFieldElem.value = '';
					break;
				case 'radio':
					var radioArray = _form[_fields[i].name];
					for (var j=0; j<radioArray.length; j++) {
						if (radioArray[j].checked) {
							radioArray[j].checked = false;
						}
					}
					break;
				case 'checkbox':
					var checkBoxElem = document.getElementById(_fields[i].id);
					checkBoxElem.checked = false;
					break;
			}
		}
	}
	
	function vResetFieldClasses() {
		for (var i=0; i<_fields.length; i++) {
			switch (_fields[i].type) {
				case 'text':
					var textFieldElem = document.getElementById(_fields[i].id);
					textFieldElem.className = _normalClass;
					break;
				case 'checkbox':
					var checkBoxElem = document.getElementById(_fields[i].id);
					checkBoxElem.className = '';
					break;
			}
		}
	}
		
		
		

}();
