function validateDiminishingReturnsForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure all thresholds are valid numbers
	for(var iLevelIterator = 1; iLevelIterator <= 20; iLevelIterator++) {
		var objFormObject = document.getElementById("levelthreshold_" + iLevelIterator);
		if (! noValue(objFormObject) && notNumber(objFormObject)) {
			formValid = false;
			invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Invalid Level " + iLevelIterator + " Threshold, it should be a valid number");
		}
	}

	// Make sure all returns are valid numbers between 0 and 100
	for(var iLevelIterator = 1; iLevelIterator <= 20; iLevelIterator++) {
		var objFormObject = document.getElementById("levelreturn_" + iLevelIterator);
		if (! noValue(objFormObject) && (notNumber(objFormObject) || objFormObject.value < 0 || objFormObject.value > 100)) {
			formValid = false;
			invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Invalid Level " + iLevelIterator + " % Return Value, it should be a percentage between 0 and 100");
		}
	}

	// Make sure all thresholds increase
	var fLastThreshold;
	for(var iLevelIterator = 1; iLevelIterator <= 20; iLevelIterator++) {
		var objFormObject = document.getElementById("levelthreshold_" + iLevelIterator);
		if (! noValue(objFormObject)) {
			if (typeof fLastThreshold == "number" && parseFloat(objFormObject.value) <= fLastThreshold) {
				formValid = false;
				invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Invalid Level " + iLevelIterator + " Threshold, thresholds must increase");
				break;
			} else {
				fLastThreshold = parseFloat(objFormObject.value);
			}
		}
	}
	
	// Make sure all levels are defined in pairs
	for(var iLevelIterator = 1; iLevelIterator <= 20; iLevelIterator++) {
		var objFormThresholdObject = document.getElementById("levelthreshold_" + iLevelIterator);
		var objFormReturnValueObject = document.getElementById("levelreturn_" + iLevelIterator);
		if ((! noValue(objFormThresholdObject) && noValue(objFormReturnValueObject)) || (noValue(objFormThresholdObject) && ! noValue(objFormReturnValueObject))) {
			formValid = false;
			invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Missing Level " + iLevelIterator + " definition, levels must be defined in pairs");
		}
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		disableAllNamedFormButtons('sbutton');
		return true;
	}
}


function validateChooseMultipleItemForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure an item has been chosen
	if (getRadioValue(formObject.officialid) == undefined) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No item selected");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		return true;
	}
}


function validateEditTeamMemberForm(formObject, runStartTime, runFinishTime) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a join time
	if (noValue(formObject.jointime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid join time specified");
	}
	
	// Make sure there is a leave time
	if (noValue(formObject.leavetime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid leave time specified");
	}
	
	// Make sure the join and leave times make sense
	if(formValid && dateOneStringBeforeOrEqualDateTwoString(formObject.leavetime.value, formObject.jointime.value)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The leave time cannot be before or equal to the join time");
	}
	
	// Make sure the join or leve time is not before the start time
	if(formValid && (dateOneStringBeforeDateTwoString(formObject.jointime.value, runStartTime) || dateOneStringBeforeDateTwoString(formObject.leavetime.value, runStartTime))) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The join or leave times cannot be before the run start time");
	}
	
	// Make sure the loot time is not after the finish time
	if(formValid && (dateOneStringBeforeDateTwoString(runFinishTime, formObject.jointime.value) || dateOneStringBeforeDateTwoString(runFinishTime, formObject.leavetime.value))) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The join or leave times cannot be after the run finish time");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		return true;
	}
}


function validateAnonymousContributionForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// If a guild name or character name has been specified then make sure the other data has also been supplied
	if (! noValue(formObject.guildname) || ! noValue(formObject.charactername)) {
		
		// Make sure there is a region
		if (formObject.region.selectedIndex < 1) {
			formValid = false;
			invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No region specified");
		}
		
		// Make sure there is a realm
		if (formObject.realm.selectedIndex < 0) {
			formValid = false;
			invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No realm specified");
		}
		
		// Make sure there is a guild name
		if (noValue(formObject.guildname)) {
			formValid = false;
			invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No guild name specified");
		}
		
		
		// Make sure there is a character name
		if (noValue(formObject.charactername)) {
			formValid = false;
			invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No character name specified");
		
		// Make sure the character name has only letters
		} else if (! onlyLetters(formObject.charactername)) {
			formValid = false;
			invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "A character name may only contain letters");
		}
		
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
	
	// Otherwise populate the custom fields then disable the submit buttons and submit the form
	} else {
		
		var identificationString = "";
		var identificationCode = "";
		
		if (! noValue(formObject.region[formObject.region.selectedIndex]) && ! noValue(formObject.realm[formObject.realm.selectedIndex]) && ! noValue(formObject.guildname)) {
			
			// Build the guild ident string
			identificationString = formObject.region[formObject.region.selectedIndex].value + "," + formObject.realm[formObject.realm.selectedIndex].value + "," + formObject.guildname.value;
			identificationCode = "NoAccount:" + identificationString;
			
			// If a character name was specified
			if (! noValue(formObject.charactername)) {
				identificationString = identificationString + "," + formObject.charactername.value;
			}
			
		} else {
			
			identificationString = "Anonymous";
			identificationCode = "Anonymous";
			
		}
		
		// Populate custom field
		formObject.custom.value = identificationCode;

		// Populate item name field
		formObject.item_name.value = formObject.item_name.value + identificationString;

		disableAllNamedFormButtons('sbutton');
		return true;
	}
}


function validateRealmTransferNameChangeForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure either the name or the realm are different
	if (formObject.currentname.value == formObject.newname.value && formObject.currentrealm.value == formObject.newrealm[formObject.newrealm.selectedIndex].value) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "You must either change the realm or the name");
	}
	
	// Make sure there is a name
	if (noValue(formObject.newname)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No new character name specified");
	}
	
	// Make sure the character name has only letters
	if (! onlyLetters(formObject.newname)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "A character name may only contain letters");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
	
	// Otherwise get confirmation then disable the submit buttons and submit the form
	} else {
		
		disableAllNamedFormButtons('sbutton');
		return true;
	}
}


function validateForceMakeAvailableForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure at least one character has been chosen
	if (numberOfCheckboxesSelectedExcluding(formObject, 'selectalltoggle') == 0) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "At least one character to be made available needs to be selected");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
	
	// Otherwise get confirmation then disable the submit buttons and submit the form
	} else {
		
		disableAllNamedFormButtons('sbutton');
		return true;
	}
}


function validateTeamNamesForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Loop through the name and colour elements
	var formElements = formObject.elements;
	
	for(childrenIterator = 0; childrenIterator < formElements.length; childrenIterator++) {
		
		// Make sure there is a name defined and it's unique
		if (Left(formElements[childrenIterator].name, 9) == "teamname_") {
			if (formElements[childrenIterator].value.length == 0) {
				formValid = false;
				invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Missing team name");
			} else {
				var notUnique = false;
				for(childrenIteratorI = 0; childrenIteratorI < formElements.length; childrenIteratorI++) {
					if (Left(formElements[childrenIteratorI].name, 9) == "teamname_" && childrenIterator != childrenIteratorI && formElements[childrenIterator].value == formElements[childrenIteratorI].value) {
						notUnique = true;
						break;
					}
				}
				if (notUnique) {
					formValid = false;
					invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Team names are not unique");
					break;
				}
			}
		}
		
		// Make sure there is a colour defined
		if (Left(formElements[childrenIterator].name, 11) == "teamcolour_") {
			if (formElements[childrenIterator].value.length == 0) {
				formValid = false;
				invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Missing team colour");
			} else {
				var notUnique = false;
				for(childrenIteratorI = 0; childrenIteratorI < formElements.length; childrenIteratorI++) {
					if (Left(formElements[childrenIteratorI].name, 11) == "teamcolour_" && childrenIterator != childrenIteratorI && formElements[childrenIterator].value == formElements[childrenIteratorI].value) {
						notUnique = true;
						break;
					}
				}
				if (notUnique) {
					formValid = false;
					invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Team colours are not unique");
					break;
				}
			}
		}
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}



function validatePresetBonusesForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure there is a reason specified
	if (formObject.reason.value.length == 0) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No reason specified.");
	}
	
	// Make sure the reason doesn't exceed 150 characters
	if (formObject.reason.value.length > 150) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The reason is too long (" + formObject.reason.value.length + " characters), a maximum of 150 characters is allowed.");
	}
	
	// Make sure there is a dkp amount
	if (notNumber(formObject.amount) || valueIsZero(formObject.amount)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid dkp amount specified (cannot be zero) and must be a valid number");
	}
	
	// Make sure the dkp amount is valid if it's a % specified
	if (formObject.source[formObject.source.selectedIndex].value == "runpercent" && (formObject.amount.value <= 0 || formObject.amount.value > 100)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The DKP value must be a valid percentage between 0 and 100");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateCustomLootFormulaForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure a formula has been specified
	if (noValue(formObject.formula)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No formula specified");
	}
	
	// Make sure a generate type has been chosen
	if (getRadioValue(formObject.generatetype) == undefined) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No generation type specified");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the buttons and submit
	} else {
		formObject.elements['sbutton'].value = 'Generating values..';
		disableAllNamedFormButtons('sbutton');
		return true;
	}
}


function validateSimpleGenerateLootValuesForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure a generate type has been chosen
	if (getRadioValue(formObject.generatetype) == undefined) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No generation type specified");
	}
	
	// Make sure all input types are numbers
	for(var formI=0; formI < formObject.elements.length; formI++) {
		if (formObject.elements[formI].type == "text" && ! noValue(formObject.elements[formI]) && notNumber(formObject.elements[formI])) {
			formValid = false;
			invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "None numeric value in a field");
			break;
		}
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the buttons and submit
	} else {
		formObject.elements['sbutton'].value = 'Generating values..';
		disableAllNamedFormButtons('sbutton');
		return true;
	}
}


function validateChangeEmailAddressForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure a valid email address has been specified if one has been specified at all
	if (! noValue(formObject.emailaddress) && ! validEmailAddress(formObject.emailaddress)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid email address entered");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateDkpPoolForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure a name has been specified
	if (noValue(formObject.poolname)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No pool name entered");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validatePreviewLootValuesImportForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure at least one loot value has been chosen
	if (numberOfCheckboxesSelectedExcludingAll(formObject, ['selectalltoggle', 'dodeletes']) == 0) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "At least one loot value to be added needs to be selected");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
	
	// Otherwise get confirmation then disable the submit buttons and submit the form
	} else {
		
		var confirmationMessage = "Are you sure you want to import new loot DKP values, existing values will be overwritten?"
		if (formObject.dodeletes.checked) {
			confirmationMessage = "Are you sure you want to import new loot DKP values, existing values will be overwritten and values which do not exist in this import will be lost?"
		}
		
		if (confirm(confirmationMessage)) {
			formObject.elements['sbutton'].value = 'Importing values..';
			disableAllNamedFormButtons('sbutton');
			return true;
		} else {
			return false;
		}
	}
}


function validatePreviewDKPStandingsImportForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure at least one loot value has been chosen
	if (numberOfCheckboxesSelectedExcludingAll(formObject, ['selectalltoggle', 'dodeletes']) == 0) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "At least one character to be added needs to be selected");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
	
	// Otherwise get confirmation then disable the submit buttons and submit the form
	} else {
		
		var confirmationMessage = "Are you sure you want to import DKP standings, new adjustments will be created for each character?"
		if (formObject.dodeletes.checked) {
			confirmationMessage = "Are you sure you want to import DKP standings, existing adjustments will be lost?"
		}
		
		if (confirm(confirmationMessage)) {
			formObject.elements['sbutton'].value = 'Importing standings..';
			disableAllNamedFormButtons('sbutton');
			return true;
		} else {
			return false;
		}
	}
}


function validateDKPStandingsImportForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure a file has been chosen
	if (noValue(formObject.ds_filetoimport)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No file to import specified");
	}
	
	// Make sure a format has been chosen
	if (getRadioValue(formObject.sourceformat) == undefined) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No file format specified");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the buttons and submit
	} else {
		formObject.elements['sbutton'].value = 'Uploading source file..';
		disableAllNamedFormButtons('sbutton');
		return true;
	}
}


function validateLootDKPImportForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure a file has been chosen
	if (noValue(formObject.lv_filetoimport)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No file to import specified");
	}
	
	// Make sure a format has been chosen
	if (getRadioValue(formObject.sourceformat) == undefined) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No file format specified");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the buttons and submit
	} else {
		formObject.elements['sbutton'].value = 'Uploading source file..';
		disableAllNamedFormButtons('sbutton');
		return true;
	}
}


function validateNewsAlertSignupForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure a real name has been specified
	if (noValue(formObject.realname)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No name entered");
	}
	
	// Make sure a valid email address has been specified
	if (! validEmailAddress(formObject.emailaddress)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid email address entered");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateReplyMessageForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure the message body doesn't exceed 5000 characters
	if (formObject.replymessagebody.value.length > 5000) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The message body is too long (" + formObject.replymessagebody.value.length + " characters), a maximum of 5000 characters is allowed.");
	}
	
	// Make sure a new account password has been specified
	if (noValue(formObject.replymessagebody)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No message body entered");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateFirstBossKillsForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure there is a boss name
	if (formObject.bossidkilled.selectedIndex == -1) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No boss specified");
	}
	
	// Make sure there is a boss killed date
	if (! validDate(formObject.killdate)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid kill date specified");
	}
	
	// Make sure there is a valid kill time
	if (! validTime(formObject.killtime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid kill time specified");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateDkpAdjustmentValuesForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// If the form is in edit mode then make sure a single character has been chosen
	if (formObject.inputmode.value == "edit" && notWholeNumber(formObject.characterid[formObject.characterid.selectedIndex])) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Only a single character can be selected when editing an adjustment");
	}
	
	// Make sure there is an adjustment value and it's valid
	if (valueIsZero(formObject.adjustmentvalue) || notNumber(formObject.adjustmentvalue)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid adjustment value specified (cannot be zero)");
	}
	
	// Make sure there is an adjustment date
	if (! validDate(formObject.adjustmentdate)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid adjustment date specified");
	}
	
	// Make sure the comments don't exceed 200 characters
	if (formObject.comments.value.length > 200) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Comments are too long (" + formObject.comments.value.length + " characters), a maximum of 200 characters is allowed.");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateRunCommentsForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure the comments don't exceed 200 characters
	if (formObject.comments.value.length > 200) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Comments are too long (" + formObject.comments.value.length + " characters), a maximum of 200 characters is allowed.");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateSupportForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a real name
	if (noValue(formObject.realname)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No real name specified");
	}
	
	// Make sure there is an email address
	if (! validEmailAddress(formObject.emailaddress)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid email address specified");
	}
	
	// Make sure there is a type specified
	if (formObject.type.selectedIndex < 0) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No query type specified");
	}
	
	// Make sure there is a query
	if (noValue(formObject.query)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No query details");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateAddLootToCompletedRaidForm(formObject, runStartTime, runFinishTime) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a loot name
	if (noValue(formObject.manuallootname)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No loot name specified");
	}
	
	// Make sure there is a character
	if (noValue(formObject.characterid)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No character specified");
	}
	
	// Make sure there is a loot time
	if (noValue(formObject.loottime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid loot time specified");
	}
	
	// Make sure the loot time is not before the start time
	if(formValid && dateOneStringBeforeDateTwoString(formObject.loottime.value, runStartTime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The loot time cannot be before the run start time");
	}
	
	// Make sure the loot time is not after the finish time
	if(formValid && dateOneStringBeforeDateTwoString(runFinishTime, formObject.loottime.value)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The loot time cannot be after the run finish time");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		return true;
	}
}


function validateAddBossKillToCompletedRaidForm(formObject, runStartTime, runFinishTime) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a boss name
	if (noValue(formObject.manualbossname)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No boss name specified");
	}
	
	// Make sure there is a kill time
	if (noValue(formObject.killtime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid kill time specified");
	}
	
	// Make sure the kill time is not before the start time
	if(formValid && dateOneStringBeforeDateTwoString(formObject.killtime.value, runStartTime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The kill time cannot be before the run start time");
	}
	
	// Make sure the kill time is not after the finish time
	if(formValid && dateOneStringBeforeDateTwoString(runFinishTime, formObject.killtime.value)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The kill time cannot be after the run finish time");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		return true;
	}
}


function validateAddDkpBonusToCompletedRaidForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a character
	if (noValue(formObject.characterid)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No team member specified");
	}
	
	// Make sure there is a bonus and it's a valid number
	if (noValue(formObject.dkpbonus) || notNumber(formObject.dkpbonus)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid DKP bonus specified");
	}
	
	// Make sure there is a source
	if (noValue(formObject.source)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid bonus source specified");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		return true;
	}
}


function validateAddTeamMemberToCompletedRaidForm(formObject, runStartTime, runFinishTime, inRealtimeMode) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a character
	if (noValue(formObject.characterid)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No team member specified");
	}
	
	// Make sure there is a join time
	if (! validDate(formObject.jointime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid join time specified");
	}
	
	// Make sure there is a finish time (if we're not in realtime mode)
	if ((! inRealtimeMode && ! validDate(formObject.leavetime)) || (inRealtimeMode && ! noValue(formObject.leavetime) && ! validDate(formObject.leavetime))) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid leave time specified");
	}
	
	// Make sure the leave date/time is not before the join date time
	if(formValid && ! noValue(formObject.leavetime) && ! dateOneStringBeforeDateTwoString(formObject.jointime.value, formObject.leavetime.value)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The leave time must be after the join time");
	}
	
	// Make sure the join time is not before the start time
	if(formValid && dateOneStringBeforeDateTwoString(formObject.jointime.value, runStartTime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The join time cannot be before the run start time");
	}
	
	// Make sure the leave time is not after the finish time
	if(formValid && dateOneStringBeforeDateTwoString(runFinishTime, formObject.leavetime.value)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The leave time cannot be after the run finish time");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise submit the form
	} else {
		return true;
	}
}


function validateImportCompletedRaidForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a raid name
	if (noValue(formObject.name)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No raid name specified");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the buttons and submit the form
	} else {

		disableSubmitButton(formObject);
		return true;
	}
}


function validateDkpItemValuesForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is an item name
	if (noValue(formObject.itemname)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No item name specified");
	}
	
	// Make sure there is an item value
	if (noValue(formObject.itemvalue) || notWholeNumber(formObject.itemvalue)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No item value specified");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateDkpBossValuesForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a boss value
	if (noValue(formObject.bossvalue) || notWholeNumber(formObject.bossvalue)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No boss kill value specified");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateUpdateArmoryCacheForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure the xml field contains valid XML
	if (noValidXML(formObject.cachexml, "guildInfo")) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid XML supplied");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateUploadAttendanceLogForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure the attendance log offset is within the valid levels
	if (notWholeNumber(formObject.gmtoffset) || formObject.gmtoffset.value < -8 || formObject.gmtoffset.value > 8) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid GMT offset specified, it should be a whole number with a minimum of -8 and a maximum of 8.");
	}
	
	// Make sure the disconnect threshold is within the valid levels
	if (notWholeNumber(formObject.dcthreshold) || formObject.dcthreshold.value < 0 || formObject.dcthreshold.value > 30) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid disconnect threshold minutes specified, it should be a whole number with a minimum of 0 and a maximum of 30.");
	}

	// Make sure there is a file path or a string
	if (noValue(formObject.filetoimport) && noValue(formObject.stringtoimport)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No attendance string or log file path specified");
	}
	
	// Make sure there isn't both a file path and a string
	if (! noValue(formObject.filetoimport) && ! noValue(formObject.stringtoimport)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Choose either an attendance string or a log file path not both");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateAvailableRequirementsForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a name
	if (noValue(formObject.name)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No requirement name specified");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateInstancesForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a name
	if (noValue(formObject.name)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No instance name specified");
	}
	
	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateRaidSpotTemplatesForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a description
	if (noValue(formObject.description)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No spot description specified");
	}
	
	// Make sure there is at least one class build
	if (noneSelected(formObject.classbuilds)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No qualifying builds specified");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateClassTalentsForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a name
	if (noValue(formObject.talentname)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No talent name specified");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateBuildTemplatesForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure there is a name
	if (noValue(formObject.name)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No template name specified");
	}

	// Make sure the talent points are set
	if (noValue(formObject.treepointsone) || notWholeNumber(formObject.treepointsone)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid talent points specified in the 1st talent tree.");
	}
	if (noValue(formObject.treepointstwo) || notWholeNumber(formObject.treepointstwo)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid talent points specified in the 2nd talent tree.");
	}
	if (noValue(formObject.treepointsthree) || notWholeNumber(formObject.treepointsthree)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid talent points specified in the 3rd talent tree.");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateAutoAccountCleanForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure at least one character has been chosen
	if (numberOfCheckboxesSelectedExcluding(formObject, 'selectalltoggle') == 0) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "At least one account to be removed needs to be selected");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateGuildPopulationForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";
	
	// Make sure a password has been entered if create accounts is chosen
	if (noValue(formObject.newaccountpassword) && getRadioValue(formObject.poptype) == "createaccounts") {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No password specified for the new accounts");
	}
	
	// Make sure at least one character has been chosen
	if (numberOfCheckboxesSelectedExcluding(formObject, 'selectalltoggle') == 0) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "At least one character to be added needs to be selected");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateCreateGuildForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a name
	if (noValue(formObject.name)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No guild name specified");
	}
	
	// Make sure the name has only letters and spaces
	if (! noValue(formObject.name) && ! onlyLettersAndSpaces(formObject.name)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "A guild name may only contain letters or spaces");
	}
	
	// Make sure one of the initial options has been chosen
	if (getRadioValue(formObject.settings) == null) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No initial settings chosen");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateTemporaryGuildWizardForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure one of the initial options has been chosen
	if (getRadioValue(formObject.settings) == null) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No initial settings chosen");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}



function validateEditCharacterForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure the talent points are set
	if (noValue(formObject.treepointsone) || notWholeNumber(formObject.treepointsone)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid talent points specified in the 1st talent tree.");
	}
	if (noValue(formObject.treepointstwo) || notWholeNumber(formObject.treepointstwo)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid talent points specified in the 2nd talent tree.");
	}
	if (noValue(formObject.treepointsthree) || notWholeNumber(formObject.treepointsthree)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid talent points specified in the 3rd talent tree.");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateEditResistancesForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure the resistance points are set
	if (noValue(formObject.arcane) || notWholeNumber(formObject.arcane)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid arcane resistance specified.");
	}
	if (noValue(formObject.fire) || notWholeNumber(formObject.fire)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid fire resistance specified.");
	}
	if (noValue(formObject.frost) || notWholeNumber(formObject.frost)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid frost resistance specified.");
	}
	if (noValue(formObject.holy) || notWholeNumber(formObject.holy)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid holy resistance specified.");
	}
	if (noValue(formObject.nature) || notWholeNumber(formObject.nature)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid nature resistance specified.");
	}
	if (noValue(formObject.shadow) || notWholeNumber(formObject.shadow)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid shadow resistance specified.");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateAddCharacterForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a name
	if (noValue(formObject.name)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No character name specified");
	}
	
	// Make sure the character name has only letters
	if (! onlyLetters(formObject.name)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "A character name may only contain letters");
	}
	
	// Make sure the talent points are set correctly (if specified)
	if (! noValue(formObject.treepointsone) && notWholeNumber(formObject.treepointsone)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Invalid talent points specified in the 1st talent tree.");
	}
	if (! noValue(formObject.treepointstwo) && notWholeNumber(formObject.treepointstwo)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Invalid talent points specified in the 2nd talent tree.");
	}
	if (! noValue(formObject.treepointsthree) && notWholeNumber(formObject.treepointsthree)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Invalid talent points specified in the 3rd talent tree.");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateRegisterForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a username
	if (noValue(formObject.username)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No username specified");
	}
	
	// Make sure the username has only letters
	if (! onlyLetters(formObject.username)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "A username may only contain letters");
	}
	
	// Make sure there is a password
	if (noValue(formObject.password)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No password specified");
	}
	
	// If there is an email address then make sure it's valid
	if (! noValue(formObject.emailaddress) && ! validEmailAddress(formObject.emailaddress)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "Email address is not valid");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateRaidSpotsForm(formObject, selectedBuilds) {

	// Set the selected builds to post
	formObject.selectedclassbuilds.value = "";
	for (var k in selectedBuilds) {
		if (k != "ln") {
			if (! noValue(formObject.selectedclassbuilds)) {
				formObject.selectedclassbuilds.value += ",";
			}
			formObject.selectedclassbuilds.value += k;
		}
	}
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a description
	if (noValue(formObject.description)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No spot description specified");
	}
	
	// Make sure there is at least one class build
	if (noValue(formObject.selectedclassbuilds)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No qualifying builds specified");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		
		return true;
	}
}


function validateRaidTemplatesForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a name
	if (noValue(formObject.name)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No raid template name specified");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateEventRunsForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a start date
	if (noValue(formObject.startdate)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No start date specified");
	}
	
	// Make sure there is a valid start time
	if (! validTime(formObject.starttime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid start time specified");
	}
	
	// Make sure there is a finish date
	if (noValue(formObject.finishdate)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No finish date specified");
	}
	
	// Make sure there is a valid finish time
	if (! validTime(formObject.finishtime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid finish time specified");
	}
	
	// Make sure the finish date/time is not before the start date time
	if(formValid && ! dateOneStringBeforeDateTwoString(formObject.startdate.value + " " + formObject.starttime.value, formObject.finishdate.value + " " + formObject.finishtime.value)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The finish time must be after the start time");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		enableField("startdate");
		enableField("finishdate");
		enableField("raidid");
		enableField("instance");
		return true;
	}
}


function validateEventsForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a name
	if (noValue(formObject.name)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No event name specified");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateBetaAppForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a real name
	if (noValue(formObject.realname)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No real name specified");
	}
	
	// Make sure there is an email address
	if (noValue(formObject.emailaddress)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid email address specified");
	}
	
	// Make sure there is a finish date
	if (noValue(formObject.maincharactername)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No main character name specified");
	}
	
	// Make sure there is a guild name
	if (noValue(formObject.guildname)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No guild name specified");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		return true;
	}
}


function validateSubscriptionRunForm(formObject) {
	
	var formValid = true;
	var invalidFormMessage = "";

	// Make sure there is a start date
	if (noValue(formObject.startdate)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No start date specified");
	}
	
	// Make sure there is a valid start time
	if (! validTime(formObject.starttime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid start time specified");
	}
	
	// Make sure there is a finish date
	if (noValue(formObject.finishdate)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No finish date specified");
	}
	
	// Make sure there is a valid finish time
	if (! validTime(formObject.finishtime)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "No valid finish time specified");
	}
	
	// Make sure the finish date/time is not before the start date time
	if(formValid && ! dateOneStringBeforeDateTwoString(formObject.startdate.value + " " + formObject.starttime.value, formObject.finishdate.value + " " + formObject.finishtime.value)) {
		formValid = false;
		invalidFormMessage = addInvalidFormMessage(invalidFormMessage, "The finish time must be after the start time");
	}

	// If the form isnt valid display an error
	if (! formValid) {
		alert(invalidFormMessage);
		return false;
		
	// Otherwise disable the submit button and submit the form
	} else {
		disableSubmitButton(formObject);
		enableField("startdate");
		enableField("finishdate");
		return true;
	}
}


// Validate the first date string is before the second date string
function dateOneStringBeforeDateTwoString(dateOneString, dateTwoString) {

	var dateOne = Date.parse(dateOneString);
	var dateTwo = Date.parse(dateTwoString);
	
	return dateOneBeforeDateTwo(dateOne, dateTwo);
}


// Validate the first date string is before or equal to the second date string
function dateOneStringBeforeOrEqualDateTwoString(dateOneString, dateTwoString) {

	var dateOne = Date.parse(dateOneString);
	var dateTwo = Date.parse(dateTwoString);
	
	return dateOneBeforeOrEqualDateTwo(dateOne, dateTwo);
}


// Validate the first date is before the second date
function dateOneBeforeDateTwo(dateOne, dateTwo) {
	
	if (dateOne < dateTwo) {
		return true;
	} else {
		return false;
	}
}


// Validate the first date is before the second date
function dateOneBeforeOrEqualDateTwo(dateOne, dateTwo) {
	
	if (dateOne <= dateTwo) {
		return true;
	} else {
		return false;
	}
}


// Validate a field value contains only letters
function onlyLetters(formField) {
	var re = /^[A-Za-z\u00C1-\u050F]+$/;
	
	if (formField.value.match(re)) {
		return true;
	} else {
		return false;
	}
}


// Validate a field value contains only letters and spaces
function onlyLettersAndSpaces(formField) {
	var re = /^[A-Za-z\u00C1-\u017E\s]+$/;
	
	if (formField.value.match(re)) {
		return true;
	} else {
		return false;
	}
}


// Validate a field value contains an acceptable time
function validTime(formField) {
	var re = /^([0-1]\d|2[0-3]):[0-5]\d(:[0-6][0-9])?$/;
	
	if (! formField.value.match(re)) {
		return false;
	} else {
		return true;
	}
}


// Validate a field value contains an acceptable date
function validDate(formField) {

	var parsedDate = Date.parse(formField.value);

	if (isNaN(parsedDate)) {
		return false;
	} else {
		return true;
	}
}


function validEmailAddress(formField) {
   var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
   var address = formField.value;
   if(reg.test(address) == false) {
   	return false;
   } else {
   	return true;
  }
}



function notWholeNumber(formField) {
	var re = /^\-?[0-9]+$/;
	
	if (! formField.value.match(re)) {
		return true;
	} else {
		return false;
	}
}


function notNumber(formField) {
	var re = /^\-?[0-9]*\.?[0-9]+$/;
	
	if (! formField.value.match(re)) {
		return true;
	} else {
		return false;
	}
}


function noValue(formField) {
	if (formField.value == "") {
		return true;
	} else {
		return false;
	}
}


function noValidXML(formField, elementToFind) {
	
	var xmlObject;
	if (window.ActiveXObject) {
		xmlObject = new ActiveXObject("Microsoft.XMLDOM");
		xmlObject.async="false";
		xmlObject.loadXML(formField.value);
	} else {
		var parser = new DOMParser();
		xmlObject = parser.parseFromString(formField.value, "text/xml");
	}
	
	if (xmlObject.getElementsByTagName(elementToFind).length == 0) {
		return true;
	} else {
		return false;
	}
}


function valueIsZero(formField) {
	var convertedFloat = parseFloat(formField.value);
	
	if (isNaN(convertedFloat) || convertedFloat == 0) {
		return true;
	} else {
		return false;
	}
}


function noneSelected(selectField) {
	if (selectField.length < 1) {
		return true;
	} else {
		return false;
	}
}


function numberOfCheckboxesSelected(formObject) {
	
	// Initialise flag for how many checkboxes are checked
	var checkboxesCheckedCount = 0;

	// Loop through the form elements	
	for(var formI=0; formI < formObject.elements.length; formI++) {
		if (formObject.elements[formI].type == "checkbox" && formObject.elements[formI].checked) {
			checkboxesCheckedCount++;
		}
	}
	return checkboxesCheckedCount;	
}


function numberOfCheckboxesSelectedExcluding(formObject, excludeCheckboxName) {
	
	// Initialise flag for how many checkboxes are checked
	var checkboxesCheckedCount = 0;

	// Loop through the form elements	
	for(var formI=0; formI < formObject.elements.length; formI++) {
		if (formObject.elements[formI].type == "checkbox" && formObject.elements[formI].checked && formObject.elements[formI].name != excludeCheckboxName) {
			checkboxesCheckedCount++;
		}
	}
	return checkboxesCheckedCount;	
}


function numberOfCheckboxesSelectedExcludingAll(formObject, excludeCheckboxNames) {
	
	// Initialise flag for how many checkboxes are checked
	var checkboxesCheckedCount = 0;

	// Loop through the form elements	
	for(var formI=0; formI < formObject.elements.length; formI++) {
		if (formObject.elements[formI].type == "checkbox" && formObject.elements[formI].checked && ! elementExistsInArray(formObject.elements[formI].name, excludeCheckboxNames)) {
			checkboxesCheckedCount++;
		}
	}
	return checkboxesCheckedCount;	
}


function getRadioValue(radioObject) {
	for (var i = 0; i < radioObject.length; i++) {
		if (radioObject[i].checked) {
			return radioObject[i].value;
			break;
		}
	}
	
	return null;
}


function addInvalidFormMessage(currentMessage, newMessage) {
	
	if (currentMessage == "") {
		currentMessage = currentMessage + "Your form is incomplete or contains invalid data:\n";
	}
	
	currentMessage = currentMessage + newMessage + "\n";
	
	return currentMessage;	
}