//**********************************************************************
//
//	The McDuffie Group, Ltd. / Platte River Systems, Inc.
//
//	The portions of the following programs are the proprietary
//	property of The McDuffie Group, Ltd. and Platte River Systems, Inc.
//	All rights are reserved, including the right to reproduce
//	this source, its object, or portions thereof in any form.
//
//	Copyright (c) 2006-2008 by The McDuffie Group, Ltd.
//	Copyright (c) 2006-2008 by Platte River Systems, Inc.
//	Licensed Program Material.  All Rights Reserved.
//
//**********************************************************************

//**********************************************************************
var Id_Formcheck = '$Id: formcheck.js,v 1.4 2008/08/29 18:32:59 jt Exp $';
//**********************************************************************

var reWhitespace = /^\s+$/;
var reLetter = /^[a-zA-Z]$/;
var reAlphabetic = /^[a-zA-Z]+$/;
var reAlphanumeric = /^[a-zA-Z0-9]+$/;
var reDigit = /^\d/;
var reLetterOrDigit = /^([a-zA-Z]|\d)$/;
var reInteger = /^\d+$/;
var reSignedInteger = /^(\+|\-)?\d+$/;
var reFloat = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/;
var reSignedFloat = /^(((\+|\-)?\d+(\.\d*)?)|((\+|\-)?(\d*\.)?\d+))$/;
var reEmail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var whitespace = " \t\n\r";
var phoneNumberDelimiters = "()- ";
var validUSPhoneChars = digits + phoneNumberDelimiters;
var validWorldPhoneChars = digits + phoneNumberDelimiters + "+";
var SSNDelimiters = ".- ";
var validSSNChars = digits + SSNDelimiters;
var digitsInSocialSecurityNumber = 9;
var digitsInUSPhoneNumber = 10;
var ZIPCodeDelimiters = "-";
var ZIPCodeDelimeter = "-"
var validZIPCodeChars = digits + ZIPCodeDelimiters;
var digitsInZIPCode1 = 5;
var digitsInZIPCode2 = 9;
var creditCardDelimiters = ".- ";

var defaultEmptyOK = false;

var daysInMonth = new Array(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;

var theDate = new Date();
var thisMonth = theDate.getMonth();
var thisYear = theDate.getFullYear();

var months = "January,February,March,April,May,June,July,August,September,October,November,December";

var codeDelimiter = ",";

var USStateDefault = "UT";
var USStateCodes = "AL,AK,AS,AZ,AR,CA,CO,CT,DE,DC,FM,FL,GA,GU,HI,ID,IL,IN,IA,KS,KY,LA,ME,MH,MD,MA,MI,MN,MS,MO,MT,NE,NV,NH,NJ,NM,NY,NC,ND,MP,OH,OK,OR,PW,PA,PR,RI,SC,SD,TN,TX,UT,VT,VI,VA,WA,WV,WI,WY,AE,AA,AE,AE,AP";
var USStates = "Alabama,Alaska,American Samoa,Arizona,Arkansas,California,Colorado,Connecticut,Delaware,District Of Columbia,Micronesia,Florida,Georgia,Guam,Hawaii,Idaho,Illinois,Indiana,Iowa,Kansas,Kentucky,Louisiana,Maine,Marshall Islands,Maryland,Massachusetts,Michigan,Minnesota,Mississippi,Missouri,Montana,Nebraska,Nevada,New Hampshire,New Jersey,New Mexico,New York,North Carolina,North Dakota,Mariana Islands,Oiho,Oklahoma,Oregon,Palau,Pennsylvania,Puerto Rico,Rhode Island,South Carolina,South Dakota,Tennessee,Texas,Utah,Vermont,Virgin Islands,Virginia,Washington,West Virginia,Wisconsin,Wyoming,Armed Forces Africa,Armed Forces Americas,Armed Forces Canada,Armed Forces Europe,Armed Forces Middle East,Armed Forces Pacific";

var defaultPrefix = " ";
var prefixes = " ,Mr,Mrs,Ms,Miss";

var defaultSuffix = " ";
var suffixes = " ,Jr,Sr";

var iErrorCount = 0;
var aError;
aError = new Array();

var eFirstName = "Please enter a first name.";
var eLastName = "Please enter a last name.";
var eAddress = "Please enter an address.";
var eCity = "Please enter a city.";
var eZip = "Please enter a valid zip code.";
var ePhone = "Please enter a valid phone number.";
var eEMail = "Please enter a valid email address.";
var eSSN = "Please enter a valid Social Security Number.";
var eBirthday = "Please enter a valid birth date.";
var eCCNumber = "Please enter a valid credit card number.";
var eState = "Please enter a valid state code.";
var eIntPhone = "Please enter a valid phone number.";

function isEmpty(s) {
	return ((s == null) || (s.length == 0));
}

function isWhitespace(s) {
	return (isEmpty(s) || reWhitespace.test(s));
}

function stripCharsInRE(s, bag) {
	return s.replace(bag, "");
}

function stripCharsInBag(s, bag) {
	var i;
	var returnString = "";

	for (i = 0; i < s.length; i++) {
		var c = s.charAt(i);
		if (bag.indexOf(c) == -1) returnString += c;
	}

	return returnString;
}

function stripCharsNotInBag(s, bag) {
	var i;
	var returnString = "";

	for (i = 0; i < s.length; i++) {
		var c = s.charAt(i);
		if (bag.indexOf(c) != -1) returnString += c;
	}

	return returnString;
}

function stripWhitespace(s) {
    return stripCharsInBag (s, whitespace);
}

function stripInitialWhitespace(s) {
	var i = 0;

	while ((i < s.length) && indexOf(s.charAt(i), whitespace))
		i++;
    
	return s.substring (i, s.length);
}

function isLetter(c) {
	return reLetter.test(c);
}

function isDigit(c) {
	return reDigit.test(c);
}

function isLetterOrDigit(c) {
	return reLetterOrDigit.test(c);
}

function isInteger(s) {
	var i;

	if (isEmpty(s))
		if (isInteger.arguments.length == 1) return defaultEmptyOK;
		else return (isInteger.arguments[1] == true);

	return reInteger.test(s);
}

function isSignedInteger(s) {
	if (isEmpty(s))
		if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
		else return (isSignedInteger.arguments[1] == true);

	else {
		return reSignedInteger.test(s);
	}
}

function isPositiveInteger(s) {
	var secondArg = defaultEmptyOK;

	if (isPositiveInteger.arguments.length > 1)
		secondArg = isPositiveInteger.arguments[1];

	return (isSignedInteger(s, secondArg)
		&& ( (isEmpty(s) && secondArg)  || (parseInt (s) > 0) ) );
}

function isNonnegativeInteger(s) {
	var secondArg = defaultEmptyOK;

	if (isNonnegativeInteger.arguments.length > 1)
		secondArg = isNonnegativeInteger.arguments[1];

	return (isSignedInteger(s, secondArg)
		&& ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
}

function isNegativeInteger(s) {
	var secondArg = defaultEmptyOK;

	if (isNegativeInteger.arguments.length > 1)
		secondArg = isNegativeInteger.arguments[1];

	return (isSignedInteger(s, secondArg)
		&& ( (isEmpty(s) && secondArg)  || (parseInt (s) < 0) ) );
}

function isNonpositiveInteger(s) {
	var secondArg = defaultEmptyOK;

	if (isNonpositiveInteger.arguments.length > 1)
		secondArg = isNonpositiveInteger.arguments[1];

	return (isSignedInteger(s, secondArg)
		&& ( (isEmpty(s) && secondArg)  || (parseInt (s) <= 0) ) );
}

function isFloat(s) {
	if (isEmpty(s)) 
		if (isFloat.arguments.length == 1) return defaultEmptyOK;
		else return (isFloat.arguments[1] == true);

	return reFloat.test(s)
}

function isSignedFloat(s) {
	if (isEmpty(s)) 
		if (isSignedFloat.arguments.length == 1) return defaultEmptyOK;
		else return (isSignedFloat.arguments[1] == true);
	else {
		return reSignedFloat.test(s)
	}
}

function isAlphabetic(s) {
	var i;

	if (isEmpty(s))
		if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
		else return (isAlphabetic.arguments[1] == true);
	else {
		return reAlphabetic.test(s);
	}
}

function isAlphanumeric(s) {
	var i;

	if (isEmpty(s))
		if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
		else return (isAlphanumeric.arguments[1] == true);
	else {
		return reAlphanumeric.test(s)
	}
}

function reformat(s) {
	var arg;
	var sPos = 0;
	var resultString = "";

	for (var i = 1; i < reformat.arguments.length; i++) {
		arg = reformat.arguments[i];
		if (i % 2 == 1) resultString += arg;
		else {
			resultString += s.substring(sPos, sPos + arg);
			sPos += arg;
		}
	}
	return resultString;
}

function isSSN(s) {
	if (isEmpty(s)) 
		if (isSSN.arguments.length == 1) return defaultEmptyOK;
		else return (isSSN.arguments[1] == true);
	return (isInteger(s) && s.length == digitsInSocialSecurityNumber)
}

function isUSPhoneNumber(s) {
	if (isEmpty(s)) 
		if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
		else return (isUSPhoneNumber.arguments[1] == true);
	return (isInteger(s) && s.length == digitsInUSPhoneNumber)
}

function isInternationalPhoneNumber(s) {
	if (isEmpty(s)) 
		if (isInternationalPhoneNumber.arguments.length == 1) return defaultEmptyOK;
		else return (isInternationalPhoneNumber.arguments[1] == true);
	return (isPositiveInteger(s))
}

function isZIPCode(s) {
	if (isEmpty(s)) 
		if (isZIPCode.arguments.length == 1) return defaultEmptyOK;
		else return (isZIPCode.arguments[1] == true);
	return (isInteger(s) && 
			((s.length == digitsInZIPCode1) ||
			(s.length == digitsInZIPCode2)))
}

function isStateCode(s) {
		if (isEmpty(s)) 
		if (isStateCode.arguments.length == 1) return defaultEmptyOK;
		else return (isStateCode.arguments[1] == true);
	return ( (USStateCodes.indexOf(s) != -1) &&
			(s.indexOf(codeDelimiter) == -1) )
}

function isEmail(s) {
	if (isEmpty(s)) 
	if (isEmail.arguments.length == 1) return defaultEmptyOK;
	else return (isEmail.arguments[1] == true);

	else {
		return reEmail.test(s)
	}
}

function isYear(s) {
	if (isEmpty(s)) 
	if (isYear.arguments.length == 1) return defaultEmptyOK;
	else return (isYear.arguments[1] == true);
	if (!isNonnegativeInteger(s)) return false;
	return ((s.length == 2) || (s.length == 4));
}

function isIntegerInRange(s, a, b) {
	if (isEmpty(s)) 
	if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
	else return (isIntegerInRange.arguments[1] == true);

	if (!isInteger(s, false)) return false;

	var num = parseInt (s);
	return ((num >= a) && (num <= b));
}

function isMonth(s) {
	if (isEmpty(s)) 
	if (isMonth.arguments.length == 1) return defaultEmptyOK;
	else return (isMonth.arguments[1] == true);
	return isIntegerInRange (s, 1, 12);
}

function isDay(s) {
	if (isEmpty(s)) 
	if (isDay.arguments.length == 1) return defaultEmptyOK;
	else return (isDay.arguments[1] == true);   
	return isIntegerInRange (s, 1, 31);
}

function daysInFebruary(year) {
	return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function isDate(year, month, day) {
	if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;

	var intYear = parseInt(year);
	var intMonth = parseInt(month);
	var intDay = parseInt(day);

	if (intDay > daysInMonth[intMonth]) return false; 

	if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;

	return true;
}

function checkString(theField, error, emptyOK) {
	if (! emptyOK) emptyOK = defaultEmptyOK;
	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
	if (isWhitespace(theField.value)) {
		addError(error);
		return false;
	} else {
		return true;
	}
}

function checkStateCode(theField, error, emptyOK) {
	if (! error) error = eState;
	if (! emptyOK) emptyOK = defaultEmptyOK;
	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
	else
	{  theField.value = theField.value.toUpperCase();
		if (!isStateCode(theField.value, false)) {
			addError(error);
			return false;
		} else {
			return true;
		}
	}
}

function reformatZIPCode(ZIPString) {
	if (ZIPString.length == 5) return ZIPString;
	else return (reformat (ZIPString, "", 5, "-", 4));
}

function checkZIPCode(theField, error, emptyOK) {
	if (! error) error = eZip;
	if (! emptyOK) emptyOK = defaultEmptyOK;
	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
	else
	{ var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters)
		if (!isZIPCode(normalizedZIP, false))  {
			addError(error);
			return false;
		} else {
			theField.value = reformatZIPCode(normalizedZIP);
			return true;
		}
	}
}

function reformatUSPhone(USPhone, theField) {
	return (reformat (USPhone, "(", 3, ") ", 3, "-", 4))
}

function checkUSPhone(theField, error, emptyOK) {
	if (! error) error = ePhone;
	if (! emptyOK) emptyOK = defaultEmptyOK;
	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
	else
	{  var normalizedPhone = stripCharsInBag(theField.value, phoneNumberDelimiters)
		if (!isUSPhoneNumber(normalizedPhone, false)) {
			addError(error);
			return false;
		} else {
			theField.value = reformatUSPhone(normalizedPhone)
			return true;
		}
	}
}

function checkInternationalPhone(theField, error, emptyOK) {
	if (! error) error = eIntPhone;
	if (! emptyOK) emptyOK = defaultEmptyOK;
	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
	else
	{  if (!isInternationalPhoneNumber(theField.value, false)) {
			addError(error);
			return false;
		} else {
			return true;
		}
	}
}

function checkEmail(theField, error, emptyOK) {
	if (! error) error = eEMail;
	if (! emptyOK) emptyOK = defaultEmptyOK;
	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
	else if (!isEmail(theField.value, false)) {
		addError(error);
		return false;
	} else {
		return true;
	}
}

function reformatSSN(SSN) {
	return (reformat (SSN, "", 3, "-", 2, "-", 4))
}

function checkSSN(theField, error, emptyOK) {
	if (! error) error = eSSN;
	if (! emptyOK) emptyOK = defaultEmptyOK;
	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
	else
	{  var normalizedSSN = stripCharsInBag(theField.value, SSNDelimiters)
		if (!isSSN(normalizedSSN, false))  {
			addError(error);
			return false;
		} else {
			theField.value = reformatSSN(normalizedSSN)
			return true;
		}
	}
}

function checkYear(theField, emptyOK) {
	if (checkYear.arguments.length == 1) emptyOK = defaultEmptyOK;
	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
	if (!isYear(theField.value, false)) 
		return false;
	else return true;
}

function checkMonth(theField, emptyOK) {
	if (checkMonth.arguments.length == 1) emptyOK = defaultEmptyOK;
	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
	if (!isMonth(theField.value, false)) 
		return false;
	else return true;
}

function checkDay(theField, emptyOK) {
	if (checkDay.arguments.length == 1) emptyOK = defaultEmptyOK;
	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
	if (!isDay(theField.value, false)) 
		return false;
	else return true;
}

function checkDate(yearField, monthField, dayField, error, OKtoOmitDay) { 
	if (checkDate.arguments.length == 4) OKtoOmitDay = false;
	if (!isYear(yearField.value)) addError(error); return false;
	if (!isMonth(monthField.value)) addError(error); return false;
	if ( (OKtoOmitDay == true) && isEmpty(dayField.value) ) return true;
	else if (!isDay(dayField.value)) {
		addError(error);
		return false;
	}
	if (isDate (yearField.value, monthField.value, dayField.value))
		return true;

	addError(error);
	return false
}

function checkCreditCard(typeField, theField, error) {
	if (! error) error = eCCNumber;
	var cardType = typeField.options[typeField.selectedIndex].text;
	var normalizedCCN = stripCharsInBag(theField.value, creditCardDelimiters)
	if (!isCardMatch(cardType, normalizedCCN)) {
		addError(error);
		return false;
	} else {
		theField.value = normalizedCCN
		return true
	}
}

function isCreditCard(st) {
	if (st.length > 19)
		return (false);

	sum = 0; mul = 1; l = st.length;
	for (i = 0; i < l; i++) {
		digit = st.substring(l-i-1,l-i);
		tproduct = parseInt(digit ,10)*mul;
		if (tproduct >= 10)
			sum += (tproduct % 10) + 1;
		else
			sum += tproduct;
		if (mul == 1)
			mul++;
		else
			mul--;
	}

	if ((sum % 10) == 0)
		return (true);
	else
		return (false);
}

function isVisa(cc) {
	if (((cc.length == 16) || (cc.length == 13)) &&
		(cc.substring(0,1) == 4))
		return isCreditCard(cc);
	return false;
}

function isMasterCard(cc) {
	firstdig = cc.substring(0,1);
	seconddig = cc.substring(1,2);
	if ((cc.length == 16) && (firstdig == 5) &&
		((seconddig >= 1) && (seconddig <= 5)))
		return isCreditCard(cc);
	return false;
}

function isAmericanExpress(cc) {
	firstdig = cc.substring(0,1);
	seconddig = cc.substring(1,2);
	if ((cc.length == 15) && (firstdig == 3) &&
		((seconddig == 4) || (seconddig == 7)))
		return isCreditCard(cc);
	return false;
}

function isDinersClub(cc) {
	firstdig = cc.substring(0,1);
	seconddig = cc.substring(1,2);
	if ((cc.length == 14) && (firstdig == 3) &&
		((seconddig == 0) || (seconddig == 6) || (seconddig == 8)))
		return isCreditCard(cc);
	return false;
}

function isCarteBlanche(cc) {
	return isDinersClub(cc);
}

function isDiscover(cc) {
	first4digs = cc.substring(0,4);
	if ((cc.length == 16) && (first4digs == "6011"))
		return isCreditCard(cc);
	return false;
}

function isEnRoute(cc) {
	first4digs = cc.substring(0,4);
	if ((cc.length == 15) &&
		((first4digs == "2014") ||
		(first4digs == "2149")))
		return isCreditCard(cc);
	return false;
}

function isJCB(cc) {
	first4digs = cc.substring(0,4);
	if ((cc.length == 16) &&
		((first4digs == "3088") ||
		(first4digs == "3096") ||
		(first4digs == "3112") ||
		(first4digs == "3158") ||
		(first4digs == "3337") ||
		(first4digs == "3528")))
		return isCreditCard(cc);
	return false;
}

function isAnyCard(cc) {
	if (!isCreditCard(cc))
		return false;
	if (!isMasterCard(cc) && !isVisa(cc) && !isAmericanExpress(cc) && !isDinersClub(cc) &&
		!isDiscover(cc) && !isEnRoute(cc) && !isJCB(cc)) {
		return false;
	}
	return true;
}

function isCardMatch(cardType, cardNumber) {
	cardType = cardType.toUpperCase();
	var doesMatch = true;

	if ((cardType == "VISA") && (!isVisa(cardNumber)))
		doesMatch = false;
	if ((cardType == "MASTERCARD") && (!isMasterCard(cardNumber)))
		doesMatch = false;
	if ( ( (cardType == "AMERICANEXPRESS") || (cardType == "AMEX") )
		&& (!isAmericanExpress(cardNumber))) doesMatch = false;
	if ((cardType == "DISCOVER") && (!isDiscover(cardNumber)))
		doesMatch = false;
	if ((cardType == "JCB") && (!isJCB(cardNumber)))
		doesMatch = false;
	if ((cardType == "DINERS") && (!isDinersClub(cardNumber)))
		doesMatch = false;
	if ((cardType == "CARTEBLANCHE") && (!isCarteBlanche(cardNumber)))
		doesMatch = false;
	if ((cardType == "ENROUTE") && (!isEnRoute(cardNumber)))
		doesMatch = false;
	return doesMatch;
}

function writeStates() {
	var selected = (writeStates.arguments.length == 1) ? writeStates.arguments[0] : USStateDefault;

	document.write('<select name=state>');
	
	aStateCodes = USStateCodes.split(codeDelimiter);
	aStates = USStates.split(codeDelimiter);
	for ( var x = 0; x < aStateCodes.length; x++ ) {
		if (aStateCodes[x] == selected) {
			document.write('<option value=\"'+ aStateCodes[x] + '\" selected>'+ aStates[x]);
		} else {
			document.write('<option value=\"'+ aStateCodes[x] + '\">'+ aStates[x]);
		}
	}
	
	document.write('</select>');
}

function writeMonths(group) {
	var selected = (writeMonths.arguments.length == 2) ? writeMonths.arguments[1] : thisMonth;
	
	document.write('<select name=months_'+ group +' onChange=\"updateDays(\''+ group +'\', this.form)\">');
	
	aMonths = months.split(codeDelimiter);
	for ( var x = 0; x < aMonths.length; x++ ) {
		if (x == selected) {
			document.write('<option value=\"'+ x + '\" selected>'+ aMonths[x]);
		} else {
			document.write('<option value=\"'+ x + '\">'+ aMonths[x]);
		}
	}
	
	document.write('</select>');
}

function writeDays(group) {
	var OKtoOmitDay = (writeDays.arguments.length == 2) ? true : false;
	var selected = (writeDays.arguments.length == 3) ? writeDays.arguments[2] : theDate.getDate();

	document.write('<select name=\"days_'+ group +'\">');
	if (OKtoOmitDay) {
		document.write('<option value=\"\">none');
	}

	for ( var x = 1; x < (daysInMonth[thisMonth] + 1); x++ ) {
		if (x == selected) {
			document.write('<option value=\"'+ x + '\" selected>'+ x);
		} else {
			document.write('<option value=\"'+ x + '\">'+ x);
		}
	}
	
	document.write('</select>');
}

function writeYears(group, start, end) {
	var selected = (writeYears.arguments.length == 4) ? writeYears.arguments[3] : theDate.getFullYear();

	document.write('<select name=\"years_'+ group +'\" onChange=\"updateDays(\''+ group +'\', this.form)\">');
	
	for (x = start; x <= end; x++) {
		if (x == selected) {
			document.write('<option value=\"'+ x + '\" selected>'+ x);
		} else {
			document.write('<option value=\"'+ x + '\">'+ x);
		}
	}
	
	document.write('</select>');
}

function updateDays(group, form) {
	var curYearField = eval(form.elements['years_' + group]);
	var curYear = curYearField.options[curYearField.selectedIndex].value;

	var curField = eval(form.elements['months_' + group]);
	var curMonth = (parseInt(curField.options[curField.selectedIndex].value) + 1);
	var totDays = (curMonth == 2) ? daysInFebruary(curYear): daysInMonth[curMonth];
	
	var curDayField = eval(form.elements['days_' + group]);
	var curSelectedDay = curDayField.options[curDayField.selectedIndex].value;
	
	var days = new Array();
	
	for (x = 0; x < (totDays + 1); x++) {
		days[x] = x;
	}
	
	curDayField.length = 0;
	for (x = 1; x < days.length; x++) {
		curDayField.options[x - 1] = new Option(days[x], days[x]);
	}
	
	var selected = (curSelectedDay <= days.length) ? (curSelectedDay - 1) : (days.length - 2);
	selected = (selected > 0 ) ? selected : 0;
	curDayField.selectedIndex = selected;
}

function writeSalutations() {
	var selected = (writeSalutations.arguments.length == 1) ? writeSalutations.arguments[0] : defaultPrefix;
	var aPrefixes = prefixes.split(codeDelimiter);
	
	document.write('<select name=\"salutation\">');
	
	for (x = 0; x <= aPrefixes.length - 1; x++) {
		if (x == selected) {
			document.write('<option value=\"'+ aPrefixes[x] + '\" selected>'+ aPrefixes[x]);
		} else {
			document.write('<option value=\"'+ aPrefixes[x] + '\">'+ aPrefixes[x]);
		}
	}
	
	document.write('</select>');
}

function writeSuffixes() {
	var selected = (writeSuffixes.arguments.length == 1) ? writeSuffixes.arguments[0] : defaultSuffix;
	var aSuffixes = suffixes.split(codeDelimiter);
	
	document.write('<select name=\"suffix\">');
	
	for (x = 0; x <= aSuffixes.length - 1; x++) {
		if (x == selected) {
			document.write('<option value=\"'+ aSuffixes[x] + '\" selected>'+ aSuffixes[x]);
		} else {
			document.write('<option value=\"'+ aSuffixes[x] + '\">'+ aSuffixes[x]);
		}
	}
	
	document.write('</select>');
}

function addError(s) {
	aError[iErrorCount] = s;
	iErrorCount++;
}

function returnError(newLine) {
	if (! newLine)
		newLine = '<br>'; //can also be '\n' or anything else you might need
	
	var sError = '';
	for (x=0; x < aError.length; x++) {
		sError += aError[x] + newLine;
	}
	
	aError = null;
	aError = new Array;
	iErrorCount = 0;
	
	return sError;
}

function hasErrors() {
	return (aError.length == 0) ? false : true;
}

function errorWindow(error, width, height, xstartHTML, xendHTML) {
	if (! error) error = returnError();
	if (! width) width = 300;
	if (! height) height = 300;
	if (! xstartHTML) xstartHTML = '<html><head><title>Error Report</title></head><body>';
	if (! xendHTML) xendHTML = '</body></html>';
	
	var posY = ( screen.availHeight - height ) / 2;
	var posX = ( screen.availWidth - width ) / 2;
	var features = 'alwaysRaised=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width='+ width +',height='+ height + ',top=' + posY + ',left=' + posX;
	
	var content = xstartHTML + error + xendHTML;

	var newWindow = window.open ("", "", features);
	
	newWindow.document.write(content);
	newWindow.document.close();
}
