
/* -------------------------------------------------------------------------- */
/*                              Field  Methods                                */
/* -------------------------------------------------------------------------- */

var EMPTY = 0, INVALID = -1, VALID = 1;
var IN_RANGE = 1, OUT_OF_RANGE = 0, INVALID_RANGE = -1;

function JSV_fvToUppercase(fieldObj) {
	fieldObj.value = fieldObj.value.toUpperCase();
}

function JSV_fvToLowercase(fieldObj) {
	fieldObj.value = fieldObj.value.toLowerCase();
}

/* ------------------------------------------------------------------------ */
/*                        Field Validation Methods                          */
/* ------------------------------------------------------------------------ */

function JSV_fsRequired(requiredValue) {
	return ( JSV_isWhitespace(requiredValue) ? false : true );
}

function JSV_fvRequired(requiredObj) {
	if (!JSV_fsRequired(requiredObj.value)) {
		alert("This field is required.");
		requiredObj.focus();
	}
}

function JSV_fsInteger(integerValue) {
	return ( (JSV_isWhitespace(integerValue)) ? EMPTY : ( JSV_isInteger(integerValue, false) ? VALID : INVALID ) );
}

function JSV_fvInteger(integerObj, emptyOK) {
	if (JSV_fvInteger.arguments[1] == null) emptyOK = false;
	var integerStatus = JSV_fsInteger(integerObj.value);

	if (integerStatus != VALID) {
		var errorMsg = '';
		if (integerStatus == EMPTY && !emptyOK)
			errorMsg = "This field must contain an integer.";
		else if (integerStatus == INVALID)
			errorMsg = "This field must contain a valid integer.";

		if (errorMsg.length != 0) {
			alert(errorMsg);
			integerObj.focus();
		}
	}
}

function JSV_fsSignedInteger(signedIntegerValue) {
	return ( (JSV_isWhitespace(signedIntegerValue)) ? EMPTY : ( JSV_isInteger(signedIntegerValue, true) ? VALID : INVALID ) );
}

function JSV_fvSignedInteger(signedIntegerObj, emptyOK) {
	if (JSV_fvSignedInteger.arguments[1] == null) emptyOK = false;
	var integerStatus = JSV_fsSignedInteger(signedIntegerObj.value);

	if (integerStatus != VALID) {
		var errorMsg = '';
		if (integerStatus == EMPTY && !emptyOK)
			errorMsg = "This field must contain an integer.";
		else if (integerStatus == INVALID)
			errorMsg = "This field must contain a valid integer.";

		if (errorMsg.length != 0) {
			alert(errorMsg);
			signedIntegerObj.focus();
		}
	}
}

function JSV_fsFloat(floatValue) {
	return ( (JSV_isWhitespace(floatValue)) ? EMPTY : ( JSV_isFloat(floatValue, true) ? VALID : INVALID ) );
}

function JSV_fvFloat(floatObj, emptyOK) {
	var	floatMsg = '',
		validFloat = true;

	if (JSV_fvFloat.arguments[1] == null) emptyOK = false;

	var validation = JSV_fsFloat(floatObj.value, emptyOK);

	if (!emptyOK && validation == EMPTY) {
		validFloat = false;
		floatMsg = "This field must contain a floating point number.";
	}
	else if (validation == INVALID) {
		validFloat = false;
		floatMsg = "This field must contain a valid floating point number."
	}

	if (!validFloat) {
		alert(floatMsg);
		floatObj.focus();
	}
}

function JSV_fsRange(rangeValue, nMinValue, nMaxValue) {
	var inRange = IN_RANGE;

	if ( JSV_isEmpty(JSV_fsRange.arguments[0]) || JSV_isEmpty(JSV_fsRange.arguments[1]) || JSV_isEmpty(JSV_fsRange.arguments[2]) )
		inRange = INVALID_RANGE;
	else if ( !JSV_isInteger(rangeValue) && !JSV_isFloat(rangeValue) )
		inRange = INVALID_RANGE;
	else if ( !JSV_isInteger(nMinValue) && !JSV_isFloat(nMinValue) )
		inRange = INVALID_RANGE;
	else if ( !JSV_isInteger(nMaxValue) && !JSV_isFloat(nMaxValue) )
		inRange = INVALID_RANGE;
	else
		inRange = ( (rangeValue < nMinValue || rangeValue > nMaxValue) ? OUT_OF_RANGE : IN_RANGE );

	return inRange;
}

function JSV_fvRange(rangeObj, nMinValue, nMaxValue) {
	if (JSV_fsRange(rangeObj.value, nMinValue, nMaxValue) != IN_RANGE) {
		alert("The value in this field is not in the range of " + nMinValue + " to " + nMaxValue + ".");
		rangeObj.focus();
	}
}

function JSV_fsDate(dateValue) {
	var isValidDate = VALID,
		dateArray = JSV_parseString(dateValue, "/-", false),
		numberOfSlashes = JSV_occurs(dateValue,"/"),
		numberOfDashes = JSV_occurs(dateValue,"-");

	if (JSV_isWhitespace(dateValue))
		isValidDate = EMPTY;
	else if ( numberOfSlashes != 2 && numberOfDashes != 2 )
		isValidDate = INVALID;
	else if ( JSV_allowInString(dateValue, jsvDigits + "/-") && dateArray.length == 3 ) {
		// Year
		var Year = dateArray[2];
		if ( JSV_toString(Year).length == 4 ) {
			// Month
			var Month = ( (dateArray[0].charAt(0) == "0") ? dateArray[0].charAt(1) : dateArray[0] );
			if (JSV_isMonth(Month)) {
				// Day
				var Day = ( (dateArray[1].charAt(0) == "0") ? dateArray[1].charAt(1) : dateArray[1] );
				isValidDate = ( JSV_isDay(Day, Month, Year) ? VALID : INVALID );
			}
			else {
				isValidDate = INVALID;
			}
		}
		else {
			isValidDate = INVALID;
		}
	}
	else {
		isValidDate = INVALID;
	}
	return isValidDate;
}

function JSV_fvDate(dateObj, emptyOK) {
	var dateMsg = '';
	var validation = JSV_fsDate(dateObj.value);

	if ( JSV_fvDate.arguments[1] == null ) emptyOK = false;

	if (validation != VALID) {
		var dateMsg = '';
		if (!emptyOK && validation == EMPTY)
			dateMsg = "This field must contain a date.";
		else if (validation == INVALID)
			dateMsg = "This field must contain a valid date."

		if (dateMsg.length != 0) {
			alert(dateMsg);
			dateObj.focus();
		}
	}
}

function JSV_fsEmail(email,additionalExtensions) {
	var	validEmailAddress = VALID;
	var validExtensions = ".com,.gov,.net,.edu,.mil,.org,.cc,.uk";

	if ( JSV_fsEmail.arguments[1] != null) 
		validExtensions = validExtensions + "," + additionalExtensions;

	var extensions = JSV_splitString(validExtensions,",");
		
	if (JSV_isWhitespace(email))
		validEmailAddress = EMPTY;
	else {
		var atSignPosition = email.indexOf("@");

		validEmailAddress =
			( ((atSignPosition > 0) &&
   		       (email.substring(atSignPosition+1, email.length).indexOf(".") != -1) &&
       		   (email.indexOf(" ") == -1) ) ? VALID : INVALID );

		if (validEmailAddress == VALID) {
			var i = 0;
			var extensionLength = extensions.length;
			for (i=0; i<extensionLength; i++) {
				if ( email.substring(email.length-4,email.length) == extensions[i]) break;
			}
			validEmailAddress = ( ( i < extensionLength ) ? VALID : INVALID);
		}
	}
	return validEmailAddress;
}

function JSV_fvEmail(emailObj, emptyOK, additionalExtensions) {
	if (JSV_fvEmail.arguments[1] == null) emptyOK = false;

	var emailStatus = JSV_fsEmail(emailObj.value, additionalExtensions);

	if (emailStatus != VALID) {
		var errorMsg = '';
		if (emailStatus == EMPTY && !emptyOK)
			errorMsg = "This field must contain an e-mail address.";
		else if (emailStatus == INVALID)
			errorMsg = "This field must contain a valid e-mail address.";

		if (errorMsg.length != 0) {
			alert(errorMsg);
			emailObj.focus();
		}
	}
}

function JSV_fvFormatPhone(phoneObj, phoneMask) {
	if ( !JSV_isWhitespace(phoneObj.value) )
		phoneObj.value = JSV_fsFormatPhone(phoneObj.value, phoneMask);
}

function JSV_fsFormatPhone(phoneNumber, phoneMask) {
	var tmpPhoneNumber = phoneNumber;
	if ( !JSV_isWhitespace(phoneNumber) ) {
		phoneMask = ( (JSV_fsFormatPhone.arguments[1] == null) ? "(XXX) XXX-XXXX" : phoneMask.toUpperCase() )
		var phoneDigits = JSV_stripCharacters(phoneNumber,JSV_stripCharacters(phoneNumber,jsvDigits));
		if ( phoneDigits.length == JSV_occurs(phoneMask,'X') ) {
			var i = 0, j = 0;
			tmpPhoneNumber = '';
			for (i=0; i<phoneMask.length; i++) {
				tmpPhoneNumber += 
					( (phoneMask.charAt(i) == 'X') ? phoneDigits.charAt(j++) : phoneMask.charAt(i) );
			}
		}
	}
	return tmpPhoneNumber;
}

function JSV_fsInitialCap() {
	var initCap = '';
	var resetCase = false;
	var properName = false;
	var i = 0, argc = JSV_fsInitialCap.arguments.length;

	// --- Evaluate arguments --------------------------------------------------
	if (argc != 0) {
		for (i=0; i<argc; i++) {
			if ( typeof JSV_fsInitialCap.arguments[i] == "string" ) {
				initCap = JSV_fsInitialCap.arguments[i];
			}
			if ( typeof JSV_fsInitialCap.arguments[i] == "number" ) {
				if (JSV_fsInitialCap.arguments[i] == RESETCASE)
					resetCase = true;
				else if (JSV_fsInitialCap.arguments[i] == PROPERNAMES)
					properName = true;
			}
		}

		if ( !JSV_isWhitespace(initCap) ) {
			if (resetCase) initCap = initCap.toLowerCase();

			if (properName) {
				if (initCap.charAt(1) == "'") {
					// Names such as O'Malley, O'Brian and D'Amato
					initCap = nameCapitalization_(initCap, "'");
				}
				else if (initCap.toLowerCase().substring(0,2) == "mc") {
					// Names that begin with Mc such as McCoy
					initCap = nameCapitalization_(initCap, "mc");
				}
				else {
					initCap = JSV_capitalizeFirstCharacter(initCap);
				}
			}
			else {
				initCap = JSV_capitalizeFirstCharacter(initCap);
			}
		}
	}
	return initCap;
}

/*
	The arguments JSV_fvInitialCap.arguments[1] and 
	JSV_fvInitialCap.arguments[2] are added to the call to JSV_fvInitialCap
	to account for the passing of RESETCASE, PROPERNAMES or both.
	(See the JSV_fsInitialCap function.)
*/ 							
function JSV_fvInitialCap(obj2Capitalize) {
	obj2Capitalize.value = 
		JSV_fsInitialCap(	obj2Capitalize.value, 
							JSV_fvInitialCap.arguments[1], 
							JSV_fvInitialCap.arguments[2]
							);
}

