VT.validation = {
	formTypes: {
		blank: 0, 
		text: 1, 
		selectbox: 2, 
		email: 3, 
		checkbox: 4, 
		compare: 5, 
		radio: 6, 
		nonzero: 7
	}, 
	data: {
		curform: "", 
		failed: new Array(), 
		all: new Array()
	}, 
	validate: 
		function (objParams) {
			/* pass in a params object like so:  {fields: [{id: "firstname", type: LG.formTypes.text, message: " - Please enter your name."}, {id: "lastname", type: LG.formTypes.text, message: " - Please enter your lastname."}]} */
			var numCounter		= 0;
			var numAltCounter	= 0;
			var numFailCounter	= 0;
			var objAltParams	= 0;
			var boolError		= false;
			var strErrorText	= "";
			var strTitleAttr	= "";
			var objElement;
			
			VT.validation.data.curform		= "";
			VT.validation.data.failed		= new Array();
			VT.validation.data.all			= new Array();
			
			if (objParams && objParams.fields && objParams.fields.length) {
				for (numCounter = 0; numCounter < objParams.fields.length; numCounter++) {
					VT.validation.data.all.push(objParams.fields[numCounter].id);
					
					if (objParams.fields[numCounter].type == VT.validation.formTypes.radio) {
						objElement		= $("input[name='" + objParams.fields[numCounter].id + "']:checked");
						strTitleAttr	= "";
						boolError		= false;
					} else {
						objElement		= $("#" + objParams.fields[numCounter].id);
						strTitleAttr	= objElement.attr("title");
						boolError		= false;
					}
					
					// first things first, let's check to see if this element has a title attribute
					if (strTitleAttr && strTitleAttr.length) {
						if (strTitleAttr == objElement.val()) {
							boolError		= true;
							
							VT.validation.data.failed.push(objParams.fields[numCounter].id);
						}
					}
					
					// if we didnt fail matching the title attribute, then we'll go on and check the data
					if (!boolError) {
						if (!this.validateFormField(objElement, objParams.fields[numCounter])) {
							boolError		= true;
							VT.validation.data.failed.push(objParams.fields[numCounter].id);
						}
						
						if (boolError) {
							// check alternative form fields
							if ((objParams.fields[numCounter].alt) && (objParams.fields[numCounter].alt.length > 0)) {
								for (numAltCounter = 0; numAltCounter < objParams.fields[numCounter].alt.length; numAltCounter++) {
									if (objParams.fields[numCounter].altTypes) {
										objAltParams			= {type: objParams.fields[numCounter].altTypes[numAltCounter]};
									} else {
										objAltParams			= objParams.fields[numCounter];
									}
									if (this.validateFormField($("#" + objParams.fields[numCounter].alt[numAltCounter]), objAltParams)) {
										// no error, we're good to go!
										// remove original field from failed list
										for (numFailCounter = 0; numFailCounter < VT.validation.data.failed.length; numFailCounter++) {
											if (VT.validation.data.failed[numFailCounter] == objParams.fields[numCounter].id) {
												VT.validation.data.failed.splice(numFailCounter, 1);
												break;
											}
										}
										
										boolError			= false;
										break;
									} else {
										VT.validation.data.failed.push(objParams.fields[numCounter].alt[numAltCounter]);
									}
								}
							}
						}
					}
					
					// if we failed, then we'll append the error message for this field and move on
					if (boolError) {
						strErrorText		+= objParams.fields[numCounter].message + "\n";
					} else {
						// check to make sure we don't want to verify against another field
						if (objParams.fields[numCounter].verify) {
							if ($("#" + objParams.fields[numCounter].verify).val() != $(objElement).val()) {
								boolError			= true;
								strErrorText		+= objParams.fields[numCounter].messageverify + "\n";
								
								VT.validation.data.failed.push(objParams.fields[numCounter].verify);
							}
						}
					}
				}
				
				if (strErrorText.length == 0) {
					// clear out any form fields that were NOT required, but still have their default title attributes set
					var objElements			= $(objElement).parents("form").find("input, select, textarea");
					
					if (objElements && objElements.length) {
						for (numCounter = 0; numCounter < objElements.length; numCounter++) {
							objElement			= $(objElements[numCounter]);
							strTitleAttr		= objElement.attr("title");
							
							if (strTitleAttr && strTitleAttr.length) {
								if (objElement.val() == strTitleAttr) {
									objElement.val("");
								}
							}
						}
					}
				}
			}
			
			if (strErrorText.length) {
				// check for a callback function
				if ((objParams.callback) && (typeof objParams.callback == "function")) {
					if ((objParams.form) && (objParams.form.length)) {
						VT.validation.data.curform	= objParams.form;
					}
					// do it!
					objParams.callback();
				}
				
				if (!objParams.suppress) {
					alert("Some errors were found while trying to validate this form.\n\n" + strErrorText);
				}
				return false;
			} else {
				return true;
			}
		}, 
		
	validateFormField : 
		function (objElement, objParams) {
			switch (objParams.type) {
				case VT.validation.formTypes.blank :
					if (objElement.val().length == 0)		return false;
					break;
					
				case VT.validation.formTypes.text :
					if (objElement.val().length <= 3)		return false;
					break;

				case VT.validation.formTypes.nonzero :
					if (objElement.val() == '0')			return false;
					break;
	
				case VT.validation.formTypes.selectbox :
					if ((objElement[0].nodeName) && (objElement[0].nodeName.toLowerCase() == "select")) {
						if ((objElement) && (objElement[0])) {
							if (!objElement[0].selectedIndex)		return false;
						} else {
							return false;
						}
					} else {
						// validate as text
						if (objElement.val().length == 0)		return false;
					}
					break;
	
				case VT.validation.formTypes.email :
					// http://www.remote.org/jochen/mail/info/chars.html
					if (!/^[a-z0-9\!\#\$\%\&\'\*\+\-\/\=\?\^\_\`\{\|\}\~\.]+@([a-z0-9_-]{1,99}\.)+[a-z]{2,6}$/i.test(objElement.val()))		return false;
					break;
	
				case VT.validation.formTypes.checkbox :
					if (!objElement.attr("checked"))		return false;
					break;
					
				case VT.validation.formTypes.compare :
					if (objParams.compare && !objParams.alt) {
						if (objElement.val() != $("#" + objParams.compare).val()) 		return false;
					}
					break;
				
				case VT.validation.formTypes.radio : 
					if ((objElement) && ($(objElement).val())) {
						return true;
					} else {
						return false;
					}
					break;
			}
			
			return true;
		}
};
