function validate(fieldSet, validateConditional) {
	if (fieldSet == null) {
		fieldSet = fields
	}

	for(j = 0; j < fieldSet.length; j++) {
		field = fieldSet[j]
		fieldValue = field.getValue()
		req = field.required
		val = field.validation

		if (fieldValue == "") {
			if (req == "true" || (req == "conditional" && validateConditional)) { validateRequired(field) }
		} else if (fieldValue != "") {
			if (val.indexOf("amount") != -1) { validateChars(field, !LETTERS, NUMBERS, SPACES, !RETURNS, ".") }
		}
	}
}

function validateChars(
	field,
	lettersOk,
	numbersOk,
	spacesOk,
	returnsOk,
	charSet
) {
	fieldValue = field.getValue()
	for (i = 0; i < fieldValue.length; i++) {
		ch = fieldValue.charAt(i)
		if (!(
			(lettersOk && ch >= "A" && ch <= "Z") ||
			(lettersOk && ch >= "a" && ch <= "z") ||
			(numbersOk && ch >= "0" && ch <= "9") ||
			(spacesOk && ch == " ") ||
			(returnsOk && "\n\r".indexOf(ch) != -1) ||
			(charSet.indexOf(ch) != -1)
		)) {
			lettersMsg = (lettersOk ? letters : "") 
			numberMsg =	(numbersOk ? numbers : "") 
			spacesMsg =	(spacesOk ? spaces : "") 
			returnsMsg = (returnsOk ? returns : "")
			charGroup = ""
			charSetLength = charSet.length
			for (x = 0; x < charSetLength; x++) {
				charGroup += (x != 0 ? (x == charSetLength - 1 ? " and " : ", ") : "") + "[" + charSet.charAt(x) + "]"
			}
			charSetMsg = (charSet != "" ? (charSetLength == 1 ? theCharacter : theCharacters) + charGroup : "") 
			chars =	lettersMsg	
			chars += (chars != "" && numberMsg != "" ? (spacesMsg == "" && returnsMsg == "" && charSet == "" ? and : ", ") : "") + numberMsg
			chars += (chars != "" && spacesMsg != "" ? (returnsMsg == "" && charSet == "" ? and : ", ") : "") + spacesMsg
			chars += (chars != "" && returnsMsg != "" ? (charSet == "" ? and : ", ") : "") + returnsMsg
			chars += (chars != "" && charSetMsg != "" ? and : "") + charSetMsg
			error(insertFieldNameIntoMessage(fieldHasIllegalChars, field) + chars + ".", field, "characters")
			return true
		}
	}
	return false		
}

function validateRequired(field, displayError) {
	if (displayError == null) displayError = true
	fieldRef = field.getField()
	fieldValue = field.getValue()
	type = (fieldRef.type == null) ? fieldRef[0].type : fieldRef.type
	if (type == "checkbox") {
		if (fieldValue == "off") {
			if (displayError) error(insertFieldNameIntoMessage(mustBeChecked, field), field, "required")
			return true
		} 
		return false
	} else if (type == "radio") {
		oneIsSelected = false
		for (i = 0; i < fieldRef.length; i++) {
			oneIsSelected = oneIsSelected || fieldRef[i].checked
		}
		if (!oneIsSelected) {
			if (displayError) error(insertFieldNameIntoMessage(mustSelectOneRadioButton, field), field, "required")
			return true
		} else {
			return false
		}
	} else if (fieldRef == null || fieldValue == "") {
		if (displayError) error(insertFieldNameIntoMessage(isRequiredAndMissing, field), field, "required")
		return true
	} else {
		return false
	}
}

