	function addErrorEffect( fld, errorMsg, obj ) {
		var fldObj = $(fld);
		
		// loop through and aply all error styles
		for (var style in obj.errorStyles) {
			fldObj.setStyle(style, obj.errorStyles[style] );
		}
		
		//fldObj.setStyle('background-color', errorBackgroundColor);
		//fldObj.setStyle('color', errorFontColor);
		
		fldObj.value = errorMsg;
		fldObj.title = "error";
		
		fldObj.addEvent('click', function(e){
			if (this.title=='error') {
				new Event(e).stop();
				this.value = '';
				this.title = '';
				var myMorph = new Fx.Morph(this.name, {wait: false, duration: 1000, transition: Fx.Transitions.Sine.easeInOut});
				myMorph.start(obj.errorCssClassOff);
			}
		});
		
		fldObj.addEvent('focus', function(e){
			if (this.title=='error') {
				new Event(e).stop();
				this.value = '';
				this.title = '';
				var myMorph = new Fx.Morph(this.name, {wait: false, duration: 1000, transition: Fx.Transitions.Sine.easeInOut});
				myMorph.start(obj.errorCssClassOff);
			}
		});
		
	}
	
	function validateForm( frmName, obj ) {
	
		var isError = false;
		var errorMsg = '_____________________________________\n\nThe following error(s) occured:\n_____________________________________     \n';
	
		// required validation
		for (var fld in obj.requiredFields) {
		  //alert(requiredFields[fld]);
		  if ( ! $(fld).value || $(fld).value == obj.requiredFields[fld] ) {
			isError = true;
			errorMsg += "\n" + obj.requiredFields[fld];
			if (obj.useEffects) {
				addErrorEffect( fld, obj.requiredFields[fld], obj );
			}
		  }		  
		}
		
		// email validation
		for (var fld in obj.emailFields) {
		  if ( ! $(fld).value ) {
			isError = true;
			if (obj.emailFields[fld]) errorMsg += "\n" + obj.emailFields[fld];
			if (obj.useEffects) {
				addErrorEffect( fld, obj.emailFields[fld], obj );
			}
		  } else if ( $(fld).value.indexOf('@') < 1 || $(fld).value.indexOf('.') < 1 ) {
			isError = true;
			if (obj.emailFields[fld]) errorMsg += "\n" + obj.emailFields[fld];
			if (obj.useEffects) {
				addErrorEffect( fld, obj.emailFields[fld], obj );
			}
		  }
		}
		
		// number validation
		for (var fld in obj.numberFields) {
		  if ( ! $(fld).value || $(fld).value == obj.numberFields[fld] ) {
			isError = true;
			if (obj.numberFields[fld]) errorMsg += "\n" + obj.numberFields[fld];
			if (obj.useEffects) {
				addErrorEffect( fld, obj.numberFields[fld], obj );
			}
		  } else if ( isNaN($(fld).value) ) {
			isError = true;
			if (obj.numberFields[fld]) errorMsg += "\n" + obj.numberFields[fld];
			if (obj.useEffects) {
				addErrorEffect( fld, obj.numberFields[fld], obj );
			}
		  }
		}
		
		// matching fields
		for (var fld in obj.matchFields) {
			var matchData = obj.matchFields[fld];
			if ( ! $(matchData.fieldOneName).value || ! $(matchData.fieldTwoName).value ) {
				isError = true;
				errorMsg += "\n" + matchData.fieldError;
				if (obj.useEffects) {
					addErrorEffect( matchData.fieldOneName, matchData.fieldError, obj );
					addErrorEffect( matchData.fieldTwoName, matchData.fieldError, obj );
				}
			} else if ( $(matchData.fieldOneName).value != $(matchData.fieldTwoName).value || $(matchData.fieldOneName).value == matchData.fieldError ) {
				isError = true;
				errorMsg += "\n" + matchData.fieldError;
				if (obj.useEffects) {
					addErrorEffect( matchData.fieldOneName, matchData.fieldError, obj );
					addErrorEffect( matchData.fieldTwoName, matchData.fieldError, obj );
				}
			}
		}
		
		// radio fields
		for (var grp in obj.radioFields) {
			var radioGroup = obj.radioFields[grp];
			var anySelected = false;
			for (var fld in radioGroup) {
				if ( $(fld).checked ) anySelected = true;
			}
			if ( ! anySelected ) {
				isError = true;
				if (obj.useEffects) {
					addErrorEffect( grp, '', obj );					
				}
				/*
				for (var fld in radioGroup) {
					errorMsg += "\n" + radioGroup[fld];
					if (obj.useEffects) {
						addErrorEffect( fld, radioGroup[fld], obj );					
					}
				}
				*/
				
			}
		}
		
		// combo box fields
		for (var selectBox in obj.selectFields) {
			if ( !$(selectBox).options[$(selectBox).selectedIndex].value || !$(selectBox).options[$(selectBox).selectedIndex].value > 1 ) {
				isError = true;
				errorMsg += "\n" + obj.selectFields[selectBox];
			}
		}
		
		// error handle
		if (isError) {
			// if ( ! obj.useEffects ) alert(errorMsg);
			alert(errorMsg);
		} else {
			$(frmName).submit();
		}
	
	}
	
	function ajaxValidateForm( frmName, obj ) {
	
		var isError = false;
		var errorMsg = '_____________________________________\n\nThe following error(s) occured:\n_____________________________________     \n';
	
		// required validation
		for (var fld in obj.requiredFields) {
		  //alert(requiredFields[fld]);
		  if ( ! $(fld).value || $(fld).value == obj.requiredFields[fld] ) {
			isError = true;
			errorMsg += "\n" + obj.requiredFields[fld];
			if (obj.useEffects) {
				addErrorEffect( fld, obj.requiredFields[fld], obj );
			}
		  }		  
		}
		
		// email validation
		for (var fld in obj.emailFields) {
		  if ( ! $(fld).value ) {
			isError = true;
			if (obj.emailFields[fld]) errorMsg += "\n" + obj.emailFields[fld];
			if (obj.useEffects) {
				addErrorEffect( fld, obj.emailFields[fld], obj );
			}
		  } else if ( $(fld).value.indexOf('@') < 1 || $(fld).value.indexOf('.') < 1 ) {
			isError = true;
			if (obj.emailFields[fld]) errorMsg += "\n" + obj.emailFields[fld];
			if (obj.useEffects) {
				addErrorEffect( fld, obj.emailFields[fld], obj );
			}
		  }
		}
		
		// number validation
		for (var fld in obj.numberFields) {
		  if ( ! $(fld).value || $(fld).value == obj.numberFields[fld] ) {
			isError = true;
			if (obj.numberFields[fld]) errorMsg += "\n" + obj.numberFields[fld];
			if (obj.useEffects) {
				addErrorEffect( fld, obj.numberFields[fld], obj );
			}
		  } else if ( isNaN($(fld).value) ) {
			isError = true;
			if (obj.numberFields[fld]) errorMsg += "\n" + obj.numberFields[fld];
			if (obj.useEffects) {
				addErrorEffect( fld, obj.numberFields[fld], obj );
			}
		  }
		}
		
		// matching fields
		for (var fld in obj.matchFields) {
			var matchData = obj.matchFields[fld];
			if ( ! $(matchData.fieldOneName).value || ! $(matchData.fieldTwoName).value ) {
				isError = true;
				errorMsg += "\n" + matchData.fieldError;
				if (obj.useEffects) {
					addErrorEffect( matchData.fieldOneName, matchData.fieldError, obj );
					addErrorEffect( matchData.fieldTwoName, matchData.fieldError, obj );
				}
			} else if ( $(matchData.fieldOneName).value != $(matchData.fieldTwoName).value || $(matchData.fieldOneName).value == matchData.fieldError ) {
				isError = true;
				errorMsg += "\n" + matchData.fieldError;
				if (obj.useEffects) {
					addErrorEffect( matchData.fieldOneName, matchData.fieldError, obj );
					addErrorEffect( matchData.fieldTwoName, matchData.fieldError, obj );
				}
			}
		}
		
		// radio fields
		for (var grp in obj.radioFields) {
			var radioGroup = obj.radioFields[grp];
			var anySelected = false;
			for (var fld in radioGroup) {
				if ( $(fld).checked ) anySelected = true;
			}
			if ( ! anySelected ) {
				isError = true;
				if (obj.useEffects) {
					addErrorEffect( grp, '', obj );					
				}
				/*
				for (var fld in radioGroup) {
					errorMsg += "\n" + radioGroup[fld];
					if (obj.useEffects) {
						addErrorEffect( fld, radioGroup[fld], obj );					
					}
				}
				*/
				
			}
		}
		
		// combo box fields
		for (var selectBox in obj.selectFields) {
			if ( $(selectBox).options[$(selectBox).selectedIndex].value == -1 ) {
				isError = true;
				errorMsg += "\n" + obj.selectFields[selectBox];
				if (obj.useEffects) {
					addErrorEffect( selectBox, '', obj );
				}
			}
		}
		
		// error handle
		if (isError) {
			// if ( ! obj.useEffects ) alert(errorMsg);
			alert(errorMsg);
			return false;
		} else {
			return true;
		}
	
	}