var errorCodes = new Array()
errorCodes["required"] = "x100"
errorCodes["lengthVal"] = "x200"
errorCodes["characters"] = "x300"
errorCodes["exclusive"] = "x500"
errorCodes["allIfAny"] = "x510"
errorCodes["atLeastOne"] = "x520"
errorCodes["atMostOne"] = "x530"
errorCodes["oneAndOnlyOne"] = "x540"
errorCodes["dependant"] = "x550"
errorCodes["match"] = "x560"
errorCodes["cardFormat"] = "x600"
errorCodes["visaLength"] = "x610"
errorCodes["visaChar"] = "x620"
errorCodes["mcLength"] = "x630"
errorCodes["mcChar"] = "x640"
errorCodes["email"] = "x700"
errorCodes["date"] = "x800"
errorCodes["zipCode"] = "x900"

function autoTabOnLength(fieldRef, size, focusField, evt) {
	keyCode = (navigator.appName.indexOf("Netscape") != -1 ? evt.which : evt.keyCode)
	if (fieldRef.value.length == size && keyCode >= "32") {
		fields[focusField].getField().select()
	}
	return true
}

function cancelChanges() {
	form = getForm()
	servletMap("CANCEL_CHANGES")
	form.RESULT.value = "CANCEL_CHANGES"
	setFormAction(lookupNameValuePair(document.mainForm.SESSION.value, "SUBMIT_PAGE"))
	formSubmit(form)
}

function groupError(msg, fieldSet) {
	fieldSetLength = fieldSet.length
	for (var k = 0; k < fieldSetLength; k++) {
		if (k == 0) {
			error(msg, fieldSet[0])
		} else {
			error("*", fieldSet[k])
		}
	}
}

function modify(pageName, focusField) {
	form = getForm()
	
	if (form.tncScroll != null) {
	    if (form.tncScroll.value != null)
	         form.tncScroll.value = ""
	}
	
	servletMap("MODIFY")
	form.RESULT.value = "MODIFY"
	setFormAction(pageName, null, null, focusField)
	formSubmit(form)
}

function returnTxn(pageName, focusField) {
	form = getForm()
	servletMap("SUBMIT")
	form.RESULT.value = "SUBMIT"
	setFormAction(pageName, null, null, focusField)
	formSubmit(form)
}

function pad(text, size, padChar, align) {
	if (align == null) align = "right"
	while (text.length < size) {
		text = (align == "right") ? padChar + text : text + padChar
	}
	return text;
}

function radioClick(radioButton, onlyOn, which) {
	radioName = radioButton.name
	if ((which == null && (radioSets[radioName] == null || radioSets[radioName] != radioButton)) || which == "on") {
		radioSets[radioName] = radioButton
		radioButton.checked = true
	} else if (onlyOn != true || which == "off") {
		radioButton.checked = false
		radioSets[radioName] = null
	}
}

function saveChanges() {
	form = getForm()
	servletMap(lookupNameValuePair(resultValue, "DISPLAY"))
	form.RESULT.value = "SAVE_CHANGES"
	setFormAction(lookupNameValuePair(document.mainForm.SESSION.value, "SUBMIT_PAGE"))
	formSubmit(form)
}

function validate(fieldSet, validateConditional) {
	if (fieldSet == null) {
		fieldCount = fieldNames.length
	} else {
		fieldCount = fieldSet.length
	}
	if (validateConditional != true) {
		validateConditional = false
	}
	for(j = 0; j < fieldCount; j++) {
		if (fieldSet == null) {
			field = fields[fieldNames[j]]
		} else {
			field = fieldSet[j]
		}
		fieldName = field.name
		fieldType = field.type
		groupName = field.group
		value = field.getValue()
		req = field.required
		val = field.validation
		fieldLength = field.length
		fieldMatch = field.match

		if (value == "" || (fieldType == "checkbox" && value == "off")) {
			if (req == "true" || (req == "conditional" && validateConditional)) { validateRequired(field) }
			else if (req.indexOf("dependant") != -1) { validateDependant(field) }
			else if (req.indexOf("exclusive") != -1) { validateExclusive(field) }
		} else if (value != "") {
			if (fieldLength != "") { validateLength(field) }

			if (val.indexOf("RUalphabetic") != -1) { validateRUChars(field, LETTERS, !NUMBERS, SPACES, !RETURNS, "-,") }
			else if (val.indexOf("RUalphaNumeric") != -1) { validateRUChars(field, LETTERS, NUMBERS, SPACES, !RETURNS, "-,") }
			else if (val.indexOf("alphabetic") != -1) { validateChars(field, LETTERS, !NUMBERS, SPACES, !RETURNS, "-,") }
			else if (val.indexOf("alphaNumeric") != -1) { validateChars(field, LETTERS, NUMBERS, SPACES, !RETURNS, "-,") }
			else if (val.indexOf("amount") != -1) {
				validateChars(field, !LETTERS, NUMBERS, SPACES, !RETURNS, ".,")
				validateAmountFormat(field)
			}
			else if (val.indexOf("city") != -1) { validateChars(field, LETTERS, NUMBERS, SPACES, !RETURNS, "-.") }
			else if (val.indexOf("RUcontactUs") != -1) { validateRUChars(field, LETTERS, NUMBERS, SPACES, RETURNS, "!#$'*+,-.:=?_") }
			else if (val.indexOf("contactUs") != -1) { validateChars(field, LETTERS, NUMBERS, SPACES, RETURNS, "!#$'*+,-.:=?_") }
			else if (val.indexOf("letter") != -1) { validateChars(field, LETTERS, !NUMBERS, !SPACES, !RETURNS, "") }
			else if (val.indexOf("country") != -1) { validateChars(field, LETTERS, NUMBERS, !SPACES, !RETURNS, "") }
			else if (val.indexOf("language") != -1) { validateChars(field, LETTERS, NUMBERS, !SPACES, !RETURNS, "") }
			else if (val.indexOf("birthdate") != -1) { validateChars(field, !LETTERS, NUMBERS, !SPACES, !RETURNS, "*") }
			else if (val.indexOf("number") != -1) { validateChars(field, !LETTERS, NUMBERS, !SPACES, !RETURNS, "") }
			else if (val.indexOf("numeric") != -1) { validateChars(field, !LETTERS, NUMBERS, SPACES, !RETURNS, "-,.") }
			else if (val.indexOf("person_name") != -1) { validateChars(field, LETTERS, !NUMBERS, SPACES, !RETURNS, ".'") }
			else if (val.indexOf("standard") != -1) { validateChars(field, LETTERS, NUMBERS, SPACES, !RETURNS, "-.#@:,/'+") }
			else if (val.indexOf("message") != -1) { validateChars(field, LETTERS, NUMBERS, SPACES, !RETURNS, "-.#@:,/'+$") }
			else if (val.indexOf("telegram") != -1) { validateChars(field, LETTERS, NUMBERS, SPACES, RETURNS, "!#$%'*+,-./:=?_") }
			else if (val.indexOf("zipCode") != -1) { validateChars(field, !LETTERS, NUMBERS, SPACES, !RETURNS, "") }
			else if ((val.indexOf("postalCode") != -1) && ("SE".indexOf(getRegion()) != -1)) { validateChars(field, LETTERS, NUMBERS, SPACES, !RETURNS, "-") }
			else if (val.indexOf("postalCode") != -1) { validateChars(field, LETTERS, NUMBERS, SPACES, !RETURNS, "") }
			else if (val.indexOf("creditCard") != -1) { validateCreditCard(field) }
			else if (val.indexOf("emailID") != -1) { validateEmailID(field) }
			else if (val.indexOf("email") != -1) { validateEmail(field) }
			else if (val.indexOf("date") != -1) { validateDate(field) }
			else if (val.indexOf("match") != -1) { validateFieldMatch(field) }
			else if (val.indexOf("ignoreCase") != -1) { validateFieldIgnoreCase(field) }
			else if (val.indexOf("postalCodeFormat") != -1) { validatePostalCode(field) }
			else if (val.indexOf("phoneNumber") != -1) {validatePhoneNumber(field) }
		}

		if (req.indexOf("allIfAny") != -1) { validateAllIfAny(field) }
		else if (req.indexOf("atMostOne") != -1) { validateAtMostOne(field) }
		else if (req.indexOf("atLeastOne") != -1) { validateAtLeastOne(field) }
		else if (req.indexOf("oneAndOnlyOne") != -1) { validateOneAndOnlyOne(field) }
	}
}

function validateAll(field, fieldSet, displayError) {
	if (displayError == null) displayError = true
	if (fieldSet == null) {
		fieldSet = groups[field.group]
	}
	hasError = false
	for (var k = 0; k < fieldSet.length; k++) {
		hasError = validateRequired(fieldSet[k], displayError)
	}
	if (hasError) {
		return false
	} else {
		return true
	}
}

function validateAllIfAny(field, fieldSet, displayError) {
	if (displayError == null) displayError = true
	if (fieldSet == null) {
		fieldSet = groups[field.group]
	}
	firstFieldWithValue = null
	for(k = 0; k < fieldSet.length; k++) {
		if (fieldSet[k].getValue() != "") {
			firstFieldWithValue = fieldSet[k]
			break
		}
	}
	if (firstFieldWithValue == null) {
		return true
	} else {
		hasError = false
		for (var k = 0; k < fieldSet.length; k++) {
			if (fieldSet[k].getValue() == "") {
				hasError = true
				if (displayError) error(convertChar(convertChar(allIfAny, "[N]", fieldSet[k].label), "[M]", firstFieldWithValue.label), fieldSet[k], "allIfAny")
			}
		}
		if (hasError) {
			return false
		} else {
			return true
		}
	}
}

function validateAmountFormat(field) {
	if (",AU,CA,GB,IE,US,".indexOf("," + getRegion() + ",") != -1) {
		var amountRE = new RegExp("^\\d*(\\.\\d{2})?$")
		if (amountRE.exec(field.getValue()) == null) {
			error(amountFormat, field, "amountFormat")
		}
	}
}

function validateAtLeastOne(field, fieldSet, displayError) {
	if (displayError == null) displayError = true
	if (fieldSet == null) {
		fieldSet = groups[field.group]
	}
	firstFieldWithValue = null
	fieldSetLength = fieldSet.length
	fieldList = ""
	for (var k = 0; k < fieldSetLength; k++) {
		fieldList += (k != 0 ? (k == fieldSetLength - 1 ? or : ", ") : "") + fieldSet[k].label
	}
	for (var k = 0; k < fieldSet.length; k++) {
		fieldValue = fieldSet[k].getValue()
		if (fieldValue != null && fieldValue != "") {
			firstFieldWithValue = fieldSet[k]
			break
		}
	}
	if (firstFieldWithValue == null) {
		if (displayError) groupError(convertChar(atLeastOne, "[N]", fieldList), fieldSet, "atLeastOne")
		return false
	} else {
		return true
	}
}

function validateAtMostOne(field, fieldSet, displayError) {
	if (displayError == null) displayError = true
	if (fieldSet == null) {
		fieldSet = groups[field.group]
	}
	firstFieldWithValue = null
	hasError = false
	for (var k = 0; k < fieldSet.length; k++) {
		if (fieldSet[k].getValue() != "") {
			if (firstFieldWithValue == null) {
				firstFieldWithValue = fieldSet[k]
			} else {
				hasError = true
				if (displayError) error(convertChar(convertChar(atMostOne, "[N]", fieldSet[k].label), "[M]", firstFieldWithValue.label), fieldSet[k], "atMostOne")
			}
		}
	}
	if (hasError) {
		return false
	} else {
		return true
	}
}

function validateCAPostalCode(field) {
	var regExp = "[A-Za-z]\\d[A-Za-z][ -]?\\d[A-Za-z]\\d"
	var postalCodeRegExp = new RegExp(regExp)

	var result = postalCodeRegExp.exec(field.getValue())
	if (result == null) {
		error(insertFieldNameIntoMessage(notAValidCAPostalCode, field), field, "postalCode")
		return true
	} else {
		return false
	}
}

function validateChars(
	field,
	lettersOk,
	numbersOk,
	spacesOk,
	returnsOk,
	charSet
) {
	fieldValue = field.getValue()
	for (var i = 0; i < fieldValue.length; i++) {
		ch = fieldValue.charAt(i)
		if (!(
			(lettersOk && ch >= "A" && ch <= "Z") ||
			(lettersOk && ch >= "a" && ch <= "z") ||
			(lettersOk && "AT,DE".indexOf(getRegion()) != -1  && "öäüßÖÄÜ".indexOf(ch) != -1) ||
			(lettersOk && "FR".indexOf(getRegion()) != -1  && "ÀàÁáÂâÉéÈèÊêËëÇçÎîÏïÓóÔôÙùÛûŒœ".indexOf(ch) != -1) ||
			(lettersOk && "NL".indexOf(getRegion()) != -1  && "ÿ".indexOf(ch) != -1) ||
			(lettersOk && "NO".indexOf(getRegion()) != -1  && "ÅåøØæÆ".indexOf(ch) != -1) ||			
			(lettersOk && "SE".indexOf(getRegion()) != -1  && "ÅÄÖåäö".indexOf(ch) != -1) ||
			(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 (var 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 validateRUChars(
	field,
	lettersOk,
	numbersOk,
	spacesOk,
	returnsOk,
	charSet
) {
	fieldValue = field.getValue()
	for (var i = 0; i < fieldValue.length; i++) {
		ch = fieldValue.charAt(i)
		if (!(
			(lettersOk && ch >= "A" && ch <= "Z") ||
			(lettersOk && ch >= "a" && ch <= "z") ||
			(lettersOk && "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя".indexOf(ch) != -1) ||
			(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 (var 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 validateCreditCard(numberField) {
	ccNumber = numberField.getValue()
	typeField = fields[numberField.targets[0][0]]
	ccType = typeField.getValue()
	var typeVisa = ccType == "Visa" || ccType == "VisaDebit" ? true : false
	var typeMaster = ccType == "MasterCard" || ccType == "MasterDebit" ? true : false

	if (validateChars(numberField, !LETTERS, NUMBERS, !SPACES, !RETURNS, "")) return
	if (typeVisa) {
		firstChar = ccNumber.substring(0, 1)
		if (ccNumber.length != 13 && ccNumber.length != 16) {
			error(visaLength, numberField, "visaLength")
			return true
		}
		if (firstChar != "4") {
			error(visaChar, numberField, "visaChar")
			return true
		}
		if (!validateCreditCardFormat(ccNumber)) {
			error(cardFormat, numberField, "cardFormat")
			return true
		}
	} else if (typeMaster) {
		firstChar = ccNumber.substring(0, 1)
		if (ccNumber.length != 16) {
			error(mcLength, numberField, "mcLength")
			return true
		} else if (firstChar != "5") {
			error(mcChar, numberField, "mcChar")
			return true
		}
		if (!validateCreditCardFormat(ccNumber)) {
			error(cardFormat, numberField, "cardFormat")
			return true
		}
	} else if (ccType == "American Express") {
		firstChar = ccNumber.substring(0, 2)
		if (ccNumber.length != 15) {
			error(axLength, numberField, "axLength")
			return true
		} else if (firstChar != "37") {
			error(axChar, numberField, "axChar")
			return true
		}
	}
	return false
}

function validateCreditCardFormat(cc){
    sb = "";
    sum = 0;
    for(var i=1; i <= cc.length; i++) {
        a = parseInt(cc.charAt(cc.length - i));
        b = (i%2 == 0) ? 2:1;

        sb += a*b;
    }
    for(var j = 0; j < sb.length; j++) {
        sum += parseInt(sb.charAt(j));
    }

    return sum % 10 == 0;
}

function validateDate(field) {
	var regExp = new RegExp("^([0-9][0-9]?)[^0-9]([0-9][0-9]?)[^0-9]([0-9][0-9]([0-9][0-9])?)$")
	var result = regExp.exec(field.getValue())
	if (result != null) {
		var month = result[1]
		var day = result[2]
		var year = result[3]
		if (year.length == 2) {
			year = "20" + year
		}
		var date = new Date(month +"/"+ day +"/"+ year)
		if (
			date.getMonth() + 1 != parseInt(removeLeadingZeros(month)) ||
			date.getDate() != parseInt(removeLeadingZeros(day)) ||
			(date.getYear() != parseInt(year) && date.getYear() + 1900 != parseInt(year))
		) {
			result = null
		}
	}
	if (result == null) {
		error(notAValidDate, field, "date")
		return true
	} else {
		return false
	}
}

function removeLeadingZeros(value) {
	if (value == null) return ""
	while (value.charAt(0) == "0" && value.length > 1) {
		value = value.substring(1)
	}
	return value
}

function validateDependant(field) {
	targets = field.targets
	fieldRef = field.getField()
	fieldValue = field.getValue()
	fieldType = (fieldRef.type == null) ? fieldRef[0].type : fieldRef.type
	for (var n = 0; n < targets.length; n++) {
		target = fields[targets[n][0]]
		targetRequiredValue = targets[n][1]
		targetActualValue = target.getValue()
		targetType = target.type
		if (
			(targetRequiredValue == "" && ((targetType != "checkbox" && targetActualValue != "") || (targetType == "checkbox" && targetActualValue != "off"))) ||
			(targetRequiredValue != "" && targetActualValue == targetRequiredValue)
		) {
			if (fieldType == "checkbox") {
				error(insertFieldNameIntoMessage(mustBeChecked, field), field, "dependant")
			} else if (fieldType == "radio") {
				error(insertFieldNameIntoMessage(mustSelectOneRadioButton, field), field, "dependant")
			} else {
				error(insertFieldNameIntoMessage(isRequiredAndMissing, field), field, "dependant")
			}
			return true
		}
	}
	return false
}

function validateEmailID(field) {
	fieldValue = field.getValue()
	var validID = true
	if (fieldValue.length < 1 && fieldValue.length > 40) {
		validID = false
	}
	numAtSigns = 0
	for (var i = 0; validID && i < fieldValue.length; i++) {
		ch = fieldValue.charAt(i)
		chValue = parseInt(ch)
		if (chValue < 32 && chValue > 126) validID = false
		if (ch == "@") {
			numAtSigns = numAtSigns + 1
			if (numAtSigns > 1) validID = false
		}
	}
	if (numAtSigns != 1) validID = false
	else if (fieldValue.indexOf("@") <= 0 || fieldValue.indexOf("@") > (fieldValue.length - 3)) validID = false
	//else if (fieldValue.substring(fieldValue, fieldValue.indexOf("@") + 1).indexOf(".") < 2) validID = false
	else if (fieldValue.substring(fieldValue, fieldValue.indexOf("@") + 1).indexOf(".") == 0)
	{
		validID = false
	}
	else if (fieldValue.substring(fieldValue.indexOf("@") + 1,fieldValue.length).indexOf(".") < 1)
	{
		validID = false
	}
	else if (fieldValue.substring(fieldValue.length - 1,fieldValue.length).indexOf(".") > -1 )
	{
		validID = false
	}
	else if (fieldValue.indexOf(".") == (fieldValue.length - 1)) validID = false
	if (!validID) {
		error(insertFieldNameIntoMessage(notAValidEmailAddr, field), field, "email")
		return true
	}
	return validateEmail(field)
}

function validateEmail(field) {
	exclChars = "{}\\[\\]\\(\\)<>,\";@\\n"
	normalExclChars = "[^" + exclChars + " ]"
	noDotExclChars = "[^" + exclChars + "\\. ]"
	initExclChars = "[^" + exclChars + "]"
	mailBox = normalExclChars + "+@(" + noDotExclChars + "+\\.)+" + noDotExclChars + "+"
	regExp = "^" + mailBox + "$" +
		"|^" + initExclChars + "*<" + mailBox + ">$" +
		"|^" + initExclChars + "*\\{" + mailBox + "\\}$" +
		"|^" + initExclChars + "*\\[" + mailBox + "\\]$" +
		"|^" + initExclChars + "*\\(" + mailBox + "\\)$"
	re = new RegExp(regExp)
	result = re.exec(field.getValue())
	if (result == null) {
		error(insertFieldNameIntoMessage(notAValidEmailAddr, field), field, "email")
		return true
	} else {
		return false
	}
}

function validateExclusive(field) {
	targets = field.targets
	fieldRef = field.getField()
	fieldValue = field.getValue()
	fieldType = (fieldRef.type == null) ? fieldRef[0].type : fieldRef.type

	for (var n = 0; n < targets.length; n++) {
		target = fields[targets[n][0]]
		targetRequiredValue = targets[n][1]
		targetActualValue = target.getValue()
		targetType = target.type
		if (
			(targetRequiredValue == "" && ((targetType != "checkbox" && targetActualValue == "") || (targetType == "checkbox" && targetActualValue == "off"))) ||
			(targetRequiredValue != "" && targetActualValue != targetRequiredValue)
		) {
			if (fieldType == "checkbox") {
				error(insertFieldNameIntoMessage(mustBeChecked, field), field, "exclusive")
			} else if (fieldType == "radio") {
				error(insertFieldNameIntoMessage(mustSelectOneRadioButton, field), field, "exclusive")
			} else {
				error(insertFieldNameIntoMessage(isRequiredAndMissing, field), field, "exclusive")
			}
			return true
		}
	}
	return false
}

function validateFieldMatch(field) {
	targets = field.targets
	fieldRef = field.getField()
	fieldValue = field.getValue()
	fieldLabel = field.label

	for (var n = 0; n < targets.length; n++) {
		target = fields[targets[n][0]]
		targetActualValue = target.getValue()
		if (targetActualValue != fieldValue) {
			message = convertChar(fieldsDoNotMatch, "[M]", fieldLabel)
			error(insertFieldNameIntoMessage(message, target), field, "match")
			return true
		}
	}
	return false
}

function validateFieldIgnoreCase(field) {
	targets = field.targets
	fieldRef = field.getField()
	fieldValue = field.getValue()
	fieldLabel = field.label

	for (var n = 0; n < targets.length; n++) {
		target = fields[targets[n][0]]
		targetActualValue = target.getValue()
		if (targetActualValue.toUpperCase() != fieldValue.toUpperCase()) {
			message = convertChar(fieldsDoNotMatch, "[M]", fieldLabel)
			error(insertFieldNameIntoMessage(message, target), field, "match")
			return true
		}
	}
	return false
}

function validateLength(field) {
	fieldRef = field.getField()
	fieldValue = field.getValue()
	fieldLength = field.length
	maxLength = ""
	if ((offset = fieldLength.indexOf(",")) != -1) {
		maxLength = parseInt(fieldLength.substring(offset + 1))
		fieldLength = parseInt(fieldLength.substring(0, offset))
		fieldLengthValidation = ","
	} else {
		fieldLengthValidation = fieldLength.charAt(0)
		fieldLength = parseInt(fieldLength.substring(1))
	}
	if (
		fieldLengthValidation == "" ||
		(fieldLengthValidation == "-" && fieldValue.length <= fieldLength) ||
		(fieldLengthValidation == "=" && fieldValue.length == fieldLength) ||
		(fieldLengthValidation == "+" && fieldValue.length >= fieldLength) ||
		(fieldLengthValidation == "," && fieldValue.length >= fieldLength && fieldValue.length <= maxLength)
	) {
		return false
	} else {
		if (fieldLengthValidation == "=") {
			message = lengthValidationEquals
		} else if (fieldLengthValidation == "-") {
			message = lengthValidationLessThan
		} else if (fieldLengthValidation == "+") {
			message = lengthValidationGreaterThan
		} else if (fieldLengthValidation == ",") {
			message = lengthValidationInRange
		}
		message = convertChar(message, "[L]", fieldLength)
		message = convertChar(message, "[M]", maxLength)
		error(insertFieldNameIntoMessage(message, field), field, "lengthVal", [["[N]", field.label],["[L]", fieldLength],["[M]", maxLength],["[A]", fieldValue.length]])
		return true
	}
}

function validateOneAndOnlyOne(field, fieldSet, displayError) {
	if (displayError == null) displayError = true
	if (fieldSet == null) {
		fieldSet = groups[field.group]
	}
	firstFieldWithValue = null
	hasError = false
	fieldSetLength = fieldSet.length
	fieldList = ""
	for (var k = 0; k < fieldSetLength; k++) {
		fieldList += (k != 0 ? (k == fieldSetLength - 1 ? or : ", ") : "") + fieldSet[k].label
	}
	for (var k = 0; k < fieldSetLength; k++) {
		if (fieldSet[k].getValue() != "") {
			if (firstFieldWithValue == null) {
				firstFieldWithValue = fieldSet[k]
			} else {
				hasError = true
				if (displayError) error(convertChar(convertChar(atMostOne, "[N]", fieldSet[k].label), "[M]", firstFieldWithValue.label), fieldSet[k], "oneAndOnlyOne")
			}
		}
	}
	if (firstFieldWithValue == null) {
		hasError = true
		if (displayError) groupError(convertChar(atLeastOne, "[N]", fieldList), fieldSet, "oneAndOnlyOne")
	}
	if (hasError) {
		return false
	} else {
		return true
	}
}

function validatePostalCode(field, displayError) {
}

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 (var 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
	}
}

function validateZip(field, allowZipPlus4) {
	var regExp
	if (allowZipPlus4 == true) {
		regExp = "^\\d\\d\\d\\d\\d$|^\\d\\d\\d\\d\\d-\\d\\d\\d\\d$"
	} else {
		regExp = "^\\d\\d\\d\\d\\d$"
	}
	var postalCodeRegExp = new RegExp(regExp)
	var result = postalCodeRegExp.exec(field.getValue())
	if (result == null) {
		error(insertFieldNameIntoMessage(notAValidZipCode, field), field, "zipCode")
		return true
	} else {
		return false
	}
}

//*** Validation for TD 1667 ***
function validatePhoneNumber(field) {
	var bValid = validateChars(field, !LETTERS, NUMBERS, !SPACES, !RETURNS, "") 
	if (!bValid)
	{
		var number = parseInt(field.getValue())
		if(number == 0)
		{
			error(invalidPhone, field, "invalidPhone")
			return true
		}
		else
		{
			return false
		}
	}
	else
	{
		return true
	}
}


//*** START BUBBLE UP HELP FUNCTIONS ***

// Popup Help
var WAIT_IN_MSECS = 500
var WAIT_IN_MSECS_HIDE = 200
var helpTimer = null
var hideHelpTimer = null

function registerMouseOver(helpWindowId, hotspotId, vOffset, location) {
	strExecute = "showHelp('" + helpWindowId + "', '" + hotspotId + "', " + ((vOffset != "" ? vOffset : 0) -60) + ", '" + location + "')"
	if (helpTimer == null) helpTimer = setTimeout(strExecute, WAIT_IN_MSECS)
}

function registerMouseOut(helpWindowId) {
	hideStatement = "hideHelp('" + helpWindowId + "')"
	if (hideHelpTimer == null) {
		hideHelpTimer = setTimeout(hideStatement, WAIT_IN_MSECS_HIDE)
	}
	if (helpTimer != null) {
		clearTimeout(helpTimer)
		helpTimer = null
	}
}

function showHelp(helpWindowId, hotspotId, vOffset, location) {
	var helpWindowStyle = getObjStyle(helpWindowId)
	var hotspot = getObj(hotspotId)
	helpWindowStyle.top = getElementTop(hotspot) + vOffset
	helpWindowStyle.left = getElementLeft(hotspot) + (location == "right" ? 32 : -204)
	helpWindowStyle.visibility = "visible"
}

function clearHideHelpTimer() {
 	if (hideHelpTimer != null) {
		clearTimeout(hideHelpTimer)
		hideHelpTimer = null
	}
}

function hideHelp(helpWindowId) {
	getObjStyle(helpWindowId).visibility = "hidden"
	clearHideHelpTimer()
}

function getElementLeft(element) {
	var leftPosition = element.offsetLeft
	var parentElement = element.offsetParent 
	while (parentElement != null) {
		leftPosition += parentElement.offsetLeft
		parentElement = parentElement.offsetParent
	}
	return leftPosition
}

function getElementTop(element) {
	var topPosition = element.offsetTop
	var parentElement = element.offsetParent  
	while (parentElement != null) {
		topPosition += parentElement.offsetTop
		parentElement = parentElement.offsetParent
	}
	return topPosition
}
//*** END BUBBLE UP HELP FUNCTIONS ***