var debug = false;
var contactCustomerService = 'MGIC Customer Service at 1-800-424-6442';

// Premium Type drop-down options
var arrPremiumTypeOptions_Undefined = new Array();
arrPremiumTypeOptions_Undefined = [
	{ code: '', desc: 'Insufficient Loan Characteristics'}
];

var premiumTypeOptions_1 = new Array();
premiumTypeOptions_1 = [
	{code:'BPMI MZ-NR', desc:'BPMI - Monthly/ZOMP! Non-Refundable'},
	{code:'BPMI S-R',   desc:'BPMI - Single Refundable'},
	{code:'BPMI LA-R',  desc:'BPMI - Level Annual Refundable'},
	{code:'BPMI SP-NR', desc:'BPMI - Split Premium Non-Refundable'},
	{code:'LPMI S-NR',  desc:'LPMI - Single Non-Refundable'},
	{code:'LPMI MZ-NR', desc:'LPMI - Monthly/ZOMP! Non-Refundable'},
	{code:'BPMI MZ-R',  desc:'BPMI - Monthly/ZOMP! Refundable'}
];

premiumTypeOptionsCU_1 = [
	{code:'BPMI MZ-NR', desc:'BPMI - Monthly/ZOMP! Non-Refundable'},
	{code:'BPMI S-NR',  desc:'BPMI - Single Non-Refundable'},
	{code:'BPMI S-R',   desc:'BPMI - Single Refundable'},
	{code:'BPMI LA-R',  desc:'BPMI - Level Annual Refundable'},
	{code:'BPMI SP-NR', desc:'BPMI - Split Premium Non-Refundable'},
	{code:'LPMI S-NR',  desc:'LPMI - Single Non-Refundable'},
	{code:'LPMI MZ-NR', desc:'LPMI - Monthly/ZOMP! Non-Refundable'},
	{code:'BPMI MZ-R',  desc:'BPMI - Monthly/ZOMP! Refundable'}
];

var premiumTypeOptions_2 = new Array();
premiumTypeOptions_2 = [
	{code:'BPMI MZ-R',  desc:'BPMI - Monthly/ZOMP! Refundable'},
	{code:'BPMI LA-R',  desc:'BPMI - Level Annual Refundable'}
];

var codes = {
	'appraisal_made': [
		{code:'1', desc:'As Is'},
		{code:'2', desc:'Subject to Completion'},
		{code:'3', desc:'Subject to Inspection'},
		{code:'4', desc:'Subject to Repairs'}
	],
	'arm_index': [
		{code: '1', desc:'T-Bill'},
		{code: '2', desc:'LIBOR'},
		{code: '3', desc:'COFI (11 Dist)'},
		{code: '4', desc:'COFI (7 Dist)'},
		{code: '5', desc:'COFI (4 Dist)'},
		{code: '6', desc:'CD'},
		{code: '7', desc:'Natl Avg Contract Rate'},
		{code: '8', desc:'MTA'},
		{code: '9', desc:'CMT'},
		{code:'10', desc:'OTHER'}
	],
	'arm_program': [
		{code: '1', desc:'1 Year ARM'},
		{code: '2', desc:'3 Year ARM'},
		{code: '3', desc:'5 Year ARM'},
		{code: '4', desc:'3/1 ARM'},
		{code: '5', desc:'5/1 ARM'},
		{code: '6', desc:'7/1 ARM'},
		{code: '7', desc:'10/1 ARM'},
		{code: '8', desc:'1yr/6mo ARM'},
		{code: '9', desc:'2yr/6mo ARM'},
		{code:'10', desc:'3yr/6mo ARM'},
		{code:'11', desc:'1yr/3mo ARM'},
		{code:'12', desc:'2yr/3mo ARM'},
		{code:'13', desc:'3yr/3mo ARM'},
		{code:'14', desc:'1yr/1mo ARM'},
		{code:'15', desc:'2yr/1mo ARM'},
		{code:'16', desc:'3yr/1mo ARM'},
		{code:'17', desc:'6mo/6mo ARM'},
		{code:'18', desc:'6mo/1mo ARM'},
		{code:'19', desc:'1mo/1mo ARM'},
		{code:'20', desc:'3mo/1mo ARM'},
		{code:'21', desc:'OTHER'}
	],
	'borrower_owned_last_3yrs': [
		{code:  '1', desc:'No'},
		{code:  '2', desc:'Yes'},
		{code:'994', desc:'Unknown'}
	],
	'buydown_type': [
		{code:'1', desc:'1-0'},
		{code:'2', desc:'2-1-0'},
		{code:'3', desc:'3-2-1-0'},
		{code:'4', desc:'Permanent'},
		{code:'5', desc:'No Buydown'}
	],
	'coborrower1_owned_last_3yrs': [
		{code:  '1', desc:'No'},
		{code:  '2', desc:'Yes'},
		{code:'994', desc:'Unknown'}
	],
	'coborrower2_owned_last_3yrs': [
		{code:  '1', desc:'No'},
		{code:  '2', desc:'Yes'},
		{code:'994', desc:'Unknown'}
	],
	'coborrower3_owned_last_3yrs': [
		{code:  '1', desc:'No'},
		{code:  '2', desc:'Yes'},
		{code:'994', desc:'Unknown'}
	],
	'coborrower4_owned_last_3yrs': [
		{code:  '1', desc:'No'},
		{code:  '2', desc:'Yes'},
		{code:'994', desc:'Unknown'}
	],
	'coborrower5_owned_last_3yrs': [
		{code:  '1', desc:'No'},
		{code:  '2', desc:'Yes'},
		{code:'994', desc:'Unknown'}
	],
	'du_recommendation': [
		{code: '3', desc:'Approve / Eligible'},
		{code: '6', desc:'Approve / Ineligible'},
		{code: '1', desc:'Refer / Eligible'},
		{code: '4', desc:'Refer / Ineligibl'},
		{code: '7', desc:'Refer with Caution'},
		{code:'24', desc:'EA-1 Eligible'},
		{code:'25', desc:'EA-1 Ineligible'},
		{code:'26', desc:'EA-2 Eligible'},
		{code:'27', desc:'EA-2 Ineligible'},
		{code:'28', desc:'EA-3 Eligible'},
		{code:'29', desc:'EA-3 Ineligible'},
		{code: '2', desc:'Out of Scope'}
	],
	'loan_instrument': [
		{code:'1', desc:'Fixed Rate'},
		{code:'4', desc:'ARMs 5 Years or Greater'},
		{code:'2', desc:'Temp Buydown or ARM - Annual Caps <= 1%'},
		{code:'3', desc:'All Other ARMs / Non-Fixed'}
	],
	'loan_purpose': [
		{code:'16', desc:'Purchase'},
		{code: '5', desc:'Refinance'},
		{code:'13', desc:'Construction-Permanent'},
		{code:'15', desc:'Other'}
	],
	'loan_type': [
		{code:'1', desc:'Fixed'},
		{code:'2', desc:'ARM'}
	],
	'lp_purchase_eligible': [
		{code:'2', desc:'Eligible'},
		{code:'3', desc:'Eligible A- Offering'},
		{code:'4', desc:'Ineligible'}
	],
	'lp_risk_decision': [
		{code:'2', desc:'Accept'},
		{code:'3', desc:'Caution'},
		{code:'4', desc:'Refer'},
		{code:'5', desc:'Incomplete'}
	],
	'market_values': [
		{code:'994', desc:'Not Available'},
		{code:  '1', desc:'Increasing'},
		{code:  '2', desc:'Stable'},
		{code:  '3', desc:'Decreasing'}
	],
	'occupancy_type': [
		{code:'1', desc:'Primary Residence'},
		{code:'2', desc:'Secondary Residence'}
	],
	'occupancy_type_primary': [
		{code:'1', desc:'Primary Residence'}
	],
	'premium_type': [
		{code:'BPMI MZ-R',  desc:'BPMI - Monthly/ZOMP! Refundable'},
		{code:'BPMI MZ-NR', desc:'BPMI - Monthly/ZOMP! Non-Refundable'},
		{code:'BPMI S-R',   desc:'BPMI - Single Refundable'},
		{code:'BPMI LA-R',  desc:'BPMI - Level Annual Refundable'},
		{code:'BPMI SP-NR', desc:'BPMI - Split Premium Non-Refundable'},
		{code:'BPMI S-NR',  desc:'BPMI - Single Non-Refundable'},
		{code:'LPMI S-NR',  desc:'LPMI - Single Non-Refundable'},
		{code:'LPMI MZ-NR', desc:'LPMI - Monthly/ZOMP! Non-Refundable'},
		{code:'LPMI S-NR',  desc:'LPMI - Single Non-Refundable'}
	],
	'property_type': [
		{code:'1', desc:'Detached'},
		{code:'2', desc:'Attached'},
		{code:'3', desc:'Condo'},
		{code:'4', desc:'PUD'},
		{code:'5', desc:'Co-op'}
//		{code:'8', desc:'MH - Double Wide or Greater'},
//		{code:'9', desc:'MH - Single Wide'}
	],
	'refinance_purpose': [
		{code:'F1', desc:'Rate/Term Refinance'},
		{code: '1', desc:'Cash Out Refinance'},
		{code: '4', desc:'Home Improvement'},
		{code: '5', desc:'Fannie Mae Streamline Rate/Term Refinance'},
		{code: '6', desc:'Freddie Mac Streamline Rate/Term Refinance'}
	],
	'renewals': [
		{code:'1', desc:'Constant'},
		{code:'2', desc:'Declining'}
	],
	'repayment_type': [
		{code: 'N', desc:'Fully Amortizing'},
		{code:'F2', desc:'Interest Only'},
		{code: '2', desc:'Bi-Weekly'}
	],
	/*
	'restricted_market': [
		{code: '01', desc:'Not Restricted'},
		{code: '03', desc:'Restricted Tier 1'},
		{code: '04', desc:'Restricted Tier 2'}
	],
	*/
	'upfront_premium': [
		{code:'01', desc:'0.75'},
		{code:'02', desc:'1.00'},
		{code:'03', desc:'1.25'},
		{code:'04', desc:'1.50'},
		{code:'05', desc:'1.75'},
		{code:'06', desc:'2.00'}
	]
}; // codes

var prevValues = {
	'loan_amount':                { 'value':0 },
	'interest_rate':              { 'value':0 },
	'amortization_term':          { 'value':0 },
	'balloon_term':               { 'value':0 },
	'interest_only_term':         { 'value':0 },
	'arm_index_rate':             { 'value':0 },
	'arm_margin':                 { 'value':0 },
	'arm_initial_adj_period':     { 'value':0 },
	'arm_periodic_adj_period':    { 'value':0 },
	'arm_initial_adj_cap':        { 'value':0 },
	'arm_periodic_adj_cap':       { 'value':0 },
	'arm_lifetime_adj_cap':       { 'value':0 },
	'prepaid_costs':              { 'value':0 },
	'piti':                       { 'value':0 },
	'secondary_financing_amount': { 'value':0 },
	'seller_paid_costs':          { 'value':0 },
	'debts':                      { 'value':0 },
	'liens':                      { 'value':0 },
	'liquid_assets':              { 'value':0 },
	'other_monthly_payments':     { 'value':0 },
	'sales_price':                { 'value':0 },
	'appraised_value':            { 'value':0 },
	'borrower_monthly_income':    { 'value':0 },
	'borrower_fico_score':        { 'value':0 },
	'coborrower1_monthly_income': { 'value':0 },
	'coborrower2_monthly_income': { 'value':0 },
	'coborrower3_monthly_income': { 'value':0 },
	'coborrower4_monthly_income': { 'value':0 },
	'coborrower5_monthly_income': { 'value':0 },
	'coborrower1_fico_score':     { 'value':0 },
	'coborrower2_fico_score':     { 'value':0 },
	'coborrower3_fico_score':     { 'value':0 },
	'coborrower4_fico_score':     { 'value':0 },
	'coborrower5_fico_score':     { 'value':0 },
	'mgic_program':               { 'value':''},
	'coverage':                   { 'value':0 },
	'property_zip':               { 'value':''}
}; // prevValues

var coborrowers = new Array();
var geoSearchResults = null;
var popupWin = null;
var maxCoborrowers = 5;

function addToFavorites() {
	var title = "MGIC Rate Finder - Plus" + (isCreditUnionURL() ? " for Credit Unions" : "");
	var url = document.location.href;
	var i = url.indexOf('.html');
	if (i != -1) {
		url = url.slice(0, i+5);
	}

	if (window.sidebar) { // Firefox Bookmarks
		window.sidebar.addPanel(title, url, "");
	}
	else if (window.external) { // IE Favorites
		window.external.AddFavorite(url, title);
	}
	else {
		return true;
	}
} // addToFavorites()

function getRandomString() {
	var d = new Date();
	var ts = '' + d.getDate() + d.getHours() + d.getMinutes() + d.getMilliseconds();
	return ts;
} // getRandomString()

function isDefined(object) {
	return (typeof(object) == 'undefined') || (object == null) ? false : true;
} // isDefined()

function hasValue(elem) {
	if (elem.value == null || elem.value == '') {
		return false;
	}
	else {
		var c;
		for (var i = 0; i < elem.value.length; i++) {
			c = elem.value.charAt(i);
			if ((c != ' ') && (c != '\n') && (c != '\t')) {
				return true;
			}
		}
		return false;
	}
} // hasValue()

/*
function isNumeric(val) {
	if (val.length == 0) {
		return false;
	}
	else {
		var valid = '0123456789';
		var ch;

		for (var i=0; i < val.length; i++) {
			ch = val.substring(i, i+1);
			if (valid.indexOf(ch) < 0) {
				return false;
			}
		}
	}
	return true;
} // isNumeric()
*/

String.prototype.stripSpaces = function( ){ return this.replace( /\s/g, '' ); };

function isNumeric(val) {
	var regExp = /^[0-9]+$/;
	return regExp.test(val);
} // isNumeric()

function isAlpha(val) {
	var regExp = /^[a-zA-Z]+$/;
	return regExp.test(val);
} // isAlpha()

function isAlphaNumeric(val) {
	var regExp = /^[0-9a-zA-Z]+$/;
	return regExp.test(val);
} // isAlphaNumeric()

function removeNonNumeric(val) {
	var str = (isDefined(val) ? val.replace(/[^\d]/g, '') : null);
	return str;
} // removeNonNumeric()

function unformatNumber(val) {
	var i = val.indexOf('.');
	if (i == -1) {
		return removeNonNumeric(val);
	}
	else {
		left = val.slice(0, i);
		right = val.slice(i+1, val.length);
		return removeNonNumeric(left) + '.' + removeNonNumeric(right);
	}
} // unformatNumber()

function trimLeadingZeros(str) {
	var result = str;
	while (result.charAt(0) == '0') {
		result = result.substring(1, result.length);
	}
	return result;
} // trimLeadingZeros()

function replace(strBuf, strFind, strReplaceWith, posStart) {
	var posFound = 0;

	if (!posStart) posStart = 0;

	while (posFound != -1) {
		posFound = strBuf.indexOf(strFind, posStart);

		if (posFound != -1) {
			strBuf = szBuf.substring(0, posFound) + strReplaceWith + strBuf.substring(posFound + strFind.length);
			posStart = posFound + strReplaceWith.length;
		}
	}
	return strBuf;
} // replace()

function parse(elemValue) {
	var whole = elemValue;
	var decimals = '';
	var left = '';
	var right = '';
	var str = '';
	var ch;

	var validNum = '0123456789';

	// look for a decimal and remove everything to the right
	var i = elemValue.indexOf('.');
	if (i != -1) {
		whole = elemValue.slice(0, i);
		decimals = elemValue.slice(i+1);
	}

	// remove all non-numeric characters
	for (i = 0; i < whole.length; i++) {
//		if (validNum.indexOf(elemValue.substring(i, i+1)) != -1) {
		ch = whole.charAt(i);
		if (validNum.indexOf(ch) != -1) {
			left += ch;
		}
	}
	if (decimals.length > 0) {
		for (i = 0; i < decimals.length; i++) {
			ch = decimals.charAt(i);
			if (validNum.indexOf(ch) != -1) {
				right += ch;
			}
		}
	}

	if (left != '0') {
		left = trimLeadingZeros(left);
	}

	if (right == '') {
		return left;
	}
	else {
		return left + '.' + right;
	}
} // parse()

function validateNumber(elem, updateElem) {
	var str = parse(elem.value);
	if (updateElem) {
		elem.value = str;
	}
	return (str.empty() ? false : true);
} // validateNumber()

function parseNumber(elem) {
	var num = Number.NaN;
	var str = parse(elem.value);
	if (!str.empty()) {
		num = (str.indexOf('.') == -1) ? parseInt(str) : parseFloat(str);
	}
	return (isNaN(num) ? null : num);
} // parseNumber()

function getRadioSelection(group_name, default_value) {
	var checkedElement = $$('input[type="radio"][name="' + group_name + '"]').find(
		function(re) {  // for each radio group element
			return re.checked;
		}
	);
	return (checkedElement ? $F(checkedElement) : default_value);
} // getRadioSelection()

function setRadioSelection(group_name, new_value) {
	$$('input[type="radio"][name="' + group_name + '"]').find(
		function(re) {  // for each radio group element
			re.checked = false;
			if (re.value == new_value) {
				re.checked = true;
			}
		}
	);
} // setRadioSelection()

function clearRadioSelection(group_name) {
	$$('input[type="radio"][name="' + group_name + '"]').find(
		function(re) {  // for each radio group element
			if (re.checked) {
				re.checked = false;
			}
		}
	);
} // clearRadioSelection()

function createListOptions(list, listOptions, defaultOption) {
	//if (!(isDefined(defaultOption))) defaultOption = '';
	list.options.length = 0;

	var index = 0;
	var i = 0;
	listOptions.each(
		function(option) {
			list.options[i] = new Option(option.desc, option.code);
			if (defaultOption == option.code) index = i;
			i++
		}
	);
	list.selectedIndex = index;
} // createListOptions()

/*
function setListOption(list, listOptions, selectedOption) {
	var option = listOptions.find(
		function(option) {
			return(option.code == selectedOption);
		}
	);
	list.selectedIndex = isDefined(option) ? option.index : 0;
} // setListOption()
*/

function setSelection(list, selectedValue) {
	var index = 0;
	var i = 0;
	var found = false;

	//if ((selectedValue != null) && (!selectedValue.blank())) {
	if (isDefined(selectedValue)) {
		while ((i < list.length) && (!found)) {
			if (selectedValue == list.options[i].value) {
				found = true;
				index = i;
			}
			else {
				i++;
			}
		}
		//if (found) list.options[i].selected = true;
		if (found) list.selectedIndex = index;
	}
} // setSelection()

function show(elem) {
	if (typeof(elem) == 'string') {elem = $(elem);}
	if (!elem.visible()) {elem.show();}
} // show()

function hide(elem) {
	if (typeof(elem) == 'string') {elem = $(elem);}
	if (elem.visible()) {elem.hide();}
} // hide()

var Coborrower = Class.create();
Coborrower.prototype = {
	initialize: function(formId, visible, monthlyIncome, ficoScore, occupied, ownedLast3Years) {
		this.formId = formId;
		this.isVisible = visible;
		this.monthlyIncome = monthlyIncome;
		this.ficoScore = ficoScore;
		this.occupied = occupied;
		this.ownedLast3Years = ownedLast3Years;
	},
	toString: function() {
		return Object.toJSON(this);
	}
}; // Coborrower()

function showCoborrowers() {
	var user_request = getRadioSelection('user_request', '');

	// visible co-borrowers
	for (var i = 1; i <= coborrowers.length; i++) {
		$$('tr.coborrower' + i.toString()).invoke('show');
		if (user_request.toUpperCase().include('ELIGIBILITY')) {
			$$('tr.coborrower' + i.toString() + '_eligibility').invoke('show');
		}
		else {
			$$('tr.coborrower' + i.toString() + '_eligibility').invoke('hide');
		}
	}
	// hidden co-borrowers
	for (var i = coborrowers.length + 1; i <= maxCoborrowers; i++) {
		$('coborrower'+i.toString()+'_monthly_income').value = '';
		$('coborrower'+i.toString()+'_fico_score').value = '';
		clearRadioSelection('coborrower'+i.toString()+'_to_occupy');
		clearRadioSelection('coborrower'+i.toString()+'_owned_last_3yrs');

		if ($('coborrower' + i.toString()).visible()) {
			$$('tr.coborrower'+i.toString()).invoke('hide');
			$$('tr.coborrower'+i.toString()+'_eligibility').invoke('hide');
		}
	}
} // showCoborrowers()

function addBorrower(form) {
	if (coborrowers.length < maxCoborrowers) {
		var id = coborrowers.length + 1;
		var borrower = new Coborrower(id);
		coborrowers.push(borrower);

		var user_request = getRadioSelection('user_request', '');
		if (user_request.toUpperCase().include('ELIGIBILITY')) {
			$$('tr.coborrower'+id.toString()+'_eligibility').invoke('show');
		}
		$$('tr.coborrower'+id.toString()).invoke('show');
	}
	else {
		alert('Maximum number of co-borrowers is ' + maxCoborrowers + '.');
	}
} // addBorrower()

function removeBorrower(id) {
	for (var i = id; i < coborrowers.length; i++) {
		$('coborrower'+i.toString()+'_monthly_income').value = $F('coborrower'+(i+1).toString()+'_monthly_income');
		$('coborrower'+i.toString()+'_fico_score').value     = $F('coborrower'+(i+1).toString()+'_fico_score');

		$('coborrower'+i.toString()+'_to_occupy_no').checked  = $('coborrower'+(i+1).toString()+'_to_occupy_no').checked;
		$('coborrower'+i.toString()+'_to_occupy_yes').checked = $('coborrower'+(i+1).toString()+'_to_occupy_yes').checked;

		$('coborrower'+i.toString()+'_owned_last_3yrs_no').checked  = $('coborrower'+(i+1).toString()+'_owned_last_3yrs_no').checked;
		$('coborrower'+i.toString()+'_owned_last_3yrs_yes').checked = $('coborrower'+(i+1).toString()+'_owned_last_3yrs_yes').checked;
		$('coborrower'+i.toString()+'_owned_last_3yrs_unk').checked = $('coborrower'+(i+1).toString()+'_owned_last_3yrs_unk').checked;
	}

	// clear fields
	var count = coborrowers.length.toString();
	$('coborrower'+count+'_monthly_income').value = '';
	$('coborrower'+count+'_fico_score').value = '';
	clearRadioSelection('coborrower'+count+'_to_occupy');
	clearRadioSelection('coborrower'+count+'_owned_last_3yrs');

	// hide coborrower section
	$$('tr.coborrower'+count).invoke('hide');
	$$('tr.coborrower'+count+'_eligibility').invoke('hide');

	coborrowers.splice(id-1, 1);
} // removeBorrower()

function getFICOScore() {
	var fico = null;

	var score = $F('borrower_fico_score');
	if ( !(score.blank()) ) {
		var num = parseInt(score);
		if (!isNaN(num)) {
			fico = num;
		}
	}

	if (fico != null) {
		// check co-borrowers' FICO scoresm - look for lowest
		for (var i = 1; i <= maxCoborrowers; i++) {
			if ($('coborrower'+i.toString()).visible()) {
				score = $F('coborrower'+i.toString()+'_fico_score');
				if ( !(score.blank()) ) {
					num = parseInt(score);
					if ( (!isNaN(num)) && (fico > num) ) {
						fico = num;
					}
				}
			}
		}
	}
	return fico;
} // getFICOScore()

function getCodeDefinition(elem_name, elem_code) {
	var code = null;
	if (isDefined(codes[elem_name])) {
		code = codes[elem_name].find(
			function(code_def) {
//				alert('codes['+elem_name+'] code:'+code_def.code+', desc:'+code_def.desc);
				return(code_def.code == elem_code);
			}
		);
	}
	return (isDefined(code) ? code : null);
} // getCodeDefinition()

function buildParmDetails(elem_name, elem_value, required) {
	var parm = '';

	if (isDefined(elem_value) && !(elem_value.blank())) {
		parm = '&' + elem_name + '=';
		parm += encodeURIComponent(elem_value);
		if (isDefined(codes[elem_name])) {
			// add description
			var code = getCodeDefinition(elem_name, elem_value);
			if (isDefined(code)) {
				parm += encodeURIComponent(','+code.desc);
			}
		}
	}
	else if (required) {
		parm = '&' + elem_name + '=';
	}
	return parm;
} // buildParmDetails()

function buildRadioParm(elem_name, required) {
	var elem_value = getRadioSelection(elem_name, '');
	var parm = buildParmDetails(elem_name, elem_value, required);
	return parm;
} // buildRadioParm()

function buildCheckParm(elem_name) {
	var parm = '&' + elem_name + '=' + ($(elem_name).checked ? 'Y' : 'N');
	return parm;
} // buildCheckParm()

function buildParm(elem_name, required, unformat) {
	var elem_value = (isDefined(unformat) ? unformatNumber($F(elem_name)) : $F(elem_name));
	var parm = buildParmDetails(elem_name, elem_value, required);
	return parm;
} // buildParm()

function isCreditUnionURL() {
	var currURL = document.location.href;
	var isCreditUnion = ((currURL.indexOf('cu.mgic.com') != -1) || (currURL.indexOf('cu.mgic.net') != -1)) ? true : false;
	return isCreditUnion;
} // isCreditUnionURL()

function closePopup() {
	if (isDefined(popupWin) && (!popupWin.closed)) {
		popupWin.close();
	}
} // closePopup()

function showPopup(name, url, content, width, height) {
	var attr = 'width='+width+',height='+height+',dependent,resizable,scrollbars,status';
	var close = '<a href="javascript:window.close();">Close Window</a><br /><br />';

	closePopup();

	popupWin = window.open('', name, attr);

	if (isDefined(popupWin)) {
		if (url == '') {
			popupWin.document.write('<html><body>' + close + content + '</body></html>');
			popupWin.document.close();
		}
		else {
			popupWin.location.href = url;
		}
		popupWin.focus();
	}
	else {
		alert('Important information cannot be displayed because of your browser\'s pop-up blocker.\n' +
		      'Please allow pop-ups from this Web site.');
	}
} // showPopup()

function showPremiumDefinition() {
	showPopup('definition', '/rates/mi_premium_definitions.html#' + $F('premium_type'), '', 580, 580);
} // showPremiumDefinition()

function createXMLHttpRequest() {
	if (window.XMLHttpRequest) {		// Mozilla/Safari
		return(new XMLHttpRequest());
	}
	else if (window.ActiveXObject) {	// IE
		try { return(new ActiveXObject('Msxml2.XMLHTTP')); } catch (e) {}
		try { return(new ActiveXObject('Microsoft.XMLHTTP')); } catch (e) {}
	}
	return null;
}

function AjaxRequest(strURL, strURLparms, timeout, strResultFunc) {
	var strResponse;

	var client = createXMLHttpRequest();
	if (!client) {
		alert('Requested action cannot be completed because XMLHttpRequest is not supported by this browser.');
		return;
	}

	var asynch = true;
	client.open('GET', strURL+'?'+strURLparms, asynch);
	client.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

	// Handle timeout situation
	var requestTimer = setTimeout(
		function() {
			client.abort();
			handleProblem();
		},
		timeout * 1000
	);

	client.onreadystatechange = function() {
		if (client.readyState == 4) {
			clearTimeout(requestTimer);

			if ((client.responseText != null) && (client.status == 200)) {
				strResponse = client.responseText;
				eval(strResultFunc + '(strResponse);');
			}
			else {
				handleProblem();
			}
		}
	}
	client.send(null);
} // AjaxRequest()

function handleProblem() {
	$('results').update('<div class="important">Rate Finder - Plus could not process the request.&nbsp; ' +
	                    'Please resubmit your request or contact ' + contactCustomerService + ' for further assistance.&nbsp; ' +
	                    'Click <a href="http://www.mgic.com/hoursavail.html" target="_blank">here</a> to see MGIC\'s normally scheduled hours of availability.</div>');
} // handleProblem()

function handleCountySearchProblem(searchType, searchCriteria) {
	$('results').update('<div class="important">Rate Finder - Plus is unable to validate ' + searchType + ' ' + searchCriteria + '.&nbsp; ' +
	                    'Please reenter the state and ZIP Code, or contact ' + contactCustomerService + ' for further assistance.&nbsp; ' +
	                    'Click <a href="http://www.mgic.com/hoursavail.html" target="_blank">here</a> to see MGIC\'s normally scheduled hours of availability.</div>');
} // handleCountySearchProblem()

function getCountiesInZip(selectedCounty) {
	hideCountySelection();
	hideError('property_zip');
	geoSearchResults = null;

	var zipCode = $F('property_zip');

	var user_request = getRadioSelection('user_request', '');
	if (zipCode.blank()) {
		return;   // counties lookup is not applicable
	}

	var ajax = new Ajax.Request('/geoservice/checkzip.htm',
		{
			method: 'get',
			parameters: {
				zip: zipCode,
				rndm: getRandomString()
			},
			onSuccess: function(transport) {
				var response = transport.responseText || "";
				if (debug) alert("response: '" + response + "'");
				try {
					geoSearchResults = (response.blank() ? null : response.evalJSON(true));
					processZipSearchResults(geoSearchResults, selectedCounty);
				}
				catch (e) {
					alert("Problem retrieving counties in ZIP Code " + zipCode + ".\n\n" + e);
					handleCountySearchProblem('ZIP Code', zipCode);
				}
			},
			onFailure: function() { 
				alert("Unable to retrieve counties in ZIP Ccode " + zipCode + ".\n\n" + e);
				handleCountySearchProblem('ZIP Code', zipCode);
			}
		}
	);
} // getCountiesInZip()

function processZipSearchResults(geoSearchResults, selectedCounty) {
	$('property_zip_label').title = '';

	if (! isDefined(geoSearchResults)) {
		showError('property_zip', 'ZIP Code lookup found no data.');
		return;
	}

	if ((geoSearchResults.counts.restricted == 0) && (geoSearchResults.counts.nonrestricted == 0)) {
		showError('property_zip', 'ZIP Code is not valid.');
	}
	else {
		var selectedState = null;
		if ($F('property_state').blank()) {
			// state was not selected -- default to first available
			selectedState = geoSearchResults.states[0];
			setSelection($('property_state'), selectedState.code);
		}
		else {
			// make sure the zip code belongs to the selected state
			var stateCode = $F('property_state');
			selectedState = geoSearchResults.states.find(
				function(state) {
					return(state.code == stateCode);
				}
			);
			if (!isDefined(selectedState)) {
				$('property_zip_label').title = getZipCodeLabel(geoSearchResults.states);
				showError('property_zip', 'State and ZIP Code do not match.');
				return;
			}
		}

		// assign title for ZIP Code field label
		$('property_zip_label').title = getZipCodeLabel(geoSearchResults.states);

		var restricted = getCountyCount(selectedState, 'restricted');
		var unrestricted = getCountyCount(selectedState, 'unrestricted');
		var title = '';

		if ((restricted > 0) && (unrestricted > 0)) {
			if (debug) {
				var html = 'Restricted\n' + getCountyList(selectedState, 'restricted') + '\n\n';
				html += 'Not Restricted\n' + getCountyList(selectedState, 'unrestricted');
				alert(html);
			}
			title = 'Counties in Restricted market: ' + restricted + ', in Not Restricted: ' + unrestricted;
		}
		else {
			title = 'Selected ZIP Code is ' + (restricted == 0 ? 'Not' : '') + ' a Restricted market';
		}
		showCountySelection(selectedState, selectedCounty);
		$('property_state_label').title = title;
	}
} // processZipSearchResults()

function handlePropertyStateChange() {
	hideError('property_zip');
	hideCountySelection();

	var stateCode = $F('property_state');
	if (stateCode.blank()) {
		geoSearchResults = null;
		return;
	}

	var zipCode = $F('property_zip');
	if (zipCode.blank() || (! isDefined(geoSearchResults))) {
		return;
	}

	processZipSearchResults(geoSearchResults);
} // handlePropertyStateChange()

function getCountyCount(state, filter) {
	var count = 0;
	if (filter == 'restricted') {
		state.counties.each(
			function(county) {
				if (county.restricted) {
					count++;
				}
			}
		);
	}
	else if (filter == 'unrestricted') {
		state.counties.each(
			function(county) {
				if (!county.restricted) {
					count++;
				}
			}
		);
	}
	return count;
} // getCountyCount()

function getZipCodeLabel(states) {
	var label = ''

	if (states.size() == 1) {
		states[0].counties.each(
			function(county) {
				if (label.length > 0) {
					label += ', ';
				}
				label += county.name + (county.restricted ? '-r'+county.restricted_tier : '');
			}
		);
	}
	else if (states.size() > 1) {
		states.each(
			function(state) {
				var counties = '';
				state.counties.each(
					function(county) {
						if (counties.length > 0) {
							counties += ', ';
						}
						counties += county.name + (county.restricted ? '-r'+county.restricted_tier : '');
					}
				);
				if (label.length > 0) {
					label += '  ';
				}
				label += state.code + ': [' + counties + ']';
			}
		);
	}
	return label;
} // getZipCodeLabel()

function showCountySelection(state, selectedCounty) {
	// build the options for Property County
	var counties = $('property_county');
	counties.options.length = 0;
	counties.setAttribute('size', 1);

	var index = 0;
	var i = 0;
	var option_value;
	state.counties.each(
		function(county) {
//		    option_value = county.code + ',' + county.name + ',' + (county.restricted ? 'r' : 'nr') + ',' + county.restricted_code + ',' + county.restricted_desc;
		    option_value = county.code + ',' + county.name + ',' + county.restricted_code + ',' + county.restricted_desc;
			counties.options[i] = new Option(county.name, option_value);
			if (isDefined(selectedCounty) && (selectedCounty == option_value)) index = i;
			i++;
		}
	);
	/*
	if (counties.length > 0) {
		counties.selectedIndex = index;
		$('property_state_label').title = $F('property_state') + ' counties in Restricted market: ' + geoSearchResults.counts.restricted + ', in Not Restricted: ' + geoSearchResults.counts.nonrestricted;
	}
	else {
		counties.options[0] = new Option('Not Available', '');
		$('property_state_label').title = '';
	}
	*/
	$('property_county_selection').show();
} // showCountySelection()

function hideCountySelection() {
	hide($('property_county_selection'));
	$('property_state_label').title = '';
	$('property_zip_label').title = '';
} // hideCountySelection()

function submitRequest(url, timeout) {
	var user_request = getRadioSelection('user_request', '').toUpperCase();
	var parms = '';

	// eligibility and rate fields
	parms += 'runmode=' + user_request.toLowerCase();

	// these fields are always visible
	parms += buildParm('loan_amount', true, true) +
	         buildParm('amortization_term', true) +
	         buildParm('repayment_type', true) +
	         buildParm('loan_purpose', true) +
	         buildParm('property_state', true) +
	         buildParm('occupancy_type', true) +
	         buildParm('appraised_value', true, true) +
	         buildParm('borrower_fico_score', true) +
	         buildParm('mgic_program', false) +
	         buildParm('coverage', true);

	parms += '&aus=' + getRadioSelection('aus', '').toUpperCase();

	// these fields are not always visible
	parms += $('retail_origination_selection').visible() ? buildRadioParm('retail_origination', true) : '';
	parms += $('interest_rate_selection').visible() ? buildParm('interest_rate', true) : '';
//	parms += $('balloon_loan_selection').visible() ? buildRadioParm('balloon_loan', true) : '';
	parms += $('balloon_term_selection').visible() ? buildParm('balloon_term', true) : '';

	if ($('buydown_type_selection').visible()) {
		var buydown_type = $('buydown_type');
		if (buydown_type.options[buydown_type.selectedIndex].text.toUpperCase() != 'NO BUYDOWN') {
 			parms += buildParm('buydown_type', true);
		}
	}

	if ($('loan_type_selection').visible()) {
		parms += buildParm('loan_type', true);

		var loan_type = $('loan_type');
		if (loan_type.options[loan_type.selectedIndex].text.toUpperCase() == 'ARM') {
			parms += buildParm('arm_program', true) +
			         buildParm('arm_index', true) +
			         buildParm('arm_margin', true) +
			         buildParm('arm_initial_adj_period', true) +
			         buildParm('arm_periodic_adj_period', true) +
			         buildParm('arm_initial_adj_cap', true) +
			         buildParm('arm_periodic_adj_cap', true) +
			         buildParm('arm_lifetime_adj_cap', true);

			parms += $('arm_index_rate_selection').visible() ? buildParm('arm_index_rate', true) : '';
		}
	}
	parms += $('loan_instrument_selection').visible()            ? buildParm('loan_instrument', true) : '';
	parms += $('interest_only_term_selection').visible()         ? buildParm('interest_only_term', true) : '';
	parms += $('refinance_purpose_selection').visible()          ? buildParm('refinance_purpose', true) : '';
	parms += $('prepaid_costs_selection').visible()              ? buildParm('prepaid_costs', true, true) : '';
	parms += $('piti_selection').visible()                       ? buildParm('piti', true, true) : '';
	parms += $('secondary_financing_amount_selection').visible() ? buildParm('secondary_financing_amount', true, true) : '';
	parms += $('seller_paid_costs_selection').visible()          ? buildParm('seller_paid_costs', true, true) : '';
	parms += $('debts_selection').visible()                      ? buildParm('debts', true, true) : '';
	parms += $('liens_selection').visible()                      ? buildParm('liens', true, true) : '';
	parms += $('liquid_assets_selection').visible()              ? buildParm('liquid_assets', true, true) : '';
	parms += $('other_monthly_payments_selection').visible()     ? buildParm('other_monthly_payments', true, true) : '';
	parms += $('du_recommendation_selection').visible()          ? buildParm('du_recommendation', true) : '';

	if ($('lp_determination_selection').visible()) {
		parms += buildParm('lp_determination', true);

		var lp_determination = $F('lp_determination').split(',');
		parms += buildParmDetails('lp_risk_decision', lp_determination[0].strip(), true);
		if (lp_determination.length > 1) {
			parms += buildParmDetails('lp_purchase_eligible', lp_determination[1].strip(), true);
		}
	}

	if ($('property_county_selection').visible()) {
		// parse county data: "code,name,restricted_code,restricted_desc"
		var countyInfo = $F('property_county').split(',');
		parms += buildParmDetails('property_county', countyInfo[0]+','+countyInfo[1], true);
	}
	parms += $('property_zip_selection').visible()    ? buildParm('property_zip', true) : '';
	parms += $('number_units_selection').visible()    ? buildParm('number_units', true) : '';
	parms += $('sales_price_selection').visible()     ? buildParm('sales_price', true, true) : '';
	parms += $('market_values_selection').visible()   ? buildParm('market_values', true) : '';
	parms += $('property_type_selection').visible()   ? buildParm('property_type', true) : '';
	parms += $('appraisal_made_selection').visible()  ? buildParm('appraisal_made', true) : '';
	parms += $('premium_type_selection').visible()    ? buildParm('premium_type', true) : '';
	parms += $('lender_state_selection').visible()    ? buildParm('lender_state', true) : '';
	parms += $('renewals_selection').visible()        ? buildParm('renewals', true) : '';
	parms += $('relocation_loan_selection').visible() ? buildCheckParm('relocation_loan') : '';

	if ($('upfront_premium_selection').visible()) {
		parms += buildParm('upfront_premium', true);
		parms += $('upfront_premium_financed_selection').visible() ? buildCheckParm('upfront_premium_financed') : '';
	}

	// borrower
	if (user_request.include('ELIGIBILITY')) {
		parms += buildParm('borrower_monthly_income', true, true) +
			 buildRadioParm('borrower_to_occupy', true) +
			 buildRadioParm('borrower_owned_last_3yrs', true);
	}

	// co-borrowers
	for (var i = 1; i <= maxCoborrowers; i++) {
		if ($('coborrower'+i.toString()).visible()) {
			parms += '&coborrower'+i.toString()+'=Y' + buildParm('coborrower'+i.toString()+'_fico_score', true);
			if (user_request.include('ELIGIBILITY')) {
				parms += buildParm('coborrower'+i.toString()+'_monthly_income', false, true) +
				         buildRadioParm('coborrower'+i.toString()+'_to_occupy', true) +
				         buildRadioParm('coborrower'+i.toString()+'_owned_last_3yrs', true);
			}
		}
	}

	// hidden fields
	parms += buildParm('restricted_market', true);

	parms += '&cu=' + (isCreditUnionURL() ? 'Y' : 'N') +
	         '&rndm=' + encodeURIComponent(getRandomString());

	if (debug) alert(parms);

	AjaxRequest(url, parms, timeout, 'showResponse');
} // submitRequest()

function showResponse(response) {		// called by AjaxRequest()
//	alert(quote_results);
	$('results').update(response);
} // showResponse()

function clearResults() {
	$('results').update('&nbsp;');
} // clearRateQuote()

function initARMIndexRate() {
	var arm_index = $('arm_index');
	if (arm_index.options[arm_index.selectedIndex].text.toUpperCase() == 'OTHER') {
		show($('arm_index_rate_selection'));
	}
	else {
		hide($('arm_index_rate_selection'));
		hideError('arm_index_rate');

		// reset ARM Index Rate
		$('arm_index_rate').value = '';
	}
} // initARMIndexRate()

function initARMAdjustmentPeriods() {
	var arm_program = $('arm_program');
	if (arm_program.options[arm_program.selectedIndex].text.toUpperCase() == 'OTHER') {
		$('arm_initial_adj_period').removeClassName('readonly');
		$('arm_periodic_adj_period').removeClassName('readonly');

		$('arm_initial_adj_period').disabled = false;
		$('arm_initial_adj_period').tabIndex = '';

		$('arm_periodic_adj_period').disabled = false;
		$('arm_periodic_adj_period').tabIndex = '';
	}
	else {
		$('arm_initial_adj_period').addClassName('readonly');
		$('arm_periodic_adj_period').addClassName('readonly');

		$('arm_initial_adj_period').disabled = true;
		$('arm_initial_adj_period').tabIndex = -1;

		$('arm_periodic_adj_period').disabled = true;
		$('arm_periodic_adj_period').tabIndex = -1;
	}
} // initARMAdjustmentPeriods()

function initZipCode(selectedZip, selectedCounty) {
	selectedZip = isDefined(selectedZip) ? selectedZip : '';
	$('property_zip').value = selectedZip;
	prevValues['property_zip'].value = selectedZip;

	// lookup counties for current zip code
	getCountiesInZip(selectedCounty);
} // initZipCode()

function initLenderState(selectedState) {
	var premium_type = $('premium_type');
	var premium_type_selection = premium_type.options[premium_type.selectedIndex].text.toUpperCase();

	if (premium_type_selection.startsWith('LPMI')) {
		show($('lender_state_selection'));
		if (isDefined(selectedState)) { // && (!selectedState.blank())) {
			setSelection($('lender_state'), selectedState);
		}
	}
	else {
		hide($('lender_state_selection'));
		hideError('lender_state');
	}
} // initLenderState()

function initAUS() {
	var aus = getRadioSelection('aus', null);
	if (aus == null) {
		aus = 'na';
		$('aus_na').checked = true;
	}
	aus = aus.toUpperCase();

	if (aus == 'DU') {
		hide($('lp_determination_selection'));
		show($('du_recommendation_selection'));
		hideError('lp_determination');

		// reset LP selection
		setSelection($('lp_determination'), '');
	}
	else if (aus == 'LP') {
		hide($('du_recommendation_selection'));
		show($('lp_determination_selection'));
		hideError('du_recommendation');

		// reset DU selection
		setSelection($('du_recommendation'), '');
	}
	else {
		hide($('du_recommendation_selection'));
		hide($('lp_determination_selection'));
		hideError('du_recommendation');
		hideError('lp_determination');

		// reset DU and LP selections
		setSelection($('du_recommendation'), '');
		setSelection($('lp_determination'), '');
	}
} // initAUS()

function initUpfrontPremium(selectedOption) {
	var premium_type = $('premium_type');
	var premium_type_selection = premium_type.options[premium_type.selectedIndex].text.toUpperCase();

	if (premium_type_selection.include('SPLIT PREMIUM')) {
		show($('upfront_premium_selection'));
		show($('upfront_premium_financed_selection'));
		if (isDefined(selectedOption)) {
			setSelection($('upfront_premium'), selectedOption);
		}
	}
	else {
		hide($('upfront_premium_selection'));
		hide($('upfront_premium_financed_selection'));

		// reset Upfront Premium Is Financed selection
		$('upfront_premium_financed').checked = false;
	}
} // initUpfrontPremium()

function initRenewals(selectedOption) {
	var renewalOptions = new Array();

	var premium_type = $('premium_type');
	var premium_type_selection = premium_type.options[premium_type.selectedIndex].text.toUpperCase();

	if (premium_type_selection.startsWith('BPMI - SINGLE') ||
	    premium_type_selection.startsWith('LPMI - SINGLE') ||
	    premium_type_selection.startsWith('INSUFFICIENT')) {
		hide($('renewals_selection'));
		hideError('renewals');
	}
	else {
		show($('renewals_selection'));
		if ($('upfront_premium_financed_selection').visible() && $('upfront_premium_financed').checked) {
			renewalOptions = [
				{code:'1', desc:'Constant'}
			];
			selectedOption = '1';
		}
		else if (premium_type_selection.startsWith('LPMI - MONTHLY')) {
			renewalOptions = [
				{code:'2', desc:'Declining'}
			];
		}
		else {
			renewalOptions = [
				{code:'',  desc:''},
				{code:'1', desc:'Constant'},
				{code:'2', desc:'Declining'}
			];
		}
	}
	createListOptions($('renewals'), renewalOptions, selectedOption);
} // initRenewals()

function initPremiumType(selectedOption) {
	var aus_selection = getRadioSelection('aus', '').toUpperCase();
	var du_selection = '';
	var lp_selection = '';
	if (aus_selection == 'DU') {
		var du_recommendation = $('du_recommendation');
		du_selection = du_recommendation.options[du_recommendation.selectedIndex].text.toUpperCase();
	}
	else if (aus_selection == 'LP') {
		var lp_determination = $('lp_determination');
		lp_selection = lp_determination.options[lp_determination.selectedIndex].text.toUpperCase();
	}

	var premiumTypeOptions = null;
	var fico = getFICOScore();

	if (fico == null) {
		premiumTypeOptions = arrPremiumTypeOptions_Undefined;
	}
	else if ((fico >= 660) && (du_selection.empty() && lp_selection.empty()) || (du_selection.startsWith('APPROVE') || (du_selection == 'OUT OF SCOPE')) || (lp_selection.startsWith('ACCEPT') || (lp_selection == 'INCOMPLETE'))) {
		premiumTypeOptions = (isCreditUnionURL() ? premiumTypeOptionsCU_1 : premiumTypeOptions_1);
	}
	else {
		premiumTypeOptions = premiumTypeOptions_2;
	}
	createListOptions($('premium_type'), premiumTypeOptions, selectedOption);

	initLenderState($F('lender_state'));
	initUpfrontPremium($F('upfront_premium'));
	initRenewals($F('renewals'));
} // initPremiumType()

function initEligibilityDefaults() {
	['prepaid_costs', 'secondary_financing_amount', 'seller_paid_costs', 'debts', 'other_monthly_payments'].each(
		function(fieldName) {
			if ($F(fieldName).blank()) {
				$(fieldName).value = '$0';
			}
		}
	);
	['balloon_term'].each(
		function(fieldName) {
			if ($F(fieldName).blank()) {
				$(fieldName).value = '0';
			}
		}
	);
} // initEligibilityDefaults()

function initUserRequest(selectedZip, selectedCounty) {
//	$$('tr.hidden').invoke('hide');

	var user_request = getRadioSelection('user_request', null);
	if (user_request == null) {
		user_request = 'rate_eligibility';
		$('get_rate_eligibility').checked = true;
	}
	user_request = user_request.toUpperCase();

	if (user_request == 'RATE') {
		$$('tr.arm').invoke('hide');
		$$('tr.eligibility').invoke('hide');
		$$('span.eligibility').invoke('hide');
		$$('tr.rate').invoke('show');
		$$('tr.rate_only').invoke('show');
	}
	else if (user_request == 'ELIGIBILITY') {
		$$('tr.rate').invoke('hide');
		$$('tr.rate_only').invoke('hide');
		$$('tr.eligibility').invoke('show');
		$$('span.eligibility').invoke('show');
		initEligibilityDefaults();
		handleBalloonLoanChange();
		handleLoanTypeChange();
	}
	else if (user_request == 'RATE_ELIGIBILITY') {
		$$('tr.rate_only').invoke('hide');
		$$('tr.rate').invoke('show');
		$$('tr.eligibility').invoke('show');
		$$('span.eligibility').invoke('show');
		initEligibilityDefaults();
		handleBalloonLoanChange();
		handleLoanTypeChange();
	}
	initZipCode(selectedZip, selectedCounty);
//	initDirections(user_request);
	handleLoanPurposeChange();
	handleRepaymentTypeChange();
	showCoborrowers();

	return user_request;
} //  initUserRequest()

function handleRetailOriginationChange() {
	var retail_origination = getRadioSelection('retail_origination', 'N');
	if (retail_origination == 'N') {
		createListOptions($('occupancy_type'), codes['occupancy_type_primary'], '');
		hideError('retail_origination');
	}
	else {
		createListOptions($('occupancy_type'), codes['occupancy_type'], '');
	}
} // handleRetailOriginationChange();

function handleAUSChange() {
	initAUS();
	initPremiumType('');
} // handleAUSChange()

function handleLoanTypeChange() {
	if (! $F('loan_type').blank()) hideError('loan_type');

	var loan_type = $('loan_type');
	if (loan_type.options[loan_type.selectedIndex].text.toUpperCase() == 'ARM') {
		$$('tr.arm').invoke('show');
		initARMIndexRate();
	}
	else {
		$$('tr.arm').invoke('hide');

		// reset values of all ARM drop-down fields
		['arm_program', 'arm_index'].each(
			function(field) {
				setSelection($(field), '');
			}
		);
		// reset values of all ARM numeric entry fields
		['arm_index_rate', 'arm_margin', 'arm_initial_adj_period', 'arm_periodic_adj_period', 'arm_initial_adj_cap', 'arm_periodic_adj_cap', 'arm_lifetime_adj_cap'].each(
			function(field) {
				$(field).value = '';
			}
		);
	}
	initARMAdjustmentPeriods();
} // handleLoanTypeChange()

function handleBalloonLoanChange() {
	var balloon_loan = getRadioSelection('balloon_loan', 'N');
	if (balloon_loan == 'N') {
		hide($('balloon_term_selection'));
		hideError('balloon_term');
	}
	else {
		show($('balloon_term_selection'));
	}
} // handleBalloonLoanChange();
/*
function handleBuydownTypeChange() {
	if (! $F('buydown_type').blank()) hideError('buydown_type');
} // handleBuydownTypeChange()
*/
function handleLoanInstrumentChange() {
	if (! $F('loan_instrument').blank()) hideError('loan_instrument');
} // handleLoanInstrumentChange()

function handleARMIndexChange() {
	if (! $F('arm_index').blank()) hideError('arm_index');
	initARMIndexRate();
} // handleARMIndexRateChange()

function handleOccupancyTypeChange() {
	if (! $F('occupancy_type').blank()) hideError('occupancy_type');
	/*
	var occupancy_type = $('occupancy_type');
	if ($F('occupancy_type').blank() || occupancy_type.options[occupancy_type.selectedIndex].text.toUpperCase() == 'PRIMARY RESIDENCE') {
		hide($('primary_residence_piti_selection'));
		hideError('primary_residence_piti');
	}
	else {
		show($('primary_residence_piti_selection'));
	}
	*/
} // handleOccupancyTypeChange()

function handleMarketValuesChange() {
	if (! $F('market_values').blank()) hideError('market_values');
} // handleMarketValuesChange()

function handlePropertyTypeChange() {
	if (! $F('property_type').blank()) hideError('property_type');
} // handlePropertyTypeChange()

function handleAppraisalMadeChange() {
	if (! $F('appraisal_made').blank()) hideError('appraisal_made');
} // handleAppraisalMadeChange()

function handleNumberOfUnitsChange() {
	if (! $F('number_units').blank()) hideError('number_units');
} // handleNumberOfUnitsChange()

function handleRenewalsChange() {
	if (! $F('renewals').blank()) hideError('renewals');
} // handleRenewalsChange()

function handleRefinancePurposeChange() {
	if (! $F('refinance_purpose').blank()) hideError('refinance_purpose');
} // handleRefinancePurposeChange()

function handleLenderStateChange() {
	if (! $F('lender_state').blank()) hideError('lender_state');
} // handleLenderStateChange()

function handleRepaymentTypeChange() {
	if (! $F('repayment_type').blank()) hideError('repayment_type');

	var repayment_type = $('repayment_type');
	if (repayment_type.options[repayment_type.selectedIndex].text.toUpperCase() == 'INTEREST ONLY') {
		show($('interest_only_term_selection'));
	}
	else {
		hide($('interest_only_term_selection'));
		hideError('interest_only_term');

		// reset Interest Only Term value
		$('interest_only_term').value = '';
	}
} // handleRepaymentTypeChange()

function handleLoanPurposeChange() {
	if (! $F('loan_purpose').blank()) hideError('loan_purpose');

	var user_request = getRadioSelection('user_request', '');

	var loan_purpose = $('loan_purpose');
	var loan_purpose_selection = loan_purpose.options[loan_purpose.selectedIndex].text.toUpperCase();

	if (loan_purpose_selection.startsWith('REFINANCE')) {
		show($('refinance_purpose_selection'));

		if (user_request.toUpperCase().include('ELIGIBILITY')) {
			show($('debts_selection'));
			show($('liens_selection'));

			// Seller Paid Closing Costs apply only to Eligibility
			hide($('seller_paid_costs_selection'));
			hideError('seller_paid_costs');

			// reset Seller Paid Costs value
			$('seller_paid_costs').value = '$0';
		}
		hide($('sales_price_selection'));
		hideError('sales_price');

		// reset Sales Price value
		$('sales_price').value = '';
	}
	else if (loan_purpose_selection.startsWith('PURCHASE') || loan_purpose_selection.startsWith('CONSTRUCTION')) {
		hide($('refinance_purpose_selection'));
		hideError('refinance_purpose');

		// reset Purpose of Refinance selection
		setSelection($('refinance_purpose'), '');

		if (user_request.toUpperCase().include('ELIGIBILITY')) {
			// Seller Paid Closing Costs apply only to Eligibility
			show($('seller_paid_costs_selection'));

			hide($('debts_selection'));
			hideError('debts');

			hide($('liens_selection'));
			hideError('liens');

			// reset Debts and Liens to be Paid Off value
			$('debts').value = '$0';
			$('liens').value = '';
		}
		show($('sales_price_selection'));
	}
	else {
		hide($('refinance_purpose_selection'));
		hide($('seller_paid_costs_selection'));
		hide($('debts_selection'));
		hide($('liens_selection'));
		hide($('sales_price_selection'));

		hideError('refinance_purpose');
		hideError('seller_paid_costs');
		hideError('debts');
		hideError('liens');
		hideError('sales_price');

		// reset Purpose of Refinance selection
		setSelection($('refinance_purpose'), '');

		// reset Seller Paid Costs, Debts to be Paid Off, Liens to be Paid Off, Sales Price values
		$('seller_paid_costs').value = '$0';
		$('debts').value = '$0';
		$('liens').value = '';
		$('sales_price').value = '';
	}
} // handleLoanPurposeChange()

function handlePremiumTypeChange() {
	initLenderState('');
	initUpfrontPremium('');
	initRenewals('')
	/*;
	initLenderState($F('lender_state'));
	initUpfrontPremium($F('upfront_premium'));
	initRenewals($F('renewals'));
	*/
} // handlePremiumTypeChange()

function handleARMProgramChange() {
	if (! $F('arm_program').blank()) hideError('arm_program');

	var arm_program = $('arm_program');
	switch (arm_program.options[arm_program.selectedIndex].text.toUpperCase()) {
		case '1 YEAR ARM':
			$('arm_initial_adj_period').value = '12';
			$('arm_periodic_adj_period').value = '12';
			break;
		case '3 YEAR ARM':
			$('arm_initial_adj_period').value = '36';
			$('arm_periodic_adj_period').value = '36';
			break;
		case '5 YEAR ARM':
			$('arm_initial_adj_period').value = '60';
			$('arm_periodic_adj_period').value = '60';
			break;
		case '3/1 ARM':
			$('arm_initial_adj_period').value = '36';
			$('arm_periodic_adj_period').value = '12';
			break;
		case '5/1 ARM':
			$('arm_initial_adj_period').value = '60';
			$('arm_periodic_adj_period').value = '12';
			break;
		case '7/1 ARM':
			$('arm_initial_adj_period').value = '84';
			$('arm_periodic_adj_period').value = '12';
			break;
		case '10/1 ARM':
			$('arm_initial_adj_period').value = '120';
			$('arm_periodic_adj_period').value = '12';
			break;
		case '1YR/6MO ARM':
			$('arm_initial_adj_period').value = '12';
			$('arm_periodic_adj_period').value = '6';
			break;
		case '2YR/6MO ARM':
			$('arm_initial_adj_period').value = '24';
			$('arm_periodic_adj_period').value = '6';
			break;
		case '3YR/6MO ARM':
			$('arm_initial_adj_period').value = '36';
			$('arm_periodic_adj_period').value = '6';
			break;
		case '1YR/3MO ARM':
			$('arm_initial_adj_period').value = '12';
			$('arm_periodic_adj_period').value = '3';
			break;
		case '2YR/3MO ARM':
			$('arm_initial_adj_period').value = '24';
			$('arm_periodic_adj_period').value = '3';
			break;
		case '3YR/3MO ARM':
			$('arm_initial_adj_period').value = '36';
			$('arm_periodic_adj_period').value = '3';
			break;
		case '1YR/1MO ARM':
			$('arm_initial_adj_period').value = '12';
			$('arm_periodic_adj_period').value = '1';
			break;
		case '2YR/1MO ARM':
			$('arm_initial_adj_period').value = '24';
			$('arm_periodic_adj_period').value = '1';
			break;
		case '3YR/1MO ARM':
			$('arm_initial_adj_period').value = '36';
			$('arm_periodic_adj_period').value = '1';
			break;
		case '6MO/6MO ARM':
			$('arm_initial_adj_period').value = '6';
			$('arm_periodic_adj_period').value = '6';
			break;
		case '6MO/1MO ARM':
			$('arm_initial_adj_period').value = '6';
			$('arm_periodic_adj_period').value = '1';
			break;
		case '1MO/1MO ARM':
			$('arm_initial_adj_period').value = '1';
			$('arm_periodic_adj_period').value = '1';
			break;
		case '3MO/1MO ARM':
			$('arm_initial_adj_period').value = '3';
			$('arm_periodic_adj_period').value = '1';
			break;
		default:
			$('arm_initial_adj_period').value = '';
			$('arm_periodic_adj_period').value = '';
			break;
	}
	initARMAdjustmentPeriods();
} // handleARMProgramChange()

function handleUserRequestChange() {
	show($('ratefinder_fields'));

	var user_request = initUserRequest($F('property_zip'), $F('property_county'));
	if (user_request.startsWith('RATE')) {
		initPremiumType($F('premium_type'));
	}
	hideAllErrors();
} //  handleUserRequestChange()

function handleSubmit(form) {
	if (allValid()) {
		// jump to the results section
		window.location.hash = 'results';

		// display temporary "Please wait" message
		var timeout = 30;   // seconds
		var user_request = getRadioSelection('user_request', '');
		if (user_request.toUpperCase() == 'RATE') {
			$('results').update('<div class="ratequote">Retrieving a rate quote.&nbsp; Please wait...</div>');
		}
		else if (user_request.toUpperCase() == 'ELIGIBILITY') {
			$('results').update('<div class="ratequote">Evaluating eligibility.&nbsp; Please wait...</div>');
		}
		else if (user_request.toUpperCase() == 'RATE_ELIGIBILITY') {
			$('results').update('<div class="ratequote">Evaluating eligibility and retrieving a rate quote.&nbsp; Please wait...</div>');
			timeout = 60;
		}
		submitRequest('/is/cgi-bin/ratefinder_plus.cgi', timeout);
	}
} // handleSubmit()

function handleClearForm(form) {
	// clear and hide coborrowers
	var count = coborrowers.length;
	for (var i = 1; i <= count; i++) {
		removeBorrower(1);
	}
	hideAllErrors();

	var user_request = getRadioSelection('user_request', null)
	initRateFinder(false, user_request);
} // handleClearForm()

function hideAllErrors() {
	$$('td.error_indicator').each(
		function(elem) {
			if (!elem.hasClassName('hidden')) {
				elem.addClassName('hidden');
				$(elem.id + '_msg').addClassName('hidden');
			}
		}
	);
	/*
	$$('td.error_message').each(
		function(elem) {
			if (!elem.hasClassName('hidden')) {
				elem.addClassName('hidden');
			}
		}
	);
	*/
} // hideAllErrors()

function hideError(elemName) {
	var elem = $(elemName + '_error');
	if (isDefined(elem) && (!elem.hasClassName('hidden'))) {
		elem.addClassName('hidden');
	}

	var elem_msg = $(elemName + '_error_msg');
	if (isDefined(elem_msg) && (!elem_msg.hasClassName('hidden'))) {
		elem_msg.addClassName('hidden');
	}
} // hideError()

function showError(elemName, errorMsg) {
	var elem = $(elemName + '_error');
	if (isDefined(elem) && elem.hasClassName('hidden')) {
		elem.removeClassName('hidden');
	}

	var elem_msg = $(elemName + '_error_msg');
	if (isDefined(elem_msg)) {
		if (isDefined(errorMsg) && (typeof(errorMsg) == 'string')) {
			elem_msg.update(errorMsg);
		}
		if (elem_msg.hasClassName('hidden')) {
			elem_msg.removeClassName('hidden');
		}
	}
} // showError()

function saveUserSelections() {
	var dataFields = {
		user_request:                getRadioSelection('user_request', 'rate_eligibility'),
		loan_amount:                 $F('loan_amount'),
		interest_rate:               ($('interest_rate_selection').visible() ? $F('interest_rate') : ''),
		amortization_term:           $F('amortization_term'),
		balloon_loan:                ($('balloon_loan_selection').visible() ? getRadioSelection('balloon_loan', '') : ''),
		balloon_term:                ($('balloon_term_selection').visible() ? $F('balloon_term') : ''),
		buydown_type:                ($('buydown_type_selection').visible() ? $F('buydown_type') : ''),
		loan_type:                   ($('loan_type_selection').visible() ? $F('loan_type') : ''),
		loan_instrument:             ($('loan_instrument_selection').visible() ? $F('loan_instrument') : ''),
		repayment_type:              $F('repayment_type'),
		interest_only_term:          ($('interest_only_term_selection').visible() ? $F('interest_only_term') : ''),

		arm_program:                 ($('arm_program_selection').visible() ? $F('arm_program') : ''),
		arm_index:                   ($('arm_index_selection').visible() ? $F('arm_index') : ''),
		arm_index_rate:              ($('arm_index_rate_selection').visible() ? $F('arm_index_rate') : ''),
		arm_margin:                  ($('arm_margin_selection').visible() ? $F('arm_margin') : ''),
		arm_initial_adj_period:      ($('arm_initial_adj_period_selection').visible() ? $F('arm_initial_adj_period') : ''),
		arm_periodic_adj_period:     ($('arm_periodic_adj_period_selection').visible() ? $F('arm_periodic_adj_period') : ''),
		arm_initial_adj_cap:         ($('arm_initial_adj_cap_selection').visible() ? $F('arm_initial_adj_cap') : ''),
		arm_periodic_adj_cap:        ($('arm_periodic_adj_cap_selection').visible() ? $F('arm_periodic_adj_cap') : ''),
		arm_lifetime_adj_cap:        ($('arm_lifetime_adj_cap_selection').visible() ? $F('arm_lifetime_adj_cap') : ''),

		loan_purpose:                $F('loan_purpose'),
		refinance_purpose:           ($('refinance_purpose_selection').visible() ? $F('refinance_purpose') : ''),
		prepaid_costs:               ($('prepaid_costs_selection').visible() ? $F('prepaid_costs') : ''),
		piti:                        ($('piti_selection').visible() ? $F('piti') : ''),
		secondary_financing_amount:  ($('secondary_financing_amount_selection').visible() ? $F('secondary_financing_amount') : ''),
		seller_paid_costs:           ($('seller_paid_costs_selection').visible() ? $F('seller_paid_costs') : ''),
		debts:                       ($('debts_selection').visible() ? $F('debts') : ''),
		liens:                       ($('liens_selection').visible() ? $F('liens') : ''),
		liquid_assets:               ($('liquid_assets_selection').visible() ? $F('liquid_assets') : ''),
		other_monthly_payments:      ($('other_monthly_payments_selection').visible() ? $F('other_monthly_payments') : ''),
		aus:                         getRadioSelection('aus', ''),
		du_recommendation:           ($('du_recommendation_selection').visible() ? $F('du_recommendation') : ''),
		lp_determination:            ($('lp_determination_selection').visible() ? $F('lp_determination') : ''),
		property_state:              $F('property_state'),
		property_zip:                ($('property_zip_selection').visible() ? $F('property_zip') : ''),
		property_county:             ($('property_county_selection').visible() ? $F('property_county') : ''),
		number_units:                ($('number_units_selection').visible() ? $F('number_units') : ''),
		occupancy_type:              $F('occupancy_type'),
		sales_price:                 $F('sales_price'),
		appraised_value:             $F('appraised_value'),
		market_values:               ($('market_values_selection').visible() ? $F('market_values') : ''),
		property_type:               ($('property_type_selection').visible() ? $F('property_type') : ''),
		appraisal_made:              ($('appraisal_made_selection').visible() ? $F('appraisal_made') : ''),

		borrower_monthly_income:     ($('borrower_monthly_income_selection').visible() ? $F('borrower_monthly_income') : ''),
		borrower_fico_score:         $F('borrower_fico_score'),
		borrower_to_occupy:          ($('borrower_to_occupy_selection').visible() ? getRadioSelection('borrower_to_occupy', '') : ''),
		borrower_owned_last_3yrs:    ($('borrower_owned_last_3yrs_selection').visible() ? getRadioSelection('borrower_owned_last_3yrs', '') : ''),

		coborrower1_visible:         $('coborrower1').visible(),
		coborrower2_visible:         $('coborrower2').visible(),
		coborrower3_visible:         $('coborrower3').visible(),
		coborrower4_visible:         $('coborrower4').visible(),
		coborrower5_visible:         $('coborrower5').visible(),

		coborrower1_monthly_income:  ($('coborrower1').visible() ? $F('coborrower1_monthly_income') : ''),
		coborrower2_monthly_income:  ($('coborrower2').visible() ? $F('coborrower2_monthly_income') : ''),
		coborrower3_monthly_income:  ($('coborrower3').visible() ? $F('coborrower3_monthly_income') : ''),
		coborrower4_monthly_income:  ($('coborrower4').visible() ? $F('coborrower4_monthly_income') : ''),
		coborrower5_monthly_income:  ($('coborrower5').visible() ? $F('coborrower5_monthly_income') : ''),

		coborrower1_fico_score:      ($('coborrower1').visible() ? $F('coborrower1_fico_score') : ''),
		coborrower2_fico_score:      ($('coborrower2').visible() ? $F('coborrower2_fico_score') : ''),
		coborrower3_fico_score:      ($('coborrower3').visible() ? $F('coborrower3_fico_score') : ''),
		coborrower4_fico_score:      ($('coborrower4').visible() ? $F('coborrower4_fico_score') : ''),
		coborrower5_fico_score:      ($('coborrower5').visible() ? $F('coborrower5_fico_score') : ''),

		coborrower1_to_occupy:       ($('coborrower1').visible() ? getRadioSelection('coborrower1_to_occupy', '') : ''),
		coborrower2_to_occupy:       ($('coborrower2').visible() ? getRadioSelection('coborrower2_to_occupy', '') : ''),
		coborrower3_to_occupy:       ($('coborrower3').visible() ? getRadioSelection('coborrower3_to_occupy', '') : ''),
		coborrower4_to_occupy:       ($('coborrower4').visible() ? getRadioSelection('coborrower4_to_occupy', '') : ''),
		coborrower5_to_occupy:       ($('coborrower5').visible() ? getRadioSelection('coborrower5_to_occupy', '') : ''),

		coborrower1_owned_last_3yrs: ($('coborrower1').visible() ? getRadioSelection('coborrower1_owned_last_3yrs', '') : ''),
		coborrower2_owned_last_3yrs: ($('coborrower2').visible() ? getRadioSelection('coborrower2_owned_last_3yrs', '') : ''),
		coborrower3_owned_last_3yrs: ($('coborrower3').visible() ? getRadioSelection('coborrower3_owned_last_3yrs', '') : ''),
		coborrower4_owned_last_3yrs: ($('coborrower4').visible() ? getRadioSelection('coborrower4_owned_last_3yrs', '') : ''),
		coborrower5_owned_last_3yrs: ($('coborrower5').visible() ? getRadioSelection('coborrower5_owned_last_3yrs', '') : ''),

		mgic_program:                $F('mgic_program'),
		premium_type:                ($('premium_type_selection').visible() ? $F('premium_type') : ''),
		lender_state:                ($('lender_state_selection').visible() ? $F('lender_state') : ''),
		upfront_premium:             ($('upfront_premium_selection').visible() ? $F('upfront_premium') : ''),
		upfront_premium_financed:    ($('upfront_premium_selection').visible() ? ($('upfront_premium_financed').checked ? 'Y' : '') : ''),
		coverage:                    $F('coverage'),
		renewals:                    ($('renewals_selection').visible() ? $F('renewals') : ''),
		relocation_loan:             ($('relocation_loan_selection').visible() ? ($('relocation_loan').checked ? 'Y' : '') : '')
	};

	var cjar = new CookieJar({
		expires: 30 * 24 * 3600,	// 30 days (in seconds)
		path: '/'
	});
	cjar.put('ratefinderplus', dataFields);
//	alert("saveUserSelections()\n" + Object.toJSON(cjar.getPack()));
} // saveUserSelections()

function fixMaskBug(field) {
	var fieldValue = $F(field);
	if (fieldValue.indexOf('-') != -1) {
		// masking library bug allows '-' characters in 'number' masks
		fieldValue = fieldValue.replace(/-/g, '');
		$(field).value = fieldValue;
	}
} // fixMaskBug()

function initEvents() {
	// user request selection
	['get_rate', 'get_eligibility', 'get_rate_eligibility'].each(
		function(field) {
			Event.observe(field, 'click', function(e) {clearResults(); handleUserRequestChange();});
		}
	);

	// text/number entry fields
	['loan_amount',                'interest_rate',              'amortization_term',          'balloon_term',
	 'interest_only_term',         'mgic_program',               'coverage',                   'arm_index_rate',
	 'arm_margin',                 'arm_initial_adj_period',     'arm_periodic_adj_period',    'arm_initial_adj_cap',
	 'arm_periodic_adj_cap',       'arm_lifetime_adj_cap',       'prepaid_costs',              'piti',
	 'secondary_financing_amount', 'seller_paid_costs',          'debts',                      'liens',
	 'liquid_assets',              'other_monthly_payments',     'sales_price',                'appraised_value',
	 'borrower_monthly_income',    'coborrower1_monthly_income', 'coborrower2_monthly_income', 'coborrower3_monthly_income',
	 'coborrower4_monthly_income', 'coborrower5_monthly_income'].each(
		function(field) {
			Event.observe(field, 'blur',
				function(e) {
					if ($(field).hasClassName('readonly')) {
						return;
					}
					fixMaskBug(field);

					var fieldValue = $F(field);
					if (prevValues[field].value != fieldValue) {
						prevValues[field].value = fieldValue;
						clearResults();
					}

					if (! fieldValue.blank()) {
						hideError(field);
					}
				}
			);
		}
	);

/*
	['arm_initial_adj_period', 'arm_periodic_adj_period'].each(
		function(field) {
			Event.observe(field, 'focus',
				function(e) {
					if ($(field).hasClassName('readonly')) {
						$(field).blur();
					}
				}
			);
		}
	);
*/

	// property zip code
	Event.observe('property_zip', 'blur',
		function(e) {
			fixMaskBug('property_zip');

			// pad zip code with leading zeroes
			var zip = $F('property_zip');
			if ((!zip.blank()) && (zip.length < 5)) {
				while (zip.length < 5) {
					zip = '0' + zip;
				}
				$('property_zip').value = zip;
			}

			if ((prevValues['property_zip'].value != zip) || (!isDefined(geoSearchResults))) {
				prevValues['property_zip'].value = zip;
				clearResults();
				getCountiesInZip();
			}
		}
	);

	// fico score fields
	['borrower_fico_score', 'coborrower1_fico_score', 'coborrower2_fico_score', 'coborrower3_fico_score', 'coborrower4_fico_score', 'coborrower5_fico_score'].each(
		function(field) {
			Event.observe(field, 'blur',
				function(e) {
					fixMaskBug(field);

					var fieldValue = $F(field);
					if (prevValues[field].value != fieldValue) {
						prevValues[field].value = fieldValue;
						clearResults();
						initPremiumType('');
					}

					if (! fieldValue.blank()) {
						hideError(field);
					}
				}
			);
		}
	);

	// dropdown fields
//	Event.observe('buydown_type',      'change', function(e) {clearResults(); handleBuydownTypeChange();});
	Event.observe('loan_type',         'change', function(e) {clearResults(); handleLoanTypeChange();});
	Event.observe('loan_instrument',   'change', function(e) {clearResults(); handleLoanInstrumentChange();});
	Event.observe('repayment_type',    'change', function(e) {clearResults(); handleRepaymentTypeChange();});
	Event.observe('arm_program',       'change', function(e) {clearResults(); handleARMProgramChange();});
	Event.observe('arm_index',         'change', function(e) {clearResults(); handleARMIndexChange()});
	Event.observe('loan_purpose',      'change', function(e) {clearResults(); handleLoanPurposeChange();});
	Event.observe('refinance_purpose', 'change', function(e) {clearResults(); handleRefinancePurposeChange();});
	Event.observe('du_recommendation', 'change', function(e) {clearResults(); initPremiumType('');});
	Event.observe('lp_determination',  'change', function(e) {clearResults(); initPremiumType('');});
	Event.observe('property_state',    'change', function(e) {clearResults(); handlePropertyStateChange();});
	Event.observe('property_county',   'change', function(e) {clearResults();});
	Event.observe('number_units',      'change', function(e) {clearResults(); handleNumberOfUnitsChange();});
	Event.observe('occupancy_type',    'change', function(e) {clearResults(); handleOccupancyTypeChange();});
	Event.observe('market_values',     'change', function(e) {clearResults(); handleMarketValuesChange();});
	Event.observe('property_type',     'change', function(e) {clearResults(); handlePropertyTypeChange();});
	Event.observe('appraisal_made',    'change', function(e) {clearResults(); handleAppraisalMadeChange();});
	Event.observe('premium_type',      'change', function(e) {clearResults(); handlePremiumTypeChange();});
	Event.observe('lender_state',      'change', function(e) {clearResults(); handleLenderStateChange();});
	Event.observe('upfront_premium',   'change', function(e) {clearResults();});
	Event.observe('renewals',          'change', function(e) {clearResults(); handleRenewalsChange();});

	// radio fields
	['retail_origination_no', 'retail_origination_yes'].each(
		function(field) {
			Event.observe(field, 'click', function(e) {clearResults(); handleRetailOriginationChange();});
		}
	);
	['balloon_loan_no', 'balloon_loan_yes'].each(
		function(field) {
			Event.observe(field, 'click', function(e) {clearResults(); handleBalloonLoanChange();});
		}
	);
	['aus_du', 'aus_lp', 'aus_na'].each(
		function(field) {
			Event.observe(field, 'click', function(e) {clearResults(); handleAUSChange();});
		}
	);
	['borrower_to_occupy_no',    'borrower_to_occupy_yes',    'borrower_owned_last_3yrs_no',    'borrower_owned_last_3yrs_yes',    'borrower_owned_last_3yrs_unk',
	 'coborrower1_to_occupy_no', 'coborrower1_to_occupy_yes', 'coborrower1_owned_last_3yrs_no', 'coborrower1_owned_last_3yrs_yes', 'coborrower1_owned_last_3yrs_unk',
	 'coborrower2_to_occupy_no', 'coborrower2_to_occupy_yes', 'coborrower2_owned_last_3yrs_no', 'coborrower2_owned_last_3yrs_yes', 'coborrower2_owned_last_3yrs_unk',
	 'coborrower3_to_occupy_no', 'coborrower3_to_occupy_yes', 'coborrower3_owned_last_3yrs_no', 'coborrower3_owned_last_3yrs_yes', 'coborrower3_owned_last_3yrs_unk',
	 'coborrower4_to_occupy_no', 'coborrower4_to_occupy_yes', 'coborrower4_owned_last_3yrs_no', 'coborrower4_owned_last_3yrs_yes', 'coborrower4_owned_last_3yrs_unk',
	 'coborrower5_to_occupy_no', 'coborrower5_to_occupy_yes', 'coborrower5_owned_last_3yrs_no', 'coborrower5_owned_last_3yrs_yes', 'coborrower5_owned_last_3yrs_unk'].each(
		function(field) {
			Event.observe(field, 'click',
				function(e) {
					clearResults();

					if (field.endsWith('_no')) {
						hideError(field.substr(0, field.length-3));
					}
					else if (field.endsWith('_yes') || field.endsWith('_unk')) {
						hideError(field.substr(0, field.length-4));
					}
				}
			);
		}
	);

	// checkbox fields
	Event.observe('upfront_premium_financed', 'click', function(e) {clearResults(); initRenewals('');});
	Event.observe('relocation_loan',          'click', function(e) {clearResults();});

	// buttons
	['remove_coborrower1_button', 'remove_coborrower2_button', 'remove_coborrower3_button', 'remove_coborrower4_button', 'remove_coborrower5_button'].each(
		function(button) {
			Event.observe(button, 'click', function(e) {clearResults(); removeBorrower(1); initPremiumType('');});
		}
	);
	Event.observe('add_borrower_button', 'click', function(e) {clearResults(); addBorrower(this.form);});
	Event.observe('submit_button',       'click', function(e) {handleSubmit(this.form);});
	Event.observe('clear_button',        'click', function(e) {handleClearForm(this.form);});
} // initEvents()

function initMasks() {
	var wholeAmountMask = new Mask('$#,###', 'number');
	wholeAmountMask.attach($('loan_amount'));
	wholeAmountMask.attach($('prepaid_costs'));
	wholeAmountMask.attach($('secondary_financing_amount'));
	wholeAmountMask.attach($('seller_paid_costs'));
	wholeAmountMask.attach($('debts'));
	wholeAmountMask.attach($('liquid_assets'));
	wholeAmountMask.attach($('sales_price'));
	wholeAmountMask.attach($('appraised_value'));
	wholeAmountMask.attach($('borrower_monthly_income'));
	wholeAmountMask.attach($('coborrower1_monthly_income'));
	wholeAmountMask.attach($('coborrower2_monthly_income'));
	wholeAmountMask.attach($('coborrower3_monthly_income'));
	wholeAmountMask.attach($('coborrower4_monthly_income'));
	wholeAmountMask.attach($('coborrower5_monthly_income'));

	var amountMask = new Mask('$#,###.#0', 'number');
	amountMask.attach($('piti'));
	amountMask.attach($('other_monthly_payments'));

	var monthsMask = new Mask('###', 'number');
	monthsMask.attach($('amortization_term'));
	monthsMask.attach($('balloon_term'));
	monthsMask.attach($('interest_only_term'));
	monthsMask.attach($('arm_initial_adj_period'));
	monthsMask.attach($('arm_periodic_adj_period'));

	var interestRateMask = new Mask('#,###.##0', 'number');
	interestRateMask.attach($('interest_rate'));

	var percentMask = new Mask('#,###.#00', 'number');
	percentMask.attach($('arm_index_rate'));
	percentMask.attach($('arm_margin'));
	percentMask.attach($('arm_initial_adj_cap'));
	percentMask.attach($('arm_periodic_adj_cap'));
	percentMask.attach($('arm_lifetime_adj_cap'));

	var ficoMask = new Mask('###', 'number');
	ficoMask.attach($('borrower_fico_score'));
	ficoMask.attach($('coborrower1_fico_score'));
	ficoMask.attach($('coborrower2_fico_score'));
	ficoMask.attach($('coborrower3_fico_score'));
	ficoMask.attach($('coborrower4_fico_score'));
	ficoMask.attach($('coborrower5_fico_score'));

	var liensMask = new Mask('#', 'number');
	liensMask.attach($('liens'));

	var coverageMask = new Mask('##', 'number');
	coverageMask.attach($('coverage'));

	var zipCodeMask = new Mask('*####', 'zipcode');
	zipCodeMask.attach($('property_zip'));
} // initMasks()

function initRateFinder(readCookies, user_request) {
	// retrieve user selections
	var cjar = new CookieJar();
	var dataFields = readCookies ? (cjar.get('ratefinderplus') || {}) : {};
//	alert("initRateFinder()\n" + Object.toJSON(cjar.getPack()));

	/*
	if (!isDefined(user_request)) {
		user_request = dataFields.user_request || '';
	}
	*/
	if (isDefined(user_request)) {
		user_request = user_request.toUpperCase();
	}
	else {
		clearRadioSelection('user_request');
	}

	var loan_amount                 = dataFields.loan_amount                 || '';
	var interest_rate               = dataFields.interest_rate               || '';
	var amortization_term           = dataFields.amortization_term           || '';
	var balloon_loan                = dataFields.balloon_loan                || '';
	var balloon_term                = dataFields.balloon_term                || '';
	var buydown_type                = dataFields.buydown_type                || '';
	var loan_type                   = dataFields.loan_type                   || '';
	var loan_instrument             = dataFields.loan_instrument             || '';
	var repayment_type              = dataFields.repayment_type              || '';
	var interest_only_term          = dataFields.interest_only_term          || '';

	var arm_program                 = dataFields.arm_program                 || '';
	var arm_index                   = dataFields.arm_index                   || '';
	var arm_index_rate              = dataFields.arm_index_rate              || '';
	var arm_margin                  = dataFields.arm_margin                  || '';
	var arm_initial_adj_period      = dataFields.arm_initial_adj_period      || '';
	var arm_periodic_adj_period     = dataFields.arm_periodic_adj_period     || '';
	var arm_initial_adj_cap         = dataFields.arm_initial_adj_cap         || '';
	var arm_periodic_adj_cap        = dataFields.arm_periodic_adj_cap        || '';
	var arm_lifetime_adj_cap        = dataFields.arm_lifetime_adj_cap        || '';

	var loan_purpose                = dataFields.loan_purpose                || '';
	var refinance_purpose           = dataFields.refinance_purpose           || '';
	var prepaid_costs               = dataFields.prepaid_costs               || '';
	var piti                        = dataFields.piti                        || '';
	var secondary_financing_amount  = dataFields.secondary_financing_amount  || '';
	var seller_paid_costs           = dataFields.seller_paid_costs           || '';
	var debts                       = dataFields.debts                       || '';
	var liens                       = dataFields.liens                       || '';
	var liquid_assets               = dataFields.liquid_assets               || '';
	var other_monthly_payments      = dataFields.other_monthly_payments      || '';
	var aus                         = dataFields.aus                         || '';
	var du_recommendation           = dataFields.du_recommendation           || '';
	var lp_determination            = dataFields.lp_determination            || '';
	var property_state              = dataFields.property_state              || '';
	var property_zip                = dataFields.property_zip                || '';
	var property_county             = dataFields.property_county             || null;
	var number_units                = dataFields.number_units                || '';
	var occupancy_type              = dataFields.occupancy_type              || '';
	var sales_price                 = dataFields.sales_price                 || '';
	var appraised_value             = dataFields.appraised_value             || '';
	var market_values               = dataFields.market_values               || '';
	var property_type               = dataFields.property_type               || '';
	var appraisal_made              = dataFields.appraisal_made              || '';

	var borrower_monthly_income     = dataFields.borrower_monthly_income     || '';
	var borrower_fico_score         = dataFields.borrower_fico_score         || '';
	var borrower_to_occupy          = dataFields.borrower_to_occupy          || '';
	var borrower_owned_last_3yrs    = dataFields.borrower_owned_last_3yrs    || '';

	var coborrower1_visible         = dataFields.coborrower1_visible         || '';
	var coborrower2_visible         = dataFields.coborrower2_visible         || '';
	var coborrower3_visible         = dataFields.coborrower3_visible         || '';
	var coborrower4_visible         = dataFields.coborrower4_visible         || '';
	var coborrower5_visible         = dataFields.coborrower5_visible         || '';

	var coborrower1_monthly_income  = dataFields.coborrower1_monthly_income  || '';
	var coborrower2_monthly_income  = dataFields.coborrower2_monthly_income  || '';
	var coborrower3_monthly_income  = dataFields.coborrower3_monthly_income  || '';
	var coborrower4_monthly_income  = dataFields.coborrower4_monthly_income  || '';
	var coborrower5_monthly_income  = dataFields.coborrower5_monthly_income  || '';

	var coborrower1_fico_score      = dataFields.coborrower1_fico_score      || '';
	var coborrower2_fico_score      = dataFields.coborrower2_fico_score      || '';
	var coborrower3_fico_score      = dataFields.coborrower3_fico_score      || '';
	var coborrower4_fico_score      = dataFields.coborrower4_fico_score      || '';
	var coborrower5_fico_score      = dataFields.coborrower5_fico_score      || '';

	var coborrower1_to_occupy       = dataFields.coborrower1_to_occupy       || '';
	var coborrower2_to_occupy       = dataFields.coborrower2_to_occupy       || '';
	var coborrower3_to_occupy       = dataFields.coborrower3_to_occupy       || '';
	var coborrower4_to_occupy       = dataFields.coborrower4_to_occupy       || '';
	var coborrower5_to_occupy       = dataFields.coborrower5_to_occupy       || '';

	var coborrower1_owned_last_3yrs = dataFields.coborrower1_owned_last_3yrs || '';
	var coborrower2_owned_last_3yrs = dataFields.coborrower2_owned_last_3yrs || '';
	var coborrower3_owned_last_3yrs = dataFields.coborrower3_owned_last_3yrs || '';
	var coborrower4_owned_last_3yrs = dataFields.coborrower4_owned_last_3yrs || '';
	var coborrower5_owned_last_3yrs = dataFields.coborrower5_owned_last_3yrs || '';

	var mgic_program                = dataFields.mgic_program                || '';
	var premium_type                = dataFields.premium_type                || '';
	var lender_state                = dataFields.lender_state                || '';
	var upfront_premium             = dataFields.upfront_premium             || '';
	var upfront_premium_financed    = dataFields.upfront_premium_financed    || '';
	var coverage                    = dataFields.coverage                    || '';
	var renewals                    = dataFields.renewals                    || '';
	var relocation_loan             = dataFields.relocation_loan             || '';

	// defaults
	balloon_loan = ((balloon_loan == 'N') || (balloon_loan == 'Y')) ? balloon_loan : 'N';
	balloon_term = balloon_term.blank() ? '0' : balloon_term;

	prepaid_costs              = prepaid_costs.blank()              ? '$0' : prepaid_costs;
	secondary_financing_amount = secondary_financing_amount.blank() ? '$0' : secondary_financing_amount;
	seller_paid_costs          = seller_paid_costs.blank()          ? '$0' : seller_paid_costs;
	debts                      = debts.blank()                      ? '$0' : debts;
	other_monthly_payments     = other_monthly_payments.blank()     ? '$0' : other_monthly_payments;

//	setRadioSelection('user_request', (user_request.blank() ? 'rate_eligibility' : user_request));

	if (isCreditUnionURL()) {
	    // Retail Origination does not apply to CU
		$('retail_origination_selection').addClassName('hidden');
	}
	else {
		clearRadioSelection('retail_origination');
	}

	$('loan_amount').value = loan_amount;
	$('interest_rate').value = interest_rate;
	$('amortization_term').value = amortization_term;

	setRadioSelection('balloon_loan', balloon_loan);
	$('balloon_term').value = balloon_term;

	setSelection($('buydown_type'), buydown_type);
	setSelection($('loan_type'), loan_type);
	setSelection($('loan_instrument'), loan_instrument);
	setSelection($('repayment_type'), repayment_type);

	if ($('repayment_type').options[$('repayment_type').selectedIndex].text.toUpperCase() == 'INTEREST ONLY') {
		$('interest_only_term').value = interest_only_term;
	}

	if ($('loan_type').options[$('loan_type').selectedIndex].text.toUpperCase() == 'ARM') {
		setSelection($('arm_program'), arm_program);
		setSelection($('arm_index'), arm_index);
		$('arm_index_rate').value = arm_index_rate;
		$('arm_margin').value = arm_margin;
		$('arm_initial_adj_period').value = arm_initial_adj_period;
		$('arm_periodic_adj_period').value = arm_periodic_adj_period;
		$('arm_initial_adj_cap').value = arm_initial_adj_cap;
		$('arm_periodic_adj_cap').value = arm_periodic_adj_cap;
		$('arm_lifetime_adj_cap').value = arm_lifetime_adj_cap;

		initARMIndexRate();
		initARMAdjustmentPeriods();
	}

	setSelection($('loan_purpose'), loan_purpose);
	setSelection($('refinance_purpose'), refinance_purpose);
	$('prepaid_costs').value = prepaid_costs;
	$('piti').value = piti;
	$('secondary_financing_amount').value = secondary_financing_amount;
	$('seller_paid_costs').value = seller_paid_costs;
	$('debts').value = debts;
	$('liens').value = liens;
	$('liquid_assets').value = liquid_assets;
	$('other_monthly_payments').value = other_monthly_payments;

	setRadioSelection('aus', (aus.blank() ? 'aus_na' : aus));
	setSelection($('du_recommendation'), du_recommendation);
	setSelection($('lp_determination'), lp_determination);

	setSelection($('property_state'), property_state);
	setSelection($('number_units'), number_units);
	if (isCreditUnionURL()) {
		// Primary and Secondary Residency options are available for CU
		createListOptions($('occupancy_type'), codes['occupancy_type'], occupancy_type);
	}
	else {
		setSelection($('occupancy_type'), occupancy_type);
	}
	$('sales_price').value = sales_price;
	$('appraised_value').value = appraised_value;
	setSelection($('market_values'), market_values);
	setSelection($('property_type'), property_type);
	setSelection($('appraisal_made'), appraisal_made);

	$('borrower_monthly_income').value = borrower_monthly_income;
	$('borrower_fico_score').value = borrower_fico_score;
	setRadioSelection('borrower_to_occupy', borrower_to_occupy);
	setRadioSelection('borrower_owned_last_3yrs', borrower_owned_last_3yrs);

	$('mgic_program').value = mgic_program;
	setSelection($('lender_state'), lender_state);
	setSelection($('upfront_premium'), upfront_premium);
	$('upfront_premium_financed').checked = (upfront_premium_financed.blank() ? false : true);
	$('coverage').value = coverage;
	$('relocation_loan').checked = (relocation_loan.blank() ? false : true);

	initAUS();

	if (isDefined(user_request)) {
		initUserRequest(property_zip, property_county);
		if (user_request.startsWith('RATE')) {
			initPremiumType(premium_type);
			setSelection($('renewals'), renewals);
		}
	}

	if (isCreditUnionURL()) {
	    // update the link to Underwriting Guidelines
	   	$('uw_guidelines_link').update('<a href="/pdfs/71-42758_cu_summary_current.pdf" target="_blank">MGIC\'s Credit Union Underwriting Guidelines Summary</a>');
	}

	prevValues['loan_amount'].value                = loan_amount;
	prevValues['interest_rate'].value              = interest_rate;
	prevValues['amortization_term'].value          = amortization_term;
	prevValues['balloon_term'].value               = balloon_term;
	prevValues['interest_only_term'].value         = interest_only_term;
	prevValues['arm_index_rate'].value             = arm_index_rate;
	prevValues['arm_margin'].value                 = arm_margin;
	prevValues['arm_initial_adj_period'].value     = arm_initial_adj_period;
	prevValues['arm_periodic_adj_period'].value    = arm_periodic_adj_period;
	prevValues['arm_initial_adj_cap'].value        = arm_initial_adj_cap;
	prevValues['arm_periodic_adj_cap'].value       = arm_periodic_adj_cap;
	prevValues['arm_lifetime_adj_cap'].value       = arm_lifetime_adj_cap;
	prevValues['prepaid_costs'].value              = prepaid_costs;
	prevValues['piti'].value                       = piti;
	prevValues['secondary_financing_amount'].value = secondary_financing_amount;
	prevValues['seller_paid_costs'].value          = seller_paid_costs;
	prevValues['debts'].value                      = debts;
	prevValues['liens'].value                      = liens;
	prevValues['liquid_assets'].value              = liquid_assets;
	prevValues['other_monthly_payments'].value     = other_monthly_payments;
	prevValues['sales_price'].value                = sales_price;
	prevValues['appraised_value'].value            = appraised_value;
	prevValues['borrower_monthly_income'].value    = borrower_monthly_income;
	prevValues['borrower_fico_score'].value        = borrower_fico_score;
	prevValues['mgic_program'].value               = mgic_program;
	prevValues['coverage'].value                   = coverage;
	prevValues['property_zip'].value               = property_zip;
} // initRateFinder()

function allValid() {
	var isValid = false;
	var error_location = null;
	var radioChoice;

	var user_request = getRadioSelection('user_request', '').toUpperCase();

	// Retail Origination (does not apply to CU)
	if (user_request.include('ELIGIBILITY') && (!isCreditUnionURL())) {
		if (getRadioSelection('retail_origination', null) == null) {
			showError('retail_origination');
			if (!isDefined(error_location)) error_location = 'retail_origination';
		}
		else {
			hideError('retail_origination');
		}
	}

	// Loan Amount
	var loan_amount = parseNumber($('loan_amount'));
	if ((loan_amount == null) || (loan_amount < 1)) {
		showError('loan_amount');
		if (!isDefined(error_location)) error_location = 'loan_amount';
	}
	else {
		hideError('loan_amount');
	}

	// determine LTV
	/*
	var ltv = getLTV();
	if (isDefined(ltv)) {
		$('ltv').value = ltv;
		if (ltv > 97) {
			alert('WARNING: Loan exceeds MGIC\'s standard LTV limit of 97%.');
		}
		else if (ltv < 80) {
			alert('WARNING: Loan\'s LTV is under 80%. Please confirm that Mortgage Insurance is needed.');
		}
	}
	*/

	// Interest Rate
	if ($('interest_rate_selection').visible()) {
		var interest_rate = parseNumber($('interest_rate'));
		if ((interest_rate == null) || (interest_rate == 0.0)) {
			showError('interest_rate', 'Interest Rate is required.');
			if (!isDefined(error_location)) error_location = 'interest_rate';
		}
		else if ((interest_rate < 1.0) || (interest_rate > 25.0)) {
			showError('interest_rate', 'Interest Rate must be between 1% and 25%.');
			if (!isDefined(error_location)) error_location = 'interest_rate';
		}
		else {
			hideError('interest_rate');
		}
	}

	// Loan Amortization Term
	var amortization_term = parseNumber($('amortization_term'));
	if ((amortization_term == null) || (amortization_term < 1) || (amortization_term > 600)) {
		showError('amortization_term');
		if (!isDefined(error_location)) error_location = 'amortization_term';
	}
	else {
		hideError('amortization_term');
	}

	// Balloon Term
	if ($('balloon_term_selection').visible()) {
		var balloon_term = parseNumber($('balloon_term'));
		if (balloon_term == null) {
			showError('balloon_term');
			if (!isDefined(error_location)) error_location = 'balloon_term';
		}
		else {
			hideError('balloon_term');
		}
	}

	// Loan Type
	// Loan Instrument
	// Repayment Type
	['loan_type', 'loan_instrument', 'repayment_type'].each(
		function(fieldName) {
			if ($(fieldName + '_selection').visible()) {
				if ($F(fieldName).blank()) {
					showError(fieldName);
					if (!isDefined(error_location)) error_location = fieldName;
				}
				else {
					hideError(fieldName);
				}
			}
		}
	);

	// Interest Only Term required if Repayment Type = "Interest Only"
	var repayment_type = $('repayment_type');
	if (repayment_type.options[repayment_type.selectedIndex].text.toUpperCase() == 'INTEREST ONLY') {
		if ($F('interest_only_term').blank()) {
			showError('repayment_type');
			if (!isDefined(error_location)) error_location = 'repayment_type';
		}
		else {
			hideError('repayment_type');
		}
	}

	// ARM fields required if Loan Type = "ARM"
	var loan_type = $('loan_type');
	if (loan_type.options[loan_type.selectedIndex].text.toUpperCase() == 'ARM') {
		if ($F('arm_program').blank()) {
			showError('arm_program');
			if (!isDefined(error_location)) error_location = 'arm_program';
		}
		else {
			hideError('arm_program');
		}

		if ($F('arm_index').blank()) {
			showError('arm_index');
			if (!isDefined(error_location)) error_location = 'arm_index';
		}
		else {
			hideError('arm_index');
		}

		// ARM Index Rate is required if ARM Index = "OTHER"
		var arm_index = $('arm_index');
		if (arm_index.options[arm_index.selectedIndex].text.toUpperCase() == 'OTHER') {
			var arm_index_rate = parseNumber($('arm_index_rate'));
			if ((arm_index_rate == null) || (arm_index_rate == 0.0)) {
				showError('arm_index_rate', 'ARM Index Rate is required if ARM Index is "OTHER".');
				if (!isDefined(error_location)) error_location = 'arm_index_rate';
			}
			else if (arm_index_rate > 15.0) {
				showError('arm_index_rate', 'ARM Index Rate exceeds 15%.');
				if (!isDefined(error_location)) error_location = 'arm_index_rate';
			}
			else {
				hideError('arm_index_rate');
			}
		}
		else {
			hideError('arm_index_rate');
		}

		var arm_margin = parseNumber($('arm_margin'));
		if ((arm_margin == null) || (arm_margin == 0.0)) {
			showError('arm_margin', 'ARM Margin is required.');
			if (!isDefined(error_location)) error_location = 'arm_margin';
		}
		else if (arm_margin > 4.0) {
			showError('arm_margin', 'ARM Margin exceeds 4%.');
			if (!isDefined(error_location)) error_location = 'arm_margin';
		}
		else {
			hideError('arm_margin');
		}

		var arm_initial_adj_period = parseNumber($('arm_initial_adj_period'));
		if ((arm_initial_adj_period == null) || (arm_initial_adj_period == 0)) {
			showError('arm_initial_adj_period');
			if (!isDefined(error_location)) error_location = 'arm_initial_adj_period';
		}
		else {
			hideError('arm_initial_adj_period');
		}

		var arm_periodic_adj_period = parseNumber($('arm_periodic_adj_period'));
		if ((arm_periodic_adj_period == null) || (arm_periodic_adj_period == 0)) {
			showError('arm_periodic_adj_period');
			if (!isDefined(error_location)) error_location = 'arm_periodic_adj_period';
		}
		else {
			hideError('arm_periodic_adj_period');
		}

		// Initial Adjustment Cap is required if Repayment Type = "FULLY AMORTIZING"
		if (repayment_type.options[repayment_type.selectedIndex].text.toUpperCase() == 'FULLY AMORTIZING') {
			var arm_initial_adj_cap = parseNumber($('arm_initial_adj_cap'));
			if ((arm_initial_adj_cap == null) || (arm_initial_adj_cap == 0.0)) {
				showError('arm_initial_adj_cap', 'ARM Initial Adjustment Cap is required for Fully Amortizing loans.');
				if (!isDefined(error_location)) error_location = 'arm_initial_adj_cap';
			}
			else if (arm_initial_adj_cap > 6.0) {
				showError('arm_initial_adj_cap', 'ARM Initial Adjustment Cap exceeds 6%.');
				if (!isDefined(error_location)) error_location = 'arm_initial_adj_cap';
			}
			else {
				hideError('arm_initial_adj_cap');
			}
		}
		else {
			hideError('arm_initial_adj_cap');
		}

		// Periodic Adjustment Cap is required if Repayment Type = "FULLY AMORTIZING"
		if (repayment_type.options[repayment_type.selectedIndex].text.toUpperCase() == 'FULLY AMORTIZING') {
			var arm_periodic_adj_cap = parseNumber($('arm_periodic_adj_cap'));
			if ((arm_periodic_adj_cap == null) || (arm_periodic_adj_cap == 0.0)) {
				showError('arm_periodic_adj_cap', 'ARM Periodic Adjustment Cap is required.');
				if (!isDefined(error_location)) error_location = 'arm_periodic_adj_cap';
			}
			else if (arm_periodic_adj_cap > 6.0) {
				showError('arm_periodic_adj_cap', 'ARM Periodic Adjustment Cap exceeds 6%.');
				if (!isDefined(error_location)) error_location = 'arm_periodic_adj_cap';
			}
			else {
				hideError('arm_periodic_adj_cap');
			}
		}
		else {
			hideError('arm_periodic_adj_cap');
		}

		var arm_lifetime_adj_cap = parseNumber($('arm_lifetime_adj_cap'));
		if ((arm_lifetime_adj_cap == null) && (arm_lifetime_adj_cap == 0.0)) {
			hideError('arm_lifetime_adj_cap');
		}
		else if (arm_lifetime_adj_cap > 6.0) {
			showError('arm_lifetime_adj_cap', 'ARM Lifetime Adjustment Cap exceeds 6%.');
			if (!isDefined(error_location)) error_location = 'arm_lifetime_adj_cap';
		}
		else {
			hideError('arm_lifetime_adj_cap');
		}
	}

	// Loan Purpose
	var loan_purpose = $('loan_purpose');
	var loan_purpose_selection = loan_purpose.options[loan_purpose.selectedIndex].text.toUpperCase();
	if ($F('loan_purpose').blank()) {
		showError('loan_purpose');
		if (!isDefined(error_location)) error_location = 'loan_purpose';
	}
	else {
		hideError('loan_purpose');

		// Refinance Purpose required if Loan Purpose = "Refinance"
		if ((loan_purpose_selection == 'REFINANCE') && $F('refinance_purpose').blank()) {
			showError('refinance_purpose');
			if (!isDefined(error_location)) error_location = 'refinance_purpose';
		}
		else {
			hideError('refinance_purpose');
		}
	}

	// Prepaid Closing Costs & Prepaids
	// PITI
	// Secondary Financing Amount
	// Seller Paid Closing Costs
	['prepaid_costs',  'piti', 'secondary_financing_amount', 'seller_paid_costs'].each(
		function(fieldName) {
			if ($(fieldName + '_selection').visible()) {
				if ($F(fieldName).blank()) {
					showError(fieldName);
					if (!isDefined(error_location)) error_location = fieldName;
				}
				else {
					hideError(fieldName);
				}
			}
		}
	);

	// AUS
	if (getRadioSelection('aus', null) == null) {
		showError('aus');
		if (!isDefined(error_location)) error_location = 'aus';
	}
	else {
		hideError('aus');
	}

	// DU Recommendation
	// LP Determination
	// Property State
	['du_recommendation',  'lp_determination', 'property_state'].each(
		function(fieldName) {
			if ($(fieldName + '_selection').visible()) {
				if ($F(fieldName).blank()) {
					showError(fieldName);
					if (!isDefined(error_location)) error_location = fieldName;
				}
				else {
					hideError(fieldName);
				}
			}
		}
	);

	// Property ZIP Code
	if ($('property_zip_selection').visible()) {
		if ($F('property_zip').blank()) {
			showError('property_zip', 'Property ZIP Code is required.');
			if (!isDefined(error_location)) error_location = 'property_zip';
		}
		else {
			hideError('property_zip');

			if (isDefined(geoSearchResults)) {
				$('restricted_market').value = '';

				var stateCode = $F('property_state');
				selectedState = geoSearchResults.states.find(
					function(state) {
						return(state.code == stateCode);
					}
				);
				if (isDefined(selectedState)) {
					// parse county data from the selected County dropdown choice: "code,name,restricted_code,restricted_desc"
					var countyInfo = $F('property_county').split(',');
					$('restricted_market').value = countyInfo[2] + ',' + countyInfo[3];

					/*
					var restricted = getCountyCount(selectedState, 'restricted');
					var unrestricted = getCountyCount(selectedState, 'unrestricted');

					if ((restricted > 0) && (unrestricted > 0)) {
						// parse county data from the selected County dropdown choice: "code,name,r/nr,restricted_code,restricted_desc"
						var countyInfo = $F('property_county').split(',');
						$('restricted_market').value = countyInfo[3];

//						var selectedCounty = selectedState.counties.find(
//							function(county) {
//								return(county.code == countyInfo[0]);
//							}
//						);
//						if (isDefined(selectedCounty)) {
//							$('restricted_market').value = selectedCounty.restricted ? '2' : '1';
//						}
//						else {
//							alert('Unable to determine market type for ' + county[1] + ' county.');
//							if (!isDefined(error_location)) error_location = 'property_state';
//						}
					}
					else {
						$('restricted_market').value = (restricted == 0 ? '1' : '2');
					}
					*/
				}
				else {
					alert('Unable to determine market type for ' + stateCode + ' state.  Please reselect the Property State.\n\nIf you require assistance please contact ' + contactCustomerService + '.');
					if (!isDefined(error_location)) error_location = 'property_state';
				}
			}
			else {
				alert('Property ZIP Code verification is in process.  Please resubmit your request.\n\nIf you require assistance please contact ' + contactCustomerService + '.');
				if (!isDefined(error_location)) error_location = 'property_zip';
			}
		}
	}

	// Number of Units
	// Occupancy Type
	['number_units', 'occupancy_type'].each(
		function(fieldName) {
			if ($(fieldName + '_selection').visible()) {
				if ($F(fieldName).blank()) {
					showError(fieldName);
					if (!isDefined(error_location)) error_location = fieldName;
				}
				else {
					hideError(fieldName);
				}
			}
		}
	);

	// Sales Price required if Loan Purpose = "Purchase" or "Construction"
	// Appraised Value
	['sales_price', 'appraised_value'].each(
		function(fieldName) {
			if ($(fieldName + '_selection').visible()) {
				var value = parseNumber($(fieldName));
				if ((value == null) || (value == 0)) {
					showError(fieldName);
					if (!isDefined(error_location)) error_location = fieldName;
				}
				else {
					hideError(fieldName);
				}
			}
		}
	);

	// Market Values
	// Subject Property Type
	// Appraisal Made
	// Borrower's Total Monthly Income
	['market_values', 'property_type', 'appraisal_made', 'borrower_monthly_income'].each(
		function(fieldName) {
			if ($(fieldName + '_selection').visible()) {
				if ($F(fieldName).blank()) {
					showError(fieldName);
					if (!isDefined(error_location)) error_location = fieldName;
				}
				else {
					hideError(fieldName);
				}
			}
		}
	);

	// Borrower's FICO Score
	if ($F('borrower_fico_score').blank()) {
		showError('borrower_fico_score');
		if (!isDefined(error_location)) error_location = 'borrower_fico_score';
	}
	else {
		hideError('borrower_fico_score');
	}

	// Borrower's Intent to Occupy
	// Borrower Owned Property in the Last 3 Years
	['borrower_to_occupy', 'borrower_owned_last_3yrs'].each(
		function(fieldName) {
			if ($(fieldName + '_selection').visible()) {
				radioChoice = getRadioSelection(fieldName, null);
				if (radioChoice == null) {
					showError(fieldName);
					if (!isDefined(error_location)) error_location = fieldName;
				}
				else {
					hideError(fieldName);
				}
			}
		}
	);

	// Amount of Debts to Pay Off required if Loan Purpose = "Refinance"
	if ($('debts_selection').visible()) {
		var value = parseNumber($('debts'));
		if ((loan_purpose_selection == 'REFINANCE') && ((value == null) || (value == 0))) {
			showError('debts');
			if (!isDefined(error_location)) error_location = 'debts';
		}
		else {
			hideError('debts');
		}
	}

	// Liens to Pay Off required if Loan Purpose = "Refinance"
	if ($('liens_selection').visible()) {
		var value = parseNumber($('liens'));
		if ((loan_purpose_selection == 'REFINANCE') && ((value == null) || (value == 0))) {
			showError('liens');
			if (!isDefined(error_location)) error_location = 'liens';
		}
		else {
			hideError('liens');
		}
	}

	// Total Liquid Assets
	// All Other Monthly Payments
	['liquid_assets', 'other_monthly_payments'].each(
		function(fieldName) {
			if ($(fieldName + '_selection').visible()) {
				if ($F(fieldName).blank()) {
					showError(fieldName);
					if (!isDefined(error_location)) error_location = fieldName;
				}
				else {
					hideError(fieldName);
				}
			}
		}
	);

	// Co-Borrowers
	for (var i = 1; i <= maxCoborrowers; i++) {
		if ($('coborrower'+i.toString()).visible()) {
			// Total Monthly Income
			if ($('coborrower'+i.toString()+'_monthly_income_selection').visible() && $F('coborrower'+i.toString()+'_monthly_income').blank()) {
				showError('coborrower'+i.toString()+'_monthly_income');
				if (!isDefined(error_location)) error_location = 'coborrower'+i.toString()+'_monthly_income';
			}
			else {
				hideError('coborrower'+i.toString()+'_monthly_income');
			}

			// FICO Score
			if ($F('coborrower'+i.toString()+'_fico_score').blank()) {
				showError('coborrower'+i.toString()+'_fico_score');
				if (!isDefined(error_location)) error_location = 'coborrower'+i.toString()+'_fico_score';
			}
			else {
				hideError('coborrower'+i.toString()+'_fico_score');
			}

			// Intent to Occupy
			if ($('coborrower'+i.toString()+'_to_occupy_selection').visible()) {
				radioChoice = getRadioSelection('coborrower'+i.toString()+'_to_occupy', null);
				if (radioChoice == null) {
					showError('coborrower'+i.toString()+'_to_occupy');
					if (!isDefined(error_location)) error_location = 'coborrower'+i.toString()+'_to_occupy';
				}
				else {
					hideError('coborrower'+i.toString()+'_to_occupy');
				}
			}

			// Owned Property in the Last 3 Years
			if ($('coborrower'+i.toString()+'_owned_last_3yrs_selection').visible()) {
				radioChoice = getRadioSelection('coborrower'+i.toString()+'_owned_last_3yrs', null);
				if (radioChoice == null) {
					showError('coborrower'+i.toString()+'_owned_last_3yrs');
					if (!isDefined(error_location)) error_location = 'coborrower'+i.toString()+'_owned_last_3yrs';
				}
				else {
					hideError('coborrower'+i.toString()+'_owned_last_3yrs');
				}
			}
		}
	}

	// Premium Type
	// Lender State
	['premium_type', 'lender_state'].each(
		function(fieldName) {
			if ($(fieldName + '_selection').visible()) {
				if ($F(fieldName).blank()) {
					showError(fieldName);
					if (!isDefined(error_location)) error_location = fieldName;
				}
				else {
					hideError(fieldName);
				}
			}
		}
	);

	// Coverage
	var coverage = parseNumber($('coverage'));
	if (coverage == null) {
		showError('coverage');
		if (!isDefined(error_location)) error_location = 'coverage';
	}
	else {
		hideError('coverage');
	}

	// Renewals
	if ($('renewals_selection').visible()) {
		if ($F('renewals').blank()) {
			showError('renewals');
			if (!isDefined(error_location)) error_location = 'renewals';
		}
		else {
			hideError('renewals');
		}
	}

	if (isDefined(error_location)) {
		window.location = '#' + error_location;
//		window.location.hash = '#' + error_location;
//		window.scrollTo(0, $(error_location).offsetTop);

		return false;
	}

	return true;
} // allValid()

// ----- Debug Functions ----- //
function getCountyList(state, filter) {
	var html = '';
	state.counties.each(
		function(county) {
			if (filter == 'restricted') {
				if (county.restricted) {
					html += county.name + ', ' + state.code + '\n';
				}
			}
			else if (filter == 'unrestricted') {
				if (!county.restricted) {
					html += county.name + ', ' + state.code + '\n';
				}
			}
			else if (filter == 'none') {
				html += county.name + ', ' + state.code + '\n';
			}
		}
	);
	return html;
} // getCountyList()

// ----- Obsolete Functions ----- //
/*
function getCountiesInState(selectedCounty) {
//	var parms = 'state=' + encodeURIComponent($F('property_state'));
//	AjaxRequest('/geoservice/getcounties.htm', parms, 5, 'showCounties');

	var user_request = getRadioSelection('user_request', '');
	if (user_request.toUpperCase() == 'RATE') {
		return;   // counties lookup is not applicable
	}

	var state = $F('property_state');
	if (state.blank()) {
		hideCountySelection();
		return;
	}

	var ajax = new Ajax.Request('/geoservice/getcounties.htm',
		{
			method: 'get',
			parameters: {
				state: state,
				rndm: getRandomString()
			},
			onSuccess: function(transport) {
				var response = transport.responseText || "";
//				if (debug) alert("ajax response: '" + response + "'");
				try {
					geoSearchResults = (response.blank() ? null : response.evalJSON(true));
					showCounties(selectedCounty);
				}
				catch (e) {
					alert("Problem retrieving " + state + " counties.\n\n" + e);
					handleCountySearchProblem('State', state);
				}
			},
			onFailure: function() {
				alert('Unable to retrieve ' + state + ' counties.');
				handleCountySearchProblem('State', state);
			}
		}
	);
} // getCountiesInState()

function showCounties(selectedCounty) {
	// build the options for Property County
	var counties = $('property_county');
	counties.options.length = 0;
	counties.setAttribute('size', 1);

	if (isDefined(geoSearchResults)) {
		if ((geoSearchResults.counts.restricted > 0) && (geoSearchResults.counts.nonrestricted > 0)) {
			var index = 0;
			var i = 0;
			geoSearchResults.counties.each(
				function(county) {
					counties.options[i] = new Option(county.name, county.code+','+county.name);
					if (isDefined(selectedCounty) && (selectedCounty == (county.code+','+county.name))) index = i;
					i++;
				}
			);
			if (counties.length > 0) {
				counties.selectedIndex = index;
				$('property_state_label').title = $F('property_state') + ' counties in Restricted market: ' + geoSearchResults.counts.restricted + ', in Not Restricted: ' + geoSearchResults.counts.nonrestricted;
			}
			else {
				counties.options[0] = new Option('Not Available', '');
				$('property_state_label').title = '';
			}
			$('property_county_selection').show();
		}
		else {
			counties.options[0] = new Option('Not Applicable', '');
			$('property_county_selection').hide();

			if (geoSearchResults.counts.restricted == 0) {
				$('property_state_label').title = 'all ' + $F('property_state') + ' counties are in Not Restricted market';
			}
			else {
				$('property_state_label').title = 'all ' + $F('property_state') + ' counties are in Restricted market';
			}
		}
	}
	else {
		counties.options[0] = new Option('Not Available', '');
		$('property_state_label').title = '';
	}
} // showCounties)()
*/

