//Javascript for Product Calculators

	//MEMBERS
	var m_strVarRateVisibility = new Array("hidden","hidden","hidden");
	var m_strPerRateVisibility = new Array("hidden","hidden","hidden");

	var m_strOrdinalNames = new Array("first", "second", "third");
	var m_strDPPercentNames = new Array("txtPercentDownPayment1", "txtPercentDownPayment2", "txtPercentDownPayment3");
	var m_strDPDollarNames = new Array("txtAmountDownPayment1", "txtAmountDownPayment2", "txtAmountDownPayment3");
	var m_strLoanAmountNames = new Array("txtLoanAmount1","txtLoanAmount2","txtLoanAmount3");
	var m_strLTVNames = new Array("txtLTV1","txtLTV2","txtLTV3");
	var m_strAsteriskNames = new Array("lblAsterisk1","lblAsterisk2","lblAsterisk3");
	var m_strLoanAmountWarningNames = new Array("lblLoanAmountWarning1","lblLoanAmountWarning2","lblLoanAmountWarning3");
	var m_strProductDropDownNames = new Array("ddlProduct1","ddlProduct2","ddlProduct3");
	var m_strRateDropDownNames = new Array("ddlRates1", "ddlRates2", "ddlRates3");
	var m_strInitialAdjRateNames = new Array("txtInitAdjRate1","txtInitAdjRate2","txtInitAdjRate3");
	var m_strSelectedRateIndexes = new Array("htxtSelectedRate1","htxtSelectedRate2","htxtSelectedRate3");
	var m_strRateXMLNames = new Array("htxtRateXML1","htxtRateXML2","htxtRateXML3");
	var m_strBlendedRateProducts = new String("BR");
	var m_strPrimeFirstProducts = new String("PF");
	var m_strEquityAccessARMProducts = new String("EA");
	var m_strEquityAccessFIXEDProducts = new String("EF");
	var m_strInterestOnlyProducts = new String("IOF");
	var m_strFIXEDAdjProducts = new String("NA");
	
	// store values to be used to validate fields 14 (initial adj rate) and sub. adjust rate
	var m_strFloor = new Array("floor1", "floor2", "floor3");
	var m_strIRcap = new Array("initratecap1", "initratecap2", "initratecap3");
	var m_strSRcap = new Array("subratecap1", "subratecap2", "subratecap3");
    var m_strLifecap = new Array("lifecap1", "lifecap2", "lifecap3");
	var m_strCeiling = new Array("subceiling1", "subceiling2", "subceiling3");
	// field 14 selected
   	var m_IRate = new Array("initRate1", "initRate2", "initRate3");
    
	var m_tieronemin=0;
	var m_tiertwomin=0;
	var m_tierthreemin=0;
	
	var m_tieronemax=0;
	var m_tiertwomax=0;
	var m_tierthreemax=0;
	 				
 				
	//CONSTANT DECLARATIONS
	var nAmortFixed = new Number(0);
	var nAmortArm = new Number(1);
	var m_dIncrement = new Number(5);
	var m_nNonEAMinimumLoanAmount = new Number(10000);
	var m_dLoanAmountLimit = new Number(3000000); //$3 Million 
	
	 // Modified to 3M based on TM 12413
	 //equity access products Loan limit is 2 million TM 12395
	 //PCTUP00457627 - HELOC loan amount 1MM
	var m_dEquityloanAmtLimt = new Number(1000000);
	
	var m_dROILimit = new Number(15);
	var m_dHPLimit = new Number(40);
	var m_iLoanTypeNone = new Number(0);
	var m_iLoanTypeConforming = new Number(1);
	var m_iLoanTypeNonConforming = new Number(2);
	
	//TM21119
	var m_nEAFixedMaxLoanAmount = new Number(350000);
	
	
	var m_iCurrentLoanTypes = new Array(m_iLoanTypeNone.valueOf(), m_iLoanTypeNone.valueOf(), m_iLoanTypeNone.valueOf());
	
	var m_bPropertyValueErrorTrap = new Boolean(false);
	var m_iIndexInError = new Number(0);
	var m_iOk = new Number(0);
	var m_iCancel = new Number(1);

	var _CHANGEDFREQ = new Boolean(false);
	var nLoanTerm1 = new Number(0);
	var nLoanTerm2 = new Number(0);
	
	//a problem exists on navigating back to this page, dynamic content must be re-initialized...
	function body_OnLoad()
	{
	
		//alert ('i am here');
		var i = 0;
		var iIndex = 0;
		var nLoanAmount;
		var nSelectedIndex;
		
		var sSubAdj1 = 0;
		var sSubAdj2 = 0;
		var sSubAdj3 = 0;
		var iAdjRate1;
		var iAdjRate2;
		var iAdjRate3;
		var iRateXML1;
		var iRateXML2;
		var iRateXML3;
		var iBeginM1;
		var iBeginM2;
		var iBeginM3;
		var iBeginY1;
		var iBeginY2;
		var iBeginY3;
		var iEndM1;
		var iEndM2;
		var iEndM3;
		var iEndY1;
		var iEndY2;
		var iEndY3;
				
		// load values here, they will get reset to the default values in other functions
		// so saving this here then re-loading will resolve this issue
		
	     sSubAdj1 = document.all("txtSubsequentAdj1").value;
	     sSubAdj2 = document.all("txtSubsequentAdj2").value;
	     sSubAdj3 = document.all("txtSubsequentAdj3").value;
	   	
	  	 iRateXML1 = document.all("htxtRateXML1").value;
		 iRateXML2 = document.all("htxtRateXML2").value; 
		 iRateXML3 = document.all("htxtRateXML3").value;
		//alert ('Rates -> \n1: ' + iRateXML1 + '\n2: ' + iRateXML2 + '\n 3: ' + iRateXML3)
		iBeginY1 = document.all("ddlbeginY1").value;
		iEndY1 = document.all("ddlendY1").value;
		iBeginM1 = document.all("ddlbeginM1").value;
		iEndM1 = document.all("ddlendM1").value;
				
	//	alert("ending year 1 " + iEndY1);
						
		iBeginY2 = document.all("ddlbeginY2").value;
		iEndY2 = document.all("ddlendY2").value;
		iBeginM2 = document.all("ddlbeginM2").value;
		iEndM2 = document.all("ddlendM2").value;
						
		iBeginY3 = document.all("ddlbeginY3").value;
		iEndY3 = document.all("ddlendY3").value;
		iBeginM3 = document.all("ddlbeginM3").value;
		iEndM3 = document.all("ddlendM3").value;
			
		setCompareDisplay();
		document.all("divfootnotes").style.visibility = "hidden";
				
		
		for (i=0; i<3; i++)
		{
			iIndex = i + 1;
				
		// reformat to match the default value set in this application
			if (sSubAdj1 == "0")
			{
				sSubAdj1 = "0.000";
			}
			if (sSubAdj2 == "0")
			{
				sSubAdj2 = "0.000";
			}
			if (sSubAdj3 == "0")
			{
				sSubAdj3 = "0.000";
			}
		
		
		
			nLoanAmount = new Number(sfStripComma(document.all(m_strLoanAmountNames[i]).value))
			setLoanType(nLoanAmount, iIndex);
					
			// if users selects back browser, load with this value
			// if users select save session/retrieves, use the subqintrate value
			// this is loaded with the data that the users entered and saved
			if (document.all("txtsubqintrate1").value == "")
			{
				iAdjRate1 = document.all("txtInitAdjRate1").value;
				iAdjRate2 = document.all("txtInitAdjRate2").value;
				iAdjRate3 = document.all("txtInitAdjRate3").value;
			}
			else
			{
				iAdjRate1 = document.all("txtsubqintrate1").value ;
				iAdjRate2 = document.all("txtsubqintrate2").value ;
				iAdjRate3 = document.all("txtsubqintrate3").value ;
			}
			//alert("iAdjRate " + iAdjRate1);
			//alert('test -> ' + document.all("ddlproductindex" + iIndex.toString()).value);
				
			if (document.all("ddlproductindex" + iIndex.toString()).value != "")
			{
			//alert('test -> ' + document.all("ddlproductindex" + iIndex.toString()).value);
				
				document.all(m_strProductDropDownNames[i]).selectedIndex = document.all("ddlproductindex" + iIndex.toString()).value;
				document.all(m_strDPPercentNames[i]).value = document.all("txtdownpercent" + iIndex.toString()).value;
			
			}
			
		
			// this has to happen either when the postback occurs and product is 
			// selected,or save session (no login required (since user already logged in)
			// this logic has to happen in both cases.
			// add this special flag to signify user already logged in, but need to re-load
			// the rates , pricing info, etc
		
			if(document.all(m_strProductDropDownNames[i]).selectedIndex > 0)
			{
				//alert('before');
				refreshPricing(iIndex);
				//alert('ghere');
			
				nSelectedIndex = new Number(document.all(m_strSelectedRateIndexes[i]).value);
				//alert('nSelectedIndex1 -> ' + nSelectedIndex);
				nSelectedIndex = new Number(document.all("ddlintrate" + iIndex.toString()).value);
				//alert('nSelectedIndex2 -> ' + nSelectedIndex);
				document.all(m_strRateDropDownNames[i]).selectedIndex = nSelectedIndex.valueOf();
				
				var objRateDropDown = document.all(m_strRateDropDownNames[i]);
			
		    	// use amt of adjustment field - not init adj rate field
				//alert('iIndex -> ' + iIndex)
				
				switch (iIndex)
				{
							case 1:
									sSubAdj = sSubAdj1;
									break;
									
							case 2:
									sSubAdj = sSubAdj2;
									break;
							case 3:
									sSubAdj = sSubAdj3;
									break;		
				}
			
					if (sSubAdj != "0.000")
					{
				// open check box area for rate adjustments
						var sControlID = "divPerRateControls" + iIndex.toString();
						document.all(sControlID).style.visibility = "visible";
						m_strPerRateVisibility[iIndex - 1] = "visible";
						toggleInitialAdjRate(true, i.valueOf());
						document.all("chkPerRate" + iIndex).checked =true;
						document.all("chkPerRate" + iIndex).disabled = false;
						nSelectedIndex = new Number(document.all("ddldirection" + iIndex.toString()).value);
						document.all("ddlAdjDirection"+ iIndex.toString()).selectedIndex = nSelectedIndex.valueOf();
						nSelectedIndex = new Number(document.all("ddlfrequency" + iIndex.toString()).value);
						document.all("ddlAdjFrequency"+ iIndex.toString()).selectedIndex = nSelectedIndex.valueOf();
						
					}
			
		
		    		setArmInputDisplay(iIndex,getAmortType(iIndex));
				// if the above function, it seems to be resetting the months, so set the 
				// index of the begin/end months after this routine
					//alert('sSubAdj -> ' + sSubAdj);
					if (sSubAdj != "0.000")
					{
					
					// reload the month/year indexes to the retained values not the default
					   switch (iIndex)
				       {
						case 1:
								 document.all("ddlbeginY"+ iIndex.toString()).value = iBeginY1;
								 document.all("ddlendY"+ iIndex.toString()).value = iEndY1 ;
								 document.all("ddlbeginM"+ iIndex.toString()).value = iBeginM1;
								 document.all("ddlendM"+ iIndex.toString()).value = iEndM1;
	
								break;
						case 2:
								document.all("ddlbeginY"+ iIndex.toString()).value =iBeginY2  ;
								document.all("ddlendY"+ iIndex.toString()).value = iEndY2 ;
							    document.all("ddlbeginM"+ iIndex.toString()).value = iBeginM2 ;
								 document.all("ddlendM"+ iIndex.toString()).value = iEndM2 ;
	
								break;
						case 3:
								document.all("ddlbeginY"+ iIndex.toString()).value = iBeginY3 ;
							    document.all("ddlendY"+ iIndex.toString()).value = iEndY3 ;
								document.all("ddlbeginM"+ iIndex.toString()).value = iBeginM3 ;
								document.all("ddlendM"+ iIndex.toString()).value = iEndM3;
	
								break;
			         	}
					
				        nSelectedIndex = new Number(document.all("ddlendY" + iIndex.toString()).value);
						document.all("ddlEndPeriodYear"+ iIndex.toString()).selectedIndex = nSelectedIndex.valueOf();
			//	alert("ending year " + nSelectedIndex);
						nSelectedIndex = new Number(document.all("ddlbeginY" + iIndex.toString()).value);
						document.all("ddlBeginPeriodYear"+ iIndex.toString()).selectedIndex = nSelectedIndex.valueOf();
					//	alert("beginning year " + nSelectedIndex);
					  	// reload begin months only	- pass the begin year index to this function	
						//BodyOnload_beginmonthreset(iIndex,nSelectedIndex)     
						
					    nSelectedIndex = new Number(document.all("ddlbeginM" + iIndex.toString()).value);
						document.all("ddlBeginPeriodMonths"+ iIndex.toString()).selectedIndex = nSelectedIndex.valueOf();
						nSelectedIndex = new Number(document.all("ddlendM" + iIndex.toString()).value);
						document.all("ddlEndPeriodMonths"+ iIndex.toString()).selectedIndex = nSelectedIndex.valueOf();
			// recalculate begin/ending period to reflect the years/months that the user has choosen/saved
				        //calculate_beginend_periods(iIndex)
				 					    		
				}
			   	document.all("txtSubsequentAdj1").value = sSubAdj1;
			   	document.all("txtSubsequentAdj2").value = sSubAdj2;
			   	document.all("txtSubsequentAdj3").value = sSubAdj3;

			    document.all("txtInitAdjRate1").value= iAdjRate1;
				document.all("txtInitAdjRate2").value= iAdjRate2;
				document.all("txtInitAdjRate3").value= iAdjRate3;
				
				document.all("htxtRateXML1").value= iRateXML1;
				document.all("htxtRateXML2").value= iRateXML2;
				document.all("htxtRateXML3").value= iRateXML3;
		
				//alert ("rate chaged to " + iRateXML2)
				
				// clear and reset this value
				document.all("ddlproductindex" + iIndex.toString()).value = ""
				
			}
		}


	}
	
	function btnViewDisclosure_OnSubmit()
	{
		var b = doSubmitValidations();
		
		//if passes validation		
		if (b == m_iOk.valueOf()){
			document.all("htxtCommand").value="viewdisclosures";
			document.all("frmProductCalc").submit();		
		}
	
	}
	
	
	
	function BodyOnload_beginmonthreset(iControlIndex,nBeginYearIndex)
	{
	
		//this function is called from the body onload - if the years
		// was changed, then the months could have 1st/7th displayed, not
		// just the 7th month to start.
		// if annual, then all months would have been displayed
		
		// this routine determines the beginning year, and resets the months
		// drop down to what it was, then we can select the month that was
		//choosen
			var obj = document.all("ddlBeginPeriodYear"+ iControlIndex.toString());

			// user changed the begin year, need to adjust the months 
			// according to the frequency.
	
			var iFrequency = document.all("ddlAdjFrequency" + iControlIndex.toString())
			var iStartMonth ;
			var strProductType;
			var iBeginYear;
		 		  
		   // pull out the year that is chosen, based on the year,
		   // and product types, certain months will not be displayed
		// var ddlBobj = document.all("ddlBeginPeriodYear"+ iControlIndex.toString());
 	   //alert('test' + obj.options[obj.selectedIndex].value)
 	    iBeginYear= obj.options[obj.selectedIndex].value;
 	   // alert("ibegin Year " + iBeginYear);
 	    
	// clear out begin months drop down
		    var objPeriodMonthDropDown =  document.all("ddlBeginPeriodMonths"  + iControlIndex.toString());
			while  (objPeriodMonthDropDown.options.length > 0) 
			 {
				   removeAllOptions(objPeriodMonthDropDown);
	             
			 }
	
			if (isPrimeFirstProduct(iControlIndex))
			{
// need to determine if it is 1 month or 6 month.
// write out the months  - the beginning is either 2 or 7
 						var strProductCode;
						strProductType = "PF";
						strProductCode = getProductCode(iControlIndex);
						if ((strProductCode == "771") || (strProductCode == "780"))
						{
								if (nBeginYearIndex==0)
								{
								// start at month 2
									iStartMonth=1;
								}
								else
								{
								// display all months
									iStartMonth=0;
								}
							     ifrequency=0;
						}
						else if (strProductCode == "781")
						{
							if (nBeginYearIndex==0)
								{
								// start at month 4
									iStartMonth=3;
								}
								else
								{
								// display all months(1st/7th)
									iStartMonth=0;
								}	
								ifrequency=3;					
						}
						
						else
						{
							  if (nBeginYearIndex==0)
								{
								// start at month 7
									iStartMonth=6;
								}
								else
								{
								// display all months(1st/7th)
									iStartMonth=0;
								}
						    
						     ifrequency=1;
						}
			}	
			
			// if equity access product
		if (isEquityAccessARMProduct(iControlIndex))
		{
					strProductType = "EQ";
		           if (nBeginYearIndex==0)
					{
								// start at month 2
									iStartMonth=1;
					}
				  else
					{
								// display all months
									iStartMonth=0;
					}
				ifrequency=0;
		}
		
		// determine blended rate start periods/end periods
		
		if (isBlendedRateProduct(iControlIndex) || isFixedAdjProduct(iControlIndex))
		{
		//Adding 1-month blended rate product TM 18280 
			strProductCode = getProductCode(iControlIndex);
			switch (strProductCode.toString())
			{    
			case "791":  
			case "793":
			case "795":
				if (nBeginYearIndex==0)
				{
				// start at month 2
					iStartMonth=1;
				}
				else
				{
				// display all months
					iStartMonth=0;
				}
					ifrequency=0;
				break;				
			
			default:
				{ 
					// this is semi annual,, start at month 7th for original start
					iStartMonth=6;
					
					if (isBlendedRateProduct(iControlIndex))
					{
						strProductType = strProductCode;
					}
					else
					{
						strProductType = "XX";
					}
					// if another year chosen, start at month one.
					if (nBeginYearIndex != 0)
					{
						iStartMonth=0;
					}
					ifrequency=1;
				}
			}

		} 


			
			// reload begin months			ok
	   loadmonths(ifrequency,iStartMonth,objPeriodMonthDropDown,strProductType,iBeginYear)
			

			
	}
	
		
	function btnnewsession_OnSubmit()
	{
	// this will force a postback, and we can test onthe value
	// to determine which image button was clicked
	
	if (confirm('Are you sure you want to clear the existing Session?'))
	  {	
	      document.all("htxtCommand").value="newsession";
		  document.all("frmProductCalc").submit();
	  }
	}
	
	
	
	
	function btnretrievesession_OnSubmit()
	{
	// this will force a postback, and we can test onthe value
	// to determine which image button was clicked
	     document.all("htxtCommand").value="retrievesession";
		  document.all("frmProductCalc").submit();
	}
	
	function btnsavesession_OnSubmit()
	{
		//TM20924
		var b = doSubmitValidations();
		
		// BEFORE CALLING this,, make sure products have been selected
		  if(document.all(m_strProductDropDownNames[0]).selectedIndex > 0 && document.all(m_strProductDropDownNames[1]).selectedIndex > 0) 
		  {
		
		  	if (b == m_iOk.valueOf())
		  	{
				document.all("htxtCommand").value="savesession";
				document.all("frmProductCalc").submit();
		    }
		  }
		  else
		  {
		 
		  alert('Enter property value, holding period and select products before saving this session');
		
		 }
	}
	
	function btnCompare_OnSubmit()
	{
	
		var b = doSubmitValidations();
		//alert(b + ' ' + m_iOk.valueOf());
		//if passes validation		
		if (b == m_iOk.valueOf()){
			document.all("htxtCommand").value="compare";
			document.all("frmProductCalc").submit();
			//alert("post back");
		}
		else {
			//alert("no post back");
			//preparation for returning control to user
		}
		
		return false;
	}


	function changeadjrate(obj)
	{

			var iControlIndex = getControlIndex(obj).valueOf();
	  	  
			document.all("txtInitAdjRate" + iControlIndex.toString()).value = obj.value;
	}
	
	
	
	//PCTUP00316186 change method of exclusion...
	/*
	//TM22181
	function adjustProductOptions(i)
	{
		var nLoanAmount = new Number(sfStripComma(document.all[m_strLoanAmountNames[i-1]].value));
		var obj = getProductDropDown(i);
		
		if(isNonConforming(nLoanAmount))
		{
			removeProductOptions(obj);
		}
		else
		{
			restoreProductOptions(obj);
		}
		
		return;
	}
	
	//TM22181
	function removeProductOptions(obj)
	{
		var arrIndexes = getExclusionIndexes(obj);
		var strValues;
		var arrValues;

		for (var i = 0; i < arrIndexes.length; i++)
		{
			if (obj.options[arrIndexes[i]].text != "Not Available")
			{
				//get the current value/pair string of the option
				strValues = new String(obj.options[arrIndexes[i]].value);
				
				//concatenate the current text string of the option and reassign to the option's value
				obj.options[arrIndexes[i]].value = strValues.concat(",XT:", obj.options[arrIndexes[i]].text);
				
				//set the new text string
				obj.options[arrIndexes[i]].text = "Not Available";
			}
		}
	}
	
	//TM22181
	function restoreProductOptions(obj)
	{

		var arrIndexes = getExclusionIndexes(obj);
		var strValues;
		var arrValues;
		var strText;
		var arrText;

		for (var i = 0; i < arrIndexes.length; i++)
		{
			if (obj.options[arrIndexes[i]].text == "Not Available")
			{
				//get the current value/pair string of the option
				strValues = new String(obj.options[arrIndexes[i]].value);
				arrValues = strValues.split(",");
				
				//get the old text string (last element in values array, which is simultaneously removed)
				strText = arrValues.pop();
				arrText = strText.split(":");
				
				//restore the old text string
				obj.options[arrIndexes[i]].text = arrText[1];
				
				//restore the old value/pair string to the option
				obj.options[arrIndexes[i]].value = arrValues.join(",");
			}
		}
	}
	
	//TM22181
	function getExclusionIndexes(obj)
	{
		var arrExcludedIndexes = new Array();
		
		var strValues;
		var arrValues;
		
		var strExcludedProducts = new String(document.all["htxtExclusions"].value);
		var arrExcludedProducts = strExcludedProducts.split(",");
		
		var strProd;
		var arrProd;
		
		var strProdId;
		
		var iLength = obj.options.length;
		var i = 0;
		
		for (i = 0; i < iLength; i++)
		{
			strValues = new String(obj.options[i].value);
			arrValues = strValues.split(",");
			
			strProd = new String(arrValues[2]);
			arrProd = strProd.split(":");
			
			strProdId = new String(arrProd[1]);
			
			if(strExcludedProducts.indexOf(strProdId) > -1)
			{
				arrExcludedIndexes.push(i);
			}
		}	
		
		return arrExcludedIndexes;	
		
	}
	*/
	function checkRequiredFields(i)
	{
		//alert("checkRequiredFields");
		//if (validateLoanAmount(i)) {
			
			//PCTUP00316186 change method of exclusion
			//TM22181
			//adjustProductOptions(i);		
		
			if (isValidPropertyValue(document.all("txtPropertyValue")))	
			  {
				if (isValidHoldingPeriod(document.all("txtHoldingPeriod")))
				{
			    	isValidInvestmentROR(document.all("txtInvestmentROR"));
			    				    	
				}
			}
		//}
		return;
	}
	
	function clearErrorFocus(obj)
	{
		//alert("clearErrorFocus(" + obj.id + ")");
		if (obj.style != null){ 	
			obj.style.borderColor="white";
			deleteError(obj.id);
		}
	}
	
	

	
	
	// this function is not being used now.
	
	function decreaseDPPCT(i)
	{
		//alert("decrease");
		var sDPP;
		var nDPP = new Number(sfStripPercent(document.all[m_strDPPercentNames[i-1]].value));
		//minimum limited to 0%
		if ((nDPP.valueOf() - m_dIncrement) < 0)
		{
			nDPP = 0;
		}
		else
		{
			nDPP -= m_dIncrement.valueOf();
		}
		sDPP = round(nDPP, 3).toString()
		document.all[m_strDPPercentNames[i-1]].value = sDPP.toString() + "%";
		updateDPDolFromPCT(i);
		
	   var objdownpayment= document.all["txtPercentDownPayment" + i.toString()];
		
		objdownpayment.focus();
		
	}
	
	// this function has been commented out, not called
	function doDialog(strName,iW,iH,TOP,LEFT,R,S,SC,T,TB,URL,TYPE,dArg)
	{
		if (TYPE=="modal" || TYPE=="modalIframe")
		{
			var sF=""
			var _rv
			
			sF+=T?'unadorned:'+T+';':'';
			sF+=TB?'help:'+TB+';':'';
			sF+=S?'status:'+S+';':'';
			sF+=SC?'scroll:'+SC+';':'';
			sF+=R?'resizable:'+R+';':'';
			sF+=iW?'dialogWidth:'+iW+'px;':'';
			sF+=iH?'dialogHeight:'+iH+'px;':'';
			sF+=TOP?'dialogTop:'+TOP+'px;':'';
			sF+=LEFT?'dialogLeft:'+LEFT+'px;':'';
			
			if(TYPE=="modal")
				_rv=window.showModalDialog(URL+"&r="+Math.round(Math.random()*1000000),dArg?dArg:"",sF);
			else
			{
				var da=new Object()
				da.w=iW;
				da.h=iH;
				da.url=URL;
				_rv=window.showModalDialog(URL+"&r="+Math.round(Math.random()*1000000),da,sF);
			}
			// _rv = 1 - then do nothing , this was closing the form and not requiring any user action
			
			// _rv= 0 = user has read the disclosures - display results page
			
			
			if ("undefined" != typeof(_rv) ){
				return _rv;
			}
		}
		else
		{
			var sF=""
			sF += iW?'width='+iW+',':'';
			sF+=iH?'height='+iH+',':'';
			sF+=R?'resizable='+R+',':'';
			sF+=S?'status='+S+',':'';
			sF+=SC?'scrollbars='+SC+',':'';
			sF+=T?'titlebar='+T+',':'';
			sF+=TB?'toolbar='+TB+',':'';
			sF+=TB?'menubar='+TB+',':'';
			sF+=TOP?'top='+TOP+',':'';
			sF+=LEFT?'left='+LEFT+',':'';
			var HMW=window.open(URL?URL:'about:blank',strName?strName:'',sF);
			if ( (document.window != null) && (!HMW.opener) )
				HMW.opener=document.window;
			HMW.focus();
		}
	}

	function doSubmitValidations()
	{
		//alert("doSubmitValidations()");

		var nCount = getCompareCount();
		
		for (i=1;i<=nCount;i++)
		{
			var objFrequency = document.all("ddlAdjFrequency" + i)
			document.getElementById("ddlfrequency" + i).value = objFrequency(objFrequency.selectedIndex).value
			//alert ('hidden ddlfrequency' + i + ' -> ' + document.all("ddlfrequency" + i).value)
			
		}

		//Add the selected frequency to the 
		if (validateProductSelection())
		{
		
		// if all validations are good, return this so a postback will occur.
		// the postback will call the results page - where the loan disclosures
		// page will be displayed   B.Harris
		      return m_iOk.valueOf();
		
		}
		else
		{
		  
			return m_iCancel.valueOf();
		}
		

	}
	
	
	function down_percent(i)
	{
			var nDPP = document.all("txtPercentDownPayment"+ i).value;
			nDPP = parseInt(nDPP) - parseInt(m_dIncrement.valueOf());
		
			if (nDPP < 0)
			{
				nDPP = 0;
			}
			
			sDPP = round(nDPP, 3).toString()
		    document.all("txtPercentDownPayment" + i).value = sDPP;
		    document.all[m_strDPPercentNames[i-1]].value = sDPP;
			updateDPDolFromPCT(i);
		
	}
	
	
	
	
	
	//Indexes of ddlProducts item name/value pairs
	//0 - P:#PCID#
	//1 - C:#CONFORMING_ID#
	//2 - N:#NON_CONFORMING_ID#
	//3 - A:#AMORT_TYPE#
	//4 - T:#CATEGORY#
	//5 - IAP:#INIT_ADJ_PER#
	//6 - SAP:#SUB_ADJ_PER#
	
	
	
	
	function getAmortType(iControlIndex)
	{
		//alert("getAmortType(" + iIndex + ")");
		var nAmortType;
		var obj = getProductDropDown(iControlIndex);
		
		if (obj.selectedIndex > 0)
		{
			var arrValues = obj.options[obj.selectedIndex].value.split(",");
			nAmortType = new Number(arrValues[3].substr(2));
		}
		else
		{
			nAmortType = new Number(nAmortFixed.valueOf());
		}

		return nAmortType;
	}
	function getCategory(iControlIndex)
	{
		
		var obj = getProductDropDown(iControlIndex);
		var strCategory;
		
		if (obj.selectedIndex > 0)
		{
			var arrValues = obj.options[obj.selectedIndex].value.split(",");
			strCategory = new String(arrValues[4].substr(2));
			
			//alert("getCategory(" + iControlIndex + ")" + "strCategory.valueOf() -> " + strCategory.valueOf() + ")");
			return strCategory.valueOf();
			
		}
		
		return "";
	}					
	
	function getCompareCount()
	{
		var nCount;
		for (i=1; i<4; i++)
		{
			if (document.frmProductCalc.rblCompareCount[i-1].checked){
				nCount = new Number(document.frmProductCalc.rblCompareCount[i-1].value);
				break;	
			}
		}
		return nCount;
	}	
	
	function getControlIndex(obj)
	{
		return new Number(obj.id.substr(obj.id.length - 1));
	}
	function getCoordinates()
	{
		var sControlID = document.all("selDivName").value;
		//alert("getCoordinates(" + sControlID + ")");
				
		var objStyle = document.all(sControlID).style;
		var sCoords = "top: " + objStyle.top + " left: " + objStyle.left + " height: " + objStyle.posHeight + " width: " + objStyle.posWidth;
	//	alert(sCoords);
	}
	function getCurrentLoanType(iControlIndex)
	{
	    //alert("loantypes get current loan type " + m_iCurrentLoanTypes[iControlIndex-1]);
		return new Number(m_iCurrentLoanTypes[iControlIndex-1]).valueOf();
	}
	function getInitAdjPeriod(iControlIndex)
	{
		//alert("getInitAdjPeriod(" + iControlIndex + ")");
		var obj = getProductDropDown(iControlIndex);
		var nIAP;
		
		if (obj.selectedIndex > 0)
		{
			
			var arrValues = obj.options[obj.selectedIndex].value.split(",");
		  //   alert(arrValues);
			nIAP = new Number(arrValues[5].substr(4));
			//alert(nIAP);
		}
		
		return nIAP.valueOf();
	}
	
	function getLoanTerm(xmlRate)
	{
		var nNonAmortTerm;
		var nAmortTerm;
		var nLoanTerm;
		try
		{
			nNonAmortTerm = new Number(xmlRate.selectSingleNode("@NonAmortTerm").text);
			nAmortTerm = new Number(xmlRate.selectSingleNode("@AmortTerm").text);
			
		}
		catch (e)
		{
			//alert("getLoanterm " + xmlRate);
			nNonAmortTerm = new Number(0);
			nAmortTerm = new Number(xmlRate.selectSingleNode("@AmortTerm").text);
		}
		finally
		{
			nLoanTerm = new Number(nNonAmortTerm.valueOf() + nAmortTerm.valueOf());
		}
		
		return nLoanTerm;
	}
	
	function getNonAmortTerm(iControlIndex)
	{
		//alert("getNonAmortTerm(" + iControlIndex + ")");
		
		var objRateDropDown = document.all(m_strRateDropDownNames[iControlIndex -1]);
		
		 var strID;
		 // when user hits back, this dropdown is not loaded, recreate it
		try
		{
		      strID = objRateDropDown.options[objRateDropDown.selectedIndex].value;
		}
		catch (e)
		{
			
			refreshPricing(iControlIndex);	
	
			nSelectedIndex = new Number(document.all(m_strSelectedRateIndexes[i]).value);
			document.all(m_strRateDropDownNames[i]).selectedIndex = nSelectedIndex.valueOf();
			strID = objRateDropDown.options[objRateDropDown.selectedIndex].value;
		
		}
		
		
		var strXPath = "NewDataSet/tblMLCCInternetRates[@ID='" + strID + "']";
				
		var xmlRates = document.all("xmlRates").XMLDocument;
		var xmlRateNode = xmlRates.selectSingleNode(strXPath);
			
	
		var nNonAmortTerm;
		try
		{
			 nNonAmortTerm = new Number(xmlRateNode.selectSingleNode("@NonAmortTerm").text);
			
		}
		catch (e)
		{
			alert(e);
			nNonAmortTerm = new Number(0);
		
		}
			
		return nNonAmortTerm;
	
	}
	function getProductCode(iControlIndex)
	{
		//alert("getProductCode(" + iControlIndex + ")");
		var strProductCode = "";
		var obj = getProductDropDown(iControlIndex);
		var iLoanType = getCurrentLoanType(iControlIndex);
		// we need to reset the loan type, set back to zero when user 
		// hits the back on the IE browser
		//alert('iLoanType' + iLoanType)
		if (iLoanType == 0) 
		{
			var nLA = new Number(sfStripComma(document.all[m_strLoanAmountNames[iControlIndex-1]].value));
			
		  	setLoanType(nLA, iControlIndex);
		   iLoanType = getCurrentLoanType(iControlIndex);
		}
		
		//alert("loan type " + iLoanType);
		//alert(obj.selectedIndex);
	
		
		if (obj.selectedIndex > 0)
		{
			var arrValues = obj.options[obj.selectedIndex].value.split(",");
			//alert(arrValues);
		
			strProductCode = new String(arrValues[iLoanType].substr(2));
				//alert("Product code " + strProductCode);
					// no corresponding code, use loantype=1
			if (strProductCode == "NA")
			{
				strProductCode = new String(arrValues[1].substr(2));
				
			}
		}
		return strProductCode;
	}
	
	function getProductDropDown(iControlIndex)
	{
		return document.all(m_strProductDropDownNames[iControlIndex-1]);
	}
	
	function getProductName(iControlIndex)
	{
		var obj = getProductDropDown(iControlIndex);
		return obj.options[obj.selectedIndex].text;
	}
	
	function getSubAdjPeriod(iControlIndex)
	{
		//alert("getSubAdjPeriod(" + iControlIndex + ")");
		var obj = getProductDropDown(iControlIndex);
		
		var nSAP;
		
		if (obj.selectedIndex > 0)
		{
			var arrValues = obj.options[obj.selectedIndex].value.split(",");
			nSAP = new Number(arrValues[6].substr(4));
		}
		
		
		return nSAP.valueOf();
	}	
	function handleInvalidLoanAmount(i)
	{
	//	alert("handleisvalidloanamount");
			var bChoice;
		if ((strproductcode == "H70") || (strproductcode == "H72") || (strproductcode == "S21") || (strproductcode == "S22") || (strproductcode == "H20") || (strproductcode == "H23"))
			var sMessage = "The " + m_strOrdinalNames[i-1] + " Loan Amount is more than $2 million. For Home Equity Lines of Credit we are able to offer loans up to $2 million on our Web site. Loans over $2 million for Home Equity Lines of Credit require special handling.  Please contact us for more information. Please <a href='/public/tools/contactus.asp'>contact us</a> for more information."
		else
			var sMessage = "The " + m_strOrdinalNames[i-1] + " Loan Amount is more than $3 million. We are able to offer loans up to $3 million \n on our Web site. Loans over $3 million require special handling. Please <a href='/public/tools/contactus.asp'>contact us</a> for more information."
							
			// \n \n If you would like to pursue this loan, please contact Merrill Lynch Credit Corporation. \n\nOtherwise, try to bring the Loan Amount under $3 million.\n\nClick 'OK' to try adjusting your Down Payment criteria.\nClick 'Cancel' to adjust the amount in the Property Value field.";

		//	bChoice = new Boolean(confirm(sMessage));
		//	if (bChoice.valueOf() == true) {
		//		document.all[m_strDPPercentNames[i-1]].focus();
		//	}
		//	else {
		//		document.all["txtPropertyValue"].focus();
		//	}
			
			//setErrorFocus(obj, sMessage)
	}
	
	
	// not being used 
	function increaseDPPCT(i)
	{
		//alert("increase");
		var sDPP;
		var nDPP = new Number(sfStripPercent(document.all[m_strDPPercentNames[i-1]].value));
		//maximum limited to 100%
		if ((nDPP.valueOf() + m_dIncrement) > 100)
		{
			nDPP = 100;
		}
		else
		{
			nDPP += m_dIncrement.valueOf();
		}
		sDPP = round(nDPP, 3).toString()
		document.all[m_strDPPercentNames[i-1]].value = sDPP.toString() + "%";
		updateDPDolFromPCT(i);
		var objdownpayment= document.all["txtPercentDownPayment" + i.toString()];
		
		objdownpayment.focus();
	}
	
	  
	function isInterestOnlyProduct(iControlIndex)
	{
		//alert ("isInterestOnlyProduct(" + iControlIndex + ")");
		
		var strCategory = getCategory(iControlIndex);
		
		var i = 0;
		var bRet = new Boolean(false);
		
		if(strCategory == m_strInterestOnlyProducts.valueOf())
		{
			bRet = new Boolean(true);
		}

		return bRet.valueOf();
	}
	
	function isEquityAccessFIXEDProduct(iControlIndex)
	{
		//alert ("isBlendedRateProduct(" + iControlIndex + ")");
		
		var strCategory = getCategory(iControlIndex);
		
		var i = 0;
		var bRet = new Boolean(false);
		
		if(strCategory == m_strEquityAccessFIXEDProducts.valueOf())
		{
			bRet = new Boolean(true);
		}

		return bRet.valueOf();
	}
	
	function isBlendedRateProduct(iControlIndex)
	{
		//alert ("isBlendedRateProduct(" + iControlIndex + ")");
		
		var strCategory = getCategory(iControlIndex);
		
		var i = 0;
		var bRet = new Boolean(false);
		
		if(strCategory == m_strBlendedRateProducts.valueOf())
		{
			bRet = new Boolean(true);
		}

		return bRet.valueOf();
	}
	
	function isFixedAdjProduct(iControlIndex)
	{
		//alert ("isBlendedRateProduct(" + iControlIndex + ")");
		
		var strCategory = getCategory(iControlIndex);
		
		var i = 0;
		var bRet = new Boolean(false);
		
		if(strCategory == m_strFIXEDAdjProducts.valueOf())
		{
			bRet = new Boolean(true);
		}

		return bRet.valueOf();
	}
	
	
	
	function isPrimeFirstProduct(iControlIndex)
	{
		//alert ("isPrimeFirstProduct(" + iControlIndex + ")");
		m_strEquityAccessARMProducts
		var strCategory = getCategory(iControlIndex);
		
		var i = 0;
		var bRet = new Boolean(false);
		
		if(strCategory == m_strPrimeFirstProducts.valueOf())
		{
			bRet = new Boolean(true);
		}

		return bRet.valueOf();
	}
	function isEquityAccessARMProduct(iControlIndex)
	{
		//alert ("isEquityAccessARMProduct(" + iControlIndex + ")");
		
		var strCategory = getCategory(iControlIndex);
		
		var i = 0;
		var bRet = new Boolean(false);
		
		if(strCategory == m_strEquityAccessARMProducts.valueOf())
		{
			bRet = new Boolean(true);
		}

		return bRet.valueOf();
	}


	function isNewLoanType(nLoanAmount, iIndex){
		
	//	alert("isNewLoanType(" + nLoanAmount.toString() + "," + iIndex.toString() + ")");
		//alert("m_iloantypenone " + m_iLoanTypeNone.valueOf());
		
		
		var bReturn; 
		//alert("index in isnewloantype " + iIndex);
		var iLoanType = getCurrentLoanType(iIndex);
		//alert("iLoanType  is new loantype :" + iLoanType.toString());
					
		if (iLoanType.valueOf() == m_iLoanTypeNone.valueOf()){
	
			bReturn = new Boolean(false);
		}
		else
		{
			if (isNonConforming(nLoanAmount)){
			// if the loan amount crosses the tiers, then set this value
			// to true, so will refresh the pricing. - must be non conforming type
				if  (iLoanType.valueOf() == m_iLoanTypeNonConforming.valueOf())
				{
					return true;
				}
				else
				{
				   bReturn = new Boolean((iLoanType.valueOf() != m_iLoanTypeNonConforming.valueOf())); 
				}
			}
			else {
				bReturn = new Boolean((iLoanType.valueOf() != m_iLoanTypeConforming.valueOf()));
			}
		}
		//alert("Return isloantype " + bReturn.valueOf());
		return bReturn.valueOf();
	}
	function isNonConforming(nLoanAmount){
		//alert("isNonConforming(" + nLoanAmount.toString() + ")");
		
		nConformingThreshold = new Number(document.all["htxtConformingThreshold"].value);
		//alert("nConformingThreshold: " + nConformingThreshold.toString());
		
		return (nLoanAmount.valueOf() > nConformingThreshold.valueOf());
	}
	function isValidHoldingPeriod(obj)
	{
		var nHP = new Number(obj.value);
		//must be a number
		if (!isNaN(nHP))
		{
			//check for upper limit
			if (nHP.valueOf() > m_dHPLimit.valueOf())
			{
				setErrorFocus(obj,'Enter a Holding Period between 1 and 40 Years. (The holding period tells us how long you plan to live in the subject property and "Hold" the mortgage. All results are calculated to the end of the holding period.)');
				
				return false;
			}
			else
			{
				//check for lower limit
				if (nHP.valueOf() < 0)
				{
					setErrorFocus(obj,'Enter a Holding Period between 1 and 40 Years. (The holding period tells us how long you plan to live in the subject property and "Hold" the mortgage. All results are calculated to the end of the holding period.)');
					return false;
				}
				else
				{
					if (nHP.valueOf() == 0)
					{
						setErrorFocus(obj,'Enter a Holding Period between 1 and 40 Years. (The holding period tells us how long you plan to live in the subject property and "Hold" the mortgage. All results are calculated to the end of the holding period.)');
						return false;
					}
					else
					{
						clearErrorFocus(obj);
						return true;
					}
				}
			}
		}
		else
		{
			setErrorFocus(obj,'Enter a Holding Period between 1 and 40 Years. (The holding period tells us how long you plan to live in the subject property and "Hold" the mortgage. All results are calculated to the end of the holding period.)');
			obj.value="";
			return false;
		}
	}
	function isValidInvestmentROR(obj){
	//txtInvestmentROR
	   var nHP = new Number(obj.value);
	 
		//must be a number
		if (!isNaN(nHP))
		{
			//check for upper limit
			if (nHP.valueOf() > 15)
			{
				setErrorFocus(obj, 'Enter an Expected Return on Investments between 0% and 15%. (Use 0% if you do not intend to invest monthly payment savings in an investment vehicle.)');

				return false;
			}
			else
			{
			
		      	clearErrorFocus(obj);
				return true;
			}
		}
		else
		{
				setErrorFocus(obj, 'Enter an Expected Return on Investments between 0% and 15%. (Use 0% if you do not intend to invest monthly payment savings in an investment vehicle.)');
			
			return false;
		}	
	}
	
	function isValidLoanAmount(i)
	{
		//alert("isValidLoanAmount");

		var nLA = new Number(sfStripComma(document.all[m_strLoanAmountNames[i-1]].value));
		//TM 12395
		//H70, H72, S21, S22, S20, S23)
		
		if ((strproductcode == "H70") || (strproductcode == "H72") || (strproductcode == "S21") || (strproductcode == "S22") || (strproductcode == "H20") || (strproductcode == "H23"))
		{
			if ( nLA.valueOf() > m_dEquityloanAmtLimt.valueOf() )
			{
				m_iIndexInError = new Number(i);
				return false;
			}
			else
			{
				m_iIndexInError = new Number(0);
				//return true;
			}
		}
		else
		{
			if ( nLA.valueOf() > m_dLoanAmountLimit.valueOf() )
			{
				m_iIndexInError = new Number(i);
				return false;
			}
			else
			{
				m_iIndexInError = new Number(0);
				//return true;
			}
		}		
		
		var objProductDropDown = document.all(m_strProductDropDownNames[i-1]);
		
		if (isvalidPcLoanAmount(objProductDropDown,i))
		{
						
			return true;
		}
		else
		{
			
			return false;
		}
		
	}
	function isValidPropertyValue(obj)
	{
		var nPV;		
		//check for empty
		if (obj.value == "")
		{
			setErrorFocus(obj,'Please enter a property value');
			return false;
		}
		else
		{
			nPV = new Number(sfStripComma(obj.value));
			//must be a number
			if (!isNaN(nPV))
			{
				if (nPV.valueOf() >= 10000000)
				{
				    	 setErrorFocus(obj, "The maximum Property value/Purchase price must be below $10 million. Properties $10 million and over require special handling. Please contact Merrill Lynch Credit Corporation for more information" );

					 return false;
				}
				if (nPV.valueOf() <= 0)
				{
					setErrorFocus(obj, 'Please enter a positive numeric value for property value.');		
					return false;
				}
				else
				{
					clearErrorFocus(obj);
					return true;
				}
				
			}
			else
			{
				setErrorFocus(obj, 'Please enter a positive numeric value for property value.');		
				return false;
			}
		}//else is not empty
	}
	
	
	function isvalidPcLoanAmount(obj,nControlIndex)
	{
		//alert(" -> " + nControlIndex);
		//alert("isvalidPcLoanAmount(" + obj.id + ", " + nControlIndex.toString() + ")");
		
		//alert("Named Values: " + obj.options[obj.selectedIndex].value + ")");
		// validate loan amount with this product - if any errors
		// display and force the user to re-enter
		var strproductcode;	
		var nLoanAmount; 
		var iLoanObj;
		 var objPC;
		 
				
		var iPurchaseAmt;
		iPurchaseAmt = document.all("txtPropertyValue").value;
		//var obj = getProductDropDown(iControlIndex);
		//var iLoanType = getCurrentLoanType(iControlIndex);
	//	alert("index " + nControlIndex);
		
		if (obj.selectedIndex > 0)
		{
			var arrValues = obj.options[obj.selectedIndex].value.split(",");
		//	alert(arrValues);
			//strproductcode = new String(arrValues[1].substr(2));
			//alert("strproductcode " + strproductcode);
			
			switch (nControlIndex.valueOf())
			{
			case 1:
			   	nLoanAmount = new Number(sfStripComma(document.all(m_strLoanAmountNames[0]).value));
				 iLoanObj =  document.all("txtLoanAmount1");
				break;
			case 2:
				nLoanAmount = sfStripComma(document.all(m_strLoanAmountNames[1]).value);
				  iLoanObj =  document.all("txtLoanAmount2");
				break;
			case 3:
				nLoanAmount = sfStripComma(document.all(m_strLoanAmountNames[2]).value);
				 iLoanObj =  document.all("txtLoanAmount3");
				break;
			}
			
			//PCTUP00316186
			//we don't know what the product is until we know how big the loan is (conforming vs. non-conforming)
			if (isNonConforming(nLoanAmount))
			{
				strproductcode = new String(arrValues[2].substr(2));
			}
			else
			{
				strproductcode = new String(arrValues[1].substr(2));
			}
			
			
			// 10 yr fixed product not available for loans greater than 333,700.
			// display error on loan amount field		
		  
		    objPC = document.all(m_strProductDropDownNames[nControlIndex-1]);
			strProductName = objPC.options[objPC.selectedIndex].text;
			//alert("product code " + strproductcode);
			
			/* ------------------------------------------------------------------------------------------ 
			 * Commented by AR 11/23 as per change requests
			 */	
			/*
			if (strproductcode == "110" && nLoanAmount > 333700)
			{
				setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts above $333,700." );
				return false;
			}	 
			*/
			/* ------------------------------------------------------------------------------------------ 
			 * Commented by AR 12/05 as per change requests
			 */	
			// 40 yr fixed product not available for loans greater than 417,000.
			// display error on loan amount field
			
			//PCTUP00347206
			if (strproductcode == "510" && nLoanAmount > 417000)
			{
				setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts above $417,000. Please select another product." );
				return false;
			}	 

			//PCTUP00316186 restores this functionality
			//TM22181 replaces this functionality...
			if (strproductcode == "520" && nLoanAmount > 417000)
			{
				setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts above $417,000. Please select another product." );
				return false;
			}	 			
			if (strproductcode == "535" && nLoanAmount > 417000)
			{
				setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts above $417,000. Please select another product." );
				return false;
			}	 			
			if (strproductcode == "542" && nLoanAmount > 417000)
			{
				setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts above $417,000. Please select another product." );
				return false;
			}	 
			
			/* ------------------------------------------------------------------------------------------ 
			 */	
			//TM21119 changed m_nEAFixedMaxLoanAmount to 350000
			if ((strproductcode == "S20" || strproductcode == "S21" || strproductcode == "S22" || strproductcode == "S23") &&  (nLoanAmount > m_nEAFixedMaxLoanAmount.valueOf()))
			{
			    setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts above $350,000." );
				document.all(m_strProductDropDownNames[nControlIndex-1]).selectedIndex = 0;			
				return false;
			}
			if ((strproductcode == "S20" || strproductcode == "S21" || strproductcode == "S22" || strproductcode == "S23") &&  (nLoanAmount < 20000))
			{
			    setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts below $20,000." );
				document.all(m_strProductDropDownNames[nControlIndex-1]).selectedIndex = 0;			
				return false;
			}
			
			//MLCC00000767 change 50,000 to 2,501 for all products except equity access fixed
			//if ((strproductcode == "796" || strproductcode == "797" || strproductcode == "798") &&  (nLoanAmount < 50000))
			//{
			//    setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts below $50,000." );
			//	return false;
			//}
			
			if ((nLoanAmount < 417001) && (strproductcode == "554" ))
			{
			    setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts below $417,001." );
				document.all(m_strProductDropDownNames[nControlIndex-1]).selectedIndex = 0;			
				return false;
			}
			
			//PCTUP00533234 - Mortgage Comparison Calculator Equity Minimum Loan Amount Revision
			if ((nLoanAmount < 50000) && (strproductcode == 'H70'))
			{
				setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts below $50,000." );
				return false;
			}
						
			//PCTUP00533234 - Mortgage Comparison Calculator Equity Minimum Loan Amount Revision
			if ((nLoanAmount < 50000) && (strproductcode == 'H72'))
			{
				setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts below $50,000." );
				return false;
			}
							
			//MLCC00000767 change 50,000 to 2,501 for all products except equity access fixed
			//TM21035 - m_nNonEAMinimumLoanAmount.valueOf() Default minimum loan amount is $10,000 on first lien products
			if (nLoanAmount < m_nNonEAMinimumLoanAmount.valueOf())
			{
			    setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts below $10,000." );
				document.all(m_strProductDropDownNames[nControlIndex-1]).selectedIndex = 0;			
				return false;
			}
			if (iPurchaseAmt >= 10000000)
			{
		    	 setErrorFocus(iLoanObj, "The maximum Property value/Purchase price must be below $10 million. Properties $10 million and over require special handling. Please contact Merrill Lynch Credit Corporation for more information." );
				return false;
			}

			if ((strproductcode == "H70") || (strproductcode == "H72") || (strproductcode == "S21") || (strproductcode == "S22") || (strproductcode == "H20") || (strproductcode == "H23"))
			{
				if (nLoanAmount > m_dEquityloanAmtLimt) //PCTUP00457627
				{
					var strMM = m_dEquityloanAmtLimt.toString().substr(0,1);
					
					setErrorFocus(iLoanObj, "The Loan Amount is more than $" + strMM + " million. For Home Equity Lines of Credit we are able to offer loans up to $" + strMM + " million on our Web site. Loans over $" + strMM + " million for Home Equity Lines of Credit require special handling. Please visit the contact us page for more information." );
					document.all(m_strProductDropDownNames[nControlIndex-1]).selectedIndex = 0;			
					return false;
				}
			}
			else
			{
				if (nLoanAmount > 3000000) //TM 12413 from $2M to $3M
				{
					setErrorFocus(iLoanObj, "The loan amount is more than $3 million. We are able to offer loans up to $3 million on our Web site. Loans over $3 million require special handling. Please contact us for more information" );
					document.all(m_strProductDropDownNames[nControlIndex-1]).selectedIndex = 0;			
					return false;
				}
			}
// set loan type and either "conforming or "non-conforming message
			setLoanType(nLoanAmount, nControlIndex);

	     }
	     return true;
	}
	
	/*	
	function isValidROI(obj)
	{
		var nROI;
		
		//check for empty
		if (obj.value == "")
		{
			setErrorFocus(obj,'Please enter a percentage between 0% and 15%');
			return false;
		}
		else
		{
			nROI = new Number(sfStripPercent(obj.value));
			//must be a number
			if (!isNaN(nROI))
			{
				//check for upper limit
				if (nROI.valueOf() > m_dROILimit.valueOf())
				{
					setErrorFocus(obj, 'Expected Return on Investments must be a positive number between 0% and 15%.');
					return false;
				}
				else
				{
					//check for lower limit
					if (nROI.valueOf() < 0)
					{
						setErrorFocus(obj, 'Expected Return on Investments must be a positive number between 0% and 15%.');
						return false;
					}
					else
					{
						clearErrorFocus(obj);
						return true;
					}
				}
			}
			else
			{
				setErrorFocus(obj, 'Please enter a positve percentage less or equal to 15%');		
				return false;
			}
		}
	}
	
	*/
	
	

	//<NewDataSet>
	//... schema information ...
	//... one to many of these elements ...
	//	<tblMLCCInternetRates>
	//0		<ID>2733361</ID>
	//1		<Product>5 year Non-Conforming amortized fixed-to-adjustabl</Product>
	//2		<ProductCode>58N</ProductCode>
	//3		<MortgageEquity>M</MortgageEquity>
	//4		<Conforming>N</Conforming>
	//5		<NonConforming>Y</NonConforming>
	//6		<OldProductCode>VL</OldProductCode>
	//7		<Employee>N</Employee>
	//8		<Min>600001</Min>
	//9		<Max>1000000</Max>
	//		<OrigPoints>0.25</OrigPoints>
	//		<DiscountPoints>0</DiscountPoints>
	//		<TotalPoints>0.25</TotalPoints>
	//		<Rate>4.625</Rate>
	//		<APR>3.806999922</APR>
	//		<IndexType>L6</IndexType>
	//		<IndexValue>1.17</IndexValue>
	//		<Margin>2</Margin>
	//		<InitialAdjustmentPeriod>60</InitialAdjustmentPeriod>
	//		<InitialRateCap>5</InitialRateCap>
	//		<SubsequentAdjustmentPeriod>6</SubsequentAdjustmentPeriod>
	//		<SubsequentRateCap>1</SubsequentRateCap>
	//		<LifeCap>5</LifeCap>
	//		<Ceiling>9.625</Ceiling>
	//		<AmortType>Fully</AmortType>
	//		<AmortTerm>360</AmortTerm>
	//		<NonAmortTerm>NULL</NonAmortTerm> ** null values are not included in the xml!!
	//		<CoOp>0.25</CoOp>
	//		<EffectiveDate>2004-02-27T09:30:00.0000000-05:00</EffectiveDate>
	//		<DateLoad>2004-02-27T12:05:07.9730000-05:00</DateLoad>
	//		<AmortIndex></AmortIndex>
	//		<AmortMargin></AmortMargin>
	//	</tblMLCCInternetRates>
	//</NewDataSet>

	function onBeginPeriodChange(obj)
	{
		//alert("onBeginPeriodChange(" + obj.id + ")");
		var iControlIndex = getControlIndex(obj).valueOf();
	    var nBeginPeriod //= new Number(obj.value);
	  
		document.all("ddlbeginM" + iControlIndex.toString()).value = obj.selectedIndex;
	    // need to calculate the beginning period - user has changed the years or months
	    nBeginPeriod = setBeginPeriod(iControlIndex);
	 
	   	  		
		if (isBlendedRateProduct(iControlIndex) || isPrimeFirstProduct(iControlIndex) || isEquityAccessARMProduct(iControlIndex))
		{
	//	alert("testing begin period against non amort term");
	//	alert("begin period " + nBeginPeriod);
	
			var nNonAmortTerm = getNonAmortTerm(iControlIndex);
			//alert("nonamortterm" + nNonAmortTerm);
			if (nBeginPeriod.valueOf() <= nNonAmortTerm.valueOf())
			{
				//alert("Disable Field#14");
				toggleInitialAdjRate(true, iControlIndex);
			}
			else
			{
				//alert("Enable Field#14");
				toggleInitialAdjRate(false, iControlIndex);
			}
		}
		else
		{
			var iyears;
			iyears = parseInt(nBeginPeriod/12);
			
					//alert("Enable Field#14");
			toggleInitialAdjRate(false, iControlIndex);		
			document.all(m_strInitialAdjRateNames[iControlIndex - 1]).disabled = false;
			var nIAP = getInitAdjPeriod(iControlIndex);
			var strProductName = getProductName(iControlIndex);
			//alert("nIAP " + nIAP);
			//alert("Begin Period" + nBeginPeriod);
			//ar PATCH FOR 37N & 65M PRODUCTS AS THEY ARE DIFFERENT FROM THEIR CONFORMING COUNTERPARTS
			var strProductCode = getProductCode(iControlIndex);
			//alert('strProductCode -> ' & strProductCode);
			if ((strProductCode != '37N') && (strProductCode != '65M'))
			{			
				if (nBeginPeriod.valueOf() < nIAP.valueOf() && nBeginPeriod.valueOf() != 0)
				{
					obj.value = nIAP.toString();
					alert("The first month of adjustment for " + strProductName + " can not be less than " + nIAP.toString() );
				//	obj.focus();
				}
			}
		}
		return;
	}
	
	
	function onBeginYearChange(obj)
	{
	//alert('here')
			// user changed the begin year, need to adjust the months 
			// according to the frequency.
			var iControlIndex = getControlIndex(obj).valueOf();
			var iFrequency = document.all("ddlAdjFrequency" + iControlIndex.toString())
		   var iStartMonth ;
		   var strProductType;
		   var iBeginYear;
		 		  
		   // pull out the year that is chosen, based on the year,
		   // and product types, certain months will not be displayed
		// var ddlBobj = document.all("ddlBeginPeriodYear"+ iControlIndex.toString());
		
 	    iBeginYear= obj.options[obj.selectedIndex].value;
 	    
		document.all("ddlbeginY" + iControlIndex.toString()).value = obj.selectedIndex;
 	    
	// clear out begin months drop down
		    var objPeriodMonthDropDown =  document.all("ddlBeginPeriodMonths"  + iControlIndex.toString());
			while  (objPeriodMonthDropDown.options.length > 0) 
			 {
				   removeAllOptions(objPeriodMonthDropDown);
	             
			 }
	
			if (isPrimeFirstProduct(iControlIndex))
			{
				// need to determine if it is 1 month or 6 month.
				// write out the months  - the beginning is either 2 or 7
 				var strProductCode;
				strProductType = "PF";
				strProductCode = getProductCode(iControlIndex);
				if ((strProductCode == "771") || (strProductCode == "780"))
				{
						if (obj.selectedIndex==0)
						{
						// start at month 2
							iStartMonth=1;
						}
						else
						{
						// display all months
							iStartMonth=0;
						}
							ifrequency=0;
				}
				else if (strProductCode == "781")
				{
						if (obj.selectedIndex==0)
						{
						// start at month 4
							iStartMonth=3;
						}
						else
						{
						// display all months
							iStartMonth=0;
						}
						
						ifrequency=3;
				}
				
				else
				{
						if (obj.selectedIndex==0)
						{
						// start at month 7
							iStartMonth=6;
						}
						else
						{
						// display all months(1st/7th)
							iStartMonth=0;
						}
					
						ifrequency=1;
				}
			}	
			
			// if equity access product
		if (isEquityAccessARMProduct(iControlIndex))
		{
					strProductType = "EQ";
		           if (obj.selectedIndex==0)
					{
								// start at month 2
									iStartMonth=1;
					}
				  else
					{
								// display all months
									iStartMonth=0;
					}
				ifrequency=0;
		}
		
		// determine blended rate start periods/end periods
	//alert("isFixedAdjProduct(iControlIndex)" + isFixedAdjProduct(iControlIndex));

	if (isFixedAdjProduct(iControlIndex))
		{


		// this is semi annual,, start at month 7th for original start
			
			strProductType = getProductCode(iControlIndex);
			//alert('iFrequency -> ' + iFrequency.value)
			//alert ("strproductcode -> " + strProductType );
			
			if (strProductType == "A02")
			{
				iStartMonth=1;
				if (obj.selectedIndex != 0)
				{
					iStartMonth=0;
				}
				
			    ifrequency=0;
				//alert("-> " + iStartMonth);

			}
			else if (iFrequency.value == 12) /// these are annual products 
			{
				//iStartMonth=6;
				// if another year chosen, start at month one.
				if (obj.selectedIndex != 0)
				{
					iStartMonth=0;
				}
				ifrequency=2;			
			}
			else
			{
				//alert('XX')
				strProductType = "XX";
				iStartMonth=6;
				// if another year chosen, start at month one.
				if (obj.selectedIndex != 0)
				{
					iStartMonth=0;
				}
				ifrequency=1;
			}			
		} 
	
		if (isBlendedRateProduct(iControlIndex) )
		{
		
			var strProductCode;
			strProductType = "BR";
			strProductCode = getProductCode(iControlIndex);
			strProductType = strProductCode;
			if ((strProductCode == "791")||(strProductCode == "793")||(strProductCode == "795"))
			{
			
				if (obj.selectedIndex==0)
				{
				// start at month 2
					iStartMonth=1;
				}
				else
				{
				// display all months
					iStartMonth=0;
				}
					ifrequency=0;
		}
		else
		{
				if (obj.selectedIndex==0)
				{
				// start at month 7
					iStartMonth=6;
				}
				else
				{
				// display all months(1st/7th)
					iStartMonth=0;
				}
			
				ifrequency=1;
		}		
			/*
		// this is semi annual,, start at month 7th for original start
			iStartMonth=6;
			
			
		
			strProductCode = getProductCode(iControlIndex);
			if (isBlendedRateProduct(iControlIndex))
			{
				strProductType = strProductCode;
			}
			else
			{
				strProductType = "XX";
			}
			// if another year chosen, start at month one.
			if (obj.selectedIndex != 0)
			{
				iStartMonth=0;
			}
			ifrequency=0;
			*/
		} 
			

			// reload begin months			
		//alert("Loading -> " + ifrequency + "  "+ iStartMonth + " " + strProductType + " " + iBeginYear);
	   loadmonths(ifrequency,iStartMonth,objPeriodMonthDropDown,strProductType,iBeginYear)
			
		onBeginPeriodChange(obj);
			
	}
	
	function loadmonths(ifrequency,iMonths,objdropdown,strType,iYear)
	{

		//alert('LM \nifrequency = ' + ifrequency + '\niMonths = ' + iMonths + '\nobjdropdown = ' + objdropdown.name + '\nstrType = ' + strType + '\niYear = ' + iYear);
		
		switch (ifrequency)
		{
			case 0:		//monthly
			{	
				for (j=iMonths; j < 12; j++)
				{
				
					var elOption = document.createElement("option");
					if (j == 0)
					{	
						if (strType == "PF" && iYear == 11 || strType == "EQ" && iYear == 11)
						{
						//
						}
						else
						{
							elOption.text = "1st";
							elOption.value = 1;
							objdropdown.options.add(elOption);
						}			
					}
					else
					{	addPeriodicRateAdjustment(objdropdown, j)
					}
		   		}
		   		break;
		   	}
		   	case 1:		//semi annually
		   	{
		   		try
		   		{
		   			//alert('here in semi ->' + typeof strType)
		   			if (("undefined" == typeof(strType)) && (_CHANGEDFREQ) )
		   			{
						strType = "XX";
						_CHANGEDFREQ = false;

					}
					if (iMonths != 6)
					{		      	
						switch(strType.toString())
						{			
							case "XX":
							{
								var elOption = document.createElement("option");		
								elOption.text = "1st";
	   							elOption.value = 1;
	   							objdropdown.options.add(elOption);
								break;
							}
							case "PF":
							{
								if  (iYear != 11)
	   							{
	   								var elOption = document.createElement("option");		
									elOption.text = "1st";
	   								elOption.value = 1;
	   								objdropdown.options.add(elOption);
	   							}
								break;
							}
							case "BR":
							{
							}
							case "796":
							{
								
								if  (iYear != 4)
	   							{
	   								var elOption = document.createElement("option");		
									elOption.text = "1st";
	   								elOption.value = 1;
	   								objdropdown.options.add(elOption);
	   							}					
								break;
							}
							case "797":
	   						{ 
	   							if  (iYear != 6)
	   							{
	   								var elOption = document.createElement("option");		
									elOption.text = "1st";
	   								elOption.value = 1;
	   								objdropdown.options.add(elOption);  
				   					
	   							}
	   						}	 
							case "798":
	   						{ 
	   							if  (iYear != 8)
	   							{
	   								var elOption = document.createElement("option");		
									elOption.text = "1st";
	   								elOption.value = 1;
	   								objdropdown.options.add(elOption); 
								
	   							}
							}	 
						}
	   				}
				
	   				var elOption = document.createElement("option");		
	   				elOption.text = "7th";
	   				elOption.value = 7;
	   				objdropdown.options.add(elOption);
		   			break;
		   		}
		   		catch (e)
		   		{
		   			//alert('error')
		   		}
		   	}
		   	case 2:   // annual
			{
			    var elOption = document.createElement("option");
			    elOption.text = "1st";
	   		   	elOption.value = 1;
	   			objdropdown.options.add(elOption);  
				break;
			}
		   	case 3:   // quarterly
			{
				
				if (iMonths != 3)
				{
					var elOption = document.createElement("option");				    
					elOption.text = "1st";
	   		   		elOption.value = 1;
	   				objdropdown.options.add(elOption);  
					
				}
				var elOption = document.createElement("option");
					
				elOption.text = "4th";
				elOption.value = 4;
				objdropdown.options.add(elOption);
				
				var elOption = document.createElement("option");
					
				elOption.text = "7th";
				elOption.value = 7;
				objdropdown.options.add(elOption);
				
				var elOption = document.createElement("option");
					
				elOption.text = "10th";
				elOption.value = 10;
				objdropdown.options.add(elOption);
			
				
				break;
				
				
			}
		}	
	}
	
	
	function perioddropdowns(iMonths,iyears,iendyears,objdropdown,objyeardropdown,ifrequency)
	{
		//alert('iMonths - ' + iMonths + '\n iyears - ' + iyears + '\n iendyears - ' + iendyears + '\n objdropdown - ' + objdropdown + '\n objyeardropdown - ' + objyeardropdown + '\n ifrequency - ' + ifrequency)
		// load the Begining months and year dropdown
		// this is called from resetperiods
		while  (objdropdown.options.length > 0) 
		{	removeAllOptions(objdropdown);
		}
	
		//alert("perioddropdowns");
		//alert("perioddropdowns  -> ifrequency,iMonths " + ifrequency + " " + iMonths);
	//rekha test this
		loadmonths(ifrequency,iMonths,objdropdown);
		//alert('here after LM') 
		// reset years drop down

		// for some reason, this dropdown doesn't completely clear out on the first call
		// but on the second call it does. so until the right fix is in, this is a 
		// workaround
	    while  (objyeardropdown.options.length > 0) 
		{	 removeAllOptions(objyeardropdown);             
	    }
	   
	     //    	
     	for (k=iyears; k < iendyears; k++)
	    {
			addPeriodicRateAdjustment(objyeardropdown, k)
		}
	}

	function refreshPricing(iIndex)
	{
//		alert("refreshPricing(" + iIndex.toString() + ")");
		
		var objRateDropDown = document.all(m_strRateDropDownNames[iIndex-1]);
		try
		{
			selectRate(objRateDropDown);
		}
		catch (e)
		{
		}
		var objProductDropDown = getProductDropDown(iIndex);
		var objRateXML = document.all(m_strRateXMLNames[iIndex-1]);
		var nLoanAmount = new Number(sfStripComma(document.all[m_strLoanAmountNames[iIndex-1]].value));
		//alert(objRateXML);
		var nMax;
		var nMin;
		var strRatePoint;
		var strRowID;
		var strProductCode;
		
		//GC : 10-year product returns XML error bcoz 1 point value is missing
		var bdefaultselected = false;
	
		var strProductName = getProductName(iIndex);
		// if product name is not "Select-Product" then refresh pricing
		// alert("product name " + strProductName);

		//	if (objProductDropDown.selectedIndex > 0)
		// if users changes the loan amount, this routine is called, and we need
		// to refresh the pricing. before it would only refresh if a product was changed.
		if (strProductName !=  'Select-Product')
		{
	
			var i = 0;
			// need to set or reset the loan type before getting the product code
			var nLA = document.all("txtLoanAmount1").value;
			setLoanType(nLA, iIndex);
			strProductCode = getProductCode(iIndex);
			//alert("product code " + strProductCode);
			var strXPath = "NewDataSet/tblMLCCInternetRates[@ProductCode='" + strProductCode + "']";
			var xmlRates = document.all("xmlRates").XMLDocument;
			//x	alert(strXPath)
			var xmlRateNodes = xmlRates.selectNodes(strXPath);
			var xmlRate;
			var xmlSelectedRate;
			
			while  (objRateDropDown.options.length > 0){
				removeAllOptions(objRateDropDown);
			}
//			alert (xmlRateNodes.length);	
			for (i=0; i < xmlRateNodes.length; i++)
			{
				xmlRate = xmlRateNodes[i];
				var nMin = new Number(xmlRate.selectSingleNode("@Min").text);
				var nMax = new Number(xmlRate.selectSingleNode("@Max").text);
				var outOfRange = true;
/*				alert (i + ' of ' + xmlRateNodes.length);
				alert('nMin.valueOf() -> ' + nMin.valueOf());
				alert('nMax.valueOf() -> ' + nMax.valueOf());
				alert('nLoanAmount.valueOf() -> ' + nLoanAmount.valueOf());
*/


				if ((nLoanAmount.valueOf() <= nMax.valueOf()) && (nLoanAmount.valueOf() >= nMin.valueOf()))
				{
					var strRowID = xmlRate.selectSingleNode("@ID").text;
					var nRate = new Number(xmlRate.selectSingleNode("@Rate").text);					
					var nPoints = new Number(xmlRate.selectSingleNode("@TotalPoints").text);
					var strRatePoint = "Rate: " + nRate.toFixed(3) + "%, Points: " + nPoints.toFixed(3);
					var elOption = document.createElement("option");
					var nDefaultPoints;
					nDefaultPoints = new Number(1);
					outOfRange = false;
					if (isBlendedRateProduct(iIndex)){
						nDefaultPoints = new Number(1.25);
					}
					
				    if (isEquityAccessFIXEDProduct(iIndex)){
				     	nDefaultPoints = new Number(0);
					}
					//alert('isInterestOnlyProduct(iIndex) -> ' + isInterestOnlyProduct(iIndex))
					if (isInterestOnlyProduct(iIndex)){
				     	nDefaultPoints = new Number(1.125);
					}
					elOption.text = strRatePoint;
					elOption.value = strRowID;
					//alert('nPoints-> ' + nPoints.valueOf() + '\n nDefaultPoints.valueOf()' + nDefaultPoints.valueOf());
					if (nPoints.valueOf() == nDefaultPoints.valueOf()){
						objRateXML.value = xmlRate.xml;
						
						xmlSelectedRate = xmlRate;
						elOption.selected = true;
						document.all("txtstrID" + iIndex.toString()).value = strRowID;

						//document.all("ddlintrate" + iIndex.toString()).value = obj.selectedIndex;
						
						//GC : 10-year product returns XML error bcoz 1 point value is missing
						bdefaultselected = true;
					}
					objRateDropDown.options.add(elOption);
				}
			} //for
/*
			if (outOfRange)
				isvalidPcLoanAmount(document.all(m_strProductDropDownNames[iIndex-1]),iIndex);
*/						
			//GC : 10-year product returns XML error bcoz 1 point value is missing
			//Default is Rate is 1% since its not there, we are using the nearest value .875% which 
			//is in the 4th value in that array.
			//alert("bdefaultselected -> " + bdefaultselected);
			//if ((bdefaultselected == false) && !(outOfRange)){
			//	objRateDropDown.options[4].selected = true;
			//}

			//alert(getAmortType(iIndex) == nAmortArm.valueOf());
			
			if (getAmortType(iIndex) == nAmortArm.valueOf())
			{
				try
				{
					setArmProductPrefills(iIndex, xmlSelectedRate);
				}
				catch (e)
				{
				//	alert("error");
				// if an error occurs, it means that the xml rate doesn't exist
				// for this product and loan amount. this error occurred when the
				// loan amount is less than 10K so no rate info is available.
				}

				//alert("set rate values refresh pricing");
				try
				{
					setRateValues(iIndex, xmlSelectedRate);
				}
				catch (e)
				{
				//	alert("error");
				// if an error occurs, it means that the xml rate doesn't exist
				// for this product and loan amount. this error occurred when the
				// loan amount is less than 10K so no rate info is available.
				}
				//alert("set rate values refresh pricing");
			}
		}
		return true;
	}
	
	function removeAllOptions(obj)
	{
		var iCount = obj.options.length;
		var i=0;
				
		for (i=0; i<iCount; i++)
		{	obj.options.remove(i);
		}	
	}

// function rewritten by Rekha on 03/15/07 
// this function (re)loads the begin/end year/month dropdowns
	function  reloadPeriodicRangeAdjs(iIndex,loanterm,ifrequency)
	{
		//alert('reloadPeriodicRangeAdjs')
	    var objddlEndPeriodYear =  document.all("ddlEndPeriodYear"  + iIndex.toString());
	    var objPeriodMonthDropDown =  document.all("ddlBeginPeriodMonths"  + iIndex.toString());
	    var objPeriodYearDropDown =  document.all("ddlBeginPeriodYear"  + iIndex.toString());
		var objPeriodEndMonth =  document.all("ddlEndPeriodMonths"  + iIndex.toString());
		var iendyears;
		var strProductCode;
		var iStartMonth ;
		var iholding;

		// clear out the begin/end years and months dropdown
	    removeAllOptions(objddlEndPeriodYear);
	   	removeAllOptions(objPeriodYearDropDown);
	   	removeAllOptions(objPeriodMonthDropDown);
		removeAllOptions(objPeriodEndMonth);

		iholding = document.all("txtHoldingPeriod").value;
		iendyears = iholding;
		strProductCode = getProductCode(iIndex);
		istartyear=0;

		if (isPrimeFirstProduct(iIndex))
		{
			// need to determine if it is 1 month or 6 month.
			// write out the months  - the beginning is either 2 or 7
 			var strProductCode;
			var iStartMonth ;
			strProductCode = getProductCode(iIndex);
			istartyear=0;
			//alert(strProductCode)
			if ((strProductCode == "771") || (strProductCode == "780"))
			{
			      iStartMonth=1;
			      ifrequency=0;
			}
			else if (strProductCode == "781")
			{
			      iStartMonth=3;
			      ifrequency=3;
			}
			else
			{
			     iStartMonth=6;
			     ifrequency=1;
			}	

			if ((strProductCode == "771") || (strProductCode == "772"))
			{
				if (iholding > 25)
				{	iholding = 25; //holding period 
				}
 		 	}
 		 
			perioddropdowns(iStartMonth,istartyear,iholding,objPeriodMonthDropDown,objPeriodYearDropDown,ifrequency);

		}
		
		// if equity access product
		if (isEquityAccessARMProduct(iIndex))
		{

			var iStartMonth;
			var iYears = 0;
			switch (ifrequency)
			{
				case 0: 
					iStartMonth = 1;					
					break;
				case 1: 
					iStartMonth = 6;
					break;
				case 2:
					iYears = 1;
					iStartMonth = 1;					
					break;
				default:
					iStartMonth = 1;
					break;
				
			}
			
		
		//	alert("Loan term " + loanterm);
			if (iholding > loanterm)
			{
				iholding=loanterm;
			}
 			
 			
 			perioddropdowns(iStartMonth,iYears,iholding,objPeriodMonthDropDown,objPeriodYearDropDown,ifrequency);

			//iholding = loanterm;
			istartyear=1;
		}
		
		// determine blended rate start periods/end periods
		if (isBlendedRateProduct(iIndex))
		{
 			var strProductCode ="" ;
			strProductCode = getProductCode(iIndex);

			//Adding 1-month blended rate product TM 18280 
			switch (strProductCode.toString())
			{
			case '791':
			case '793':
			case '795':
			{
			    iStartMonth=1;
			    ifrequency=0;
				break;
			}
			default:
			{
			     iStartMonth=6;
			     ifrequency=1;
			}
			}
			// the ending period is the loan term if the holding period is greater
			if (iholding > loanterm)
			{
				iholding=loanterm;
			}
			perioddropdowns(iStartMonth,0,iholding,objPeriodMonthDropDown,objPeriodYearDropDown,ifrequency);
		
			//istartyear=1;
					
		} 
		
		if (isFixedAdjProduct(iIndex))
		{
			// determine the default period to start with
       		//rekha test
			strbeginmonths = getInitAdjPeriod(iIndex).toString();
			iyears = strbeginmonths/12;
			iyears = parseInt(iyears);			
			imonths = (iyears*12)+1;
			ifrequency=1;
		
			// set the dropdown values - this is zero based
	        //alert("imonths, iyears, strbeginmonths -> " + imonths + ' ' + iyears + ' ' + strbeginmonths);
 			var strProductCode;
			strProductCode = getProductCode(iIndex);
			switch(strProductCode.toString())
			{
			case 'A02':
			{
				istartyear = iyears;
				//alert("istartyear " + istartyear);
				iStartMonth=1;
			    ifrequency=0;
				//alert("-> " + iStartMonth);
				perioddropdowns(iStartMonth,istartyear,iholding,objPeriodMonthDropDown,objPeriodYearDropDown,ifrequency);
				break;
			}
			default:
				istartyear=iyears+1;
			    ifrequency = 2;
				perioddropdowns(0,iyears,iholding,objPeriodMonthDropDown,objPeriodYearDropDown,ifrequency);
				break;
			}
		} 
			
	    document.all("ddlBeginPeriodMonths" + iIndex.toString() ).selectedIndex= 0;
 		document.all("ddlBeginPeriodYear"  + iIndex.toString()).selectedIndex= 0;
		//end of loading row #1 for the range of periodic rate adjustments
		
	    var isetindex =0;
		// need to figure out why the first time, not all of the items are being
		// removed. sometimes there are 3 items still in the dropdown.
		// this just assures us that the dropdown is totally empty
	    while  (objddlEndPeriodYear.options.length > 0) 
	    {	removeAllOptions(objddlEndPeriodYear);	             
	    }

		// if holding year equal to start year, then nothing would  have been 
		// loaded, so substract one from start year, so we load the Holding
		// Years at the endind year
			 //alert('iholding ' + iholding );
		if (istartyear == iholding)
		{	istartyear = parseInt(istartyear) - 1
		}    
		
		for (i=istartyear; i < iholding; i++)
		{
			addPeriodicRateAdjustment(objddlEndPeriodYear, i)
			isetindex++;			
		}
		
	    isetindex--;
	    
	    document.all("ddlEndPeriodYear"  + iIndex.toString()).selectedIndex= isetindex;
	    document.all("ddlendY" + iIndex.toString()).value = isetindex;
		
		
		//clear out all entries in ending month. do a loop, since the first time
		// not all items are cleared. 
		while  (objPeriodEndMonth.options.length > 0) 
	    {	removeAllOptions(objPeriodEndMonth);	             
	    }
		
		isetindex = 0;
		switch (ifrequency)
		{
			case 0:		//monthly
			{
				for (j=0; j < 12; j++)
	    		{
   					addPeriodicRateAdjustment(objPeriodEndMonth, j)
					isetindex++;
				}
				isetindex--;
				break;
			}
			case 1:		//semi annually
			{
				var elOption = document.createElement("option");		
				elOption.text = "1st";
				elOption.value = 1;
				objPeriodEndMonth.options.add(elOption);  
				var elOption = document.createElement("option");		
				elOption.text = "7th";
				elOption.value = 7;
				objPeriodEndMonth.options.add(elOption);
				isetindex=1;
				break;
			}
			case 2:		//annually
			{
				var elOption = document.createElement("option");
			    elOption.text = "1st";
	   		   	elOption.value = 1;
	   			objPeriodEndMonth.options.add(elOption);  
	   			isetindex=0;
				break;	   				    
	   		}
	   		case 3:		//quarterly
	   		{
				var elOption = document.createElement("option");				    
				elOption.text = "1st";
	   		   	elOption.value = 1;
	   			objPeriodEndMonth.options.add(elOption);  
				
				var elOption = document.createElement("option");
				elOption.text = "4th";
				elOption.value = 4;
				objPeriodEndMonth.options.add(elOption);
				
				var elOption = document.createElement("option");
					
				elOption.text = "7th";
				elOption.value = 7;
				objPeriodEndMonth.options.add(elOption);
				
				var elOption = document.createElement("option");
					
				elOption.text = "10th";
				elOption.value = 10;
				objPeriodEndMonth.options.add(elOption);
	   			isetindex=3;
			
				
				break;
			}
	   		 
		}
		document.all("ddlEndPeriodMonths"  + iIndex.toString()).selectedIndex= isetindex;
	    document.all("ddlendM" + iIndex.toString()).value = isetindex;    	
	}
	
	
	function round (number, dec) 
	{
		// rounds number to dec decimal places
		return Math.round (number * Math.pow (10, dec)) / Math.pow (10, dec);
	}

	function selectProduct(obj)
	{
//		alert("selectProduct(" + obj.id + ")");
		
		var nControlIndex = getControlIndex(obj);
		var nAmortType = getAmortType(nControlIndex.valueOf());
		var objRateDropDown = document.all(m_strRateDropDownNames[nControlIndex-1]);
		var objSelectedIndex = document.all(m_strSelectedRateIndexes[nControlIndex-1]);
		//alert("index " + nControlIndex);
		//load rates
		/*
		if (!(refreshPricing(nControlIndex)))
			return false;
		*/
		refreshPricing(nControlIndex);	
		
		//alert(objRateDropDown.selectedIndex)
		objSelectedIndex.value = objRateDropDown.selectedIndex;

		//GC : 10-year product returns XML error bcoz 1 point value is missing
		selectRate(objRateDropDown)

		// load the interest rate - selected index chosen - this is used
		// when save session - allows to reset the rate that the user chose (body onload)
	
		document.all("ddlintrate" + nControlIndex.toString()).value = objRateDropDown.selectedIndex;
	    
		//set the adjustable rate input fields
		//displays 'Periodic Rate Adjustment ' section of the screen
		setArmInputDisplay(nControlIndex, nAmortType);
		//end -displays 'Periodic Rate Adjustment ' section of the screen
		
		// validate loan amounts with certain product codes
		isvalidPcLoanAmount(obj,nControlIndex);
					
	}
	
	function selectRate(obj)
	{
	     //alert("selectRate(" + obj.id + ")");
		
		var nControlIndex = getControlIndex(obj);
		var objProductDropDown = document.all(m_strProductDropDownNames[nControlIndex-1]);
		//alert ("1 " + objProductDropDown );
		var objRateXML = document.all(m_strRateXMLNames[nControlIndex-1]);
		//alert ("2 " + objRateXML );
		var objSelectedIndex = document.all(m_strSelectedRateIndexes[nControlIndex-1]);
		//alert ("3 " + objSelectedIndex.value );
		
		var nAmortType = getAmortType(nControlIndex.valueOf());
		
		if (objSelectedIndex.value != -1) 
		{
			var strID = obj.options[obj.selectedIndex].value;
			
			var strXPath = "NewDataSet/tblMLCCInternetRates[@ID='" + strID + "']";
			var xmlRates = document.all("xmlRates").XMLDocument;
			
			var xmlRateNode = xmlRates.selectSingleNode(strXPath);

			if (nAmortType.valueOf() == nAmortArm.valueOf())
			{
				setArmProductPrefills(nControlIndex.valueOf(), xmlRateNode);			
				setRateValues(nControlIndex.valueOf(),xmlRateNode);
			}
			
			objRateXML.value = xmlRateNode.xml;
			objSelectedIndex.value = obj.selectedIndex;
			// store the rate that was chosen - by the selected index value
			// used to body on load to re-set the rate choosen by the user
			//alert("obj.selectedIndex -> " + obj.selectedIndex);
			document.all("ddlintrate" + nControlIndex.toString()).value = obj.selectedIndex;
			document.all("txtstrID" + nControlIndex.toString()).value = strID;
		}	
		return;
	
	}
	
	function setArmInputDisplay(nControlIndex, nAmortType)
	{
		//alert("setArmInputDisplay(" + nControlIndex.toString() + "," + nAmortType.toString() + ")");
		var nCount = getCompareCount();
		var sVisibility = "";
		var sInitialControlID = "divVarRate" + nControlIndex.toString();
		var sPeriodicControlID = "divPerRate" + nControlIndex.toString();
		var sCheckBoxID = "chkPerRate" + nControlIndex.toString();
		var sPerRateControlsID = "divPerRateControls" + nControlIndex.toString();
		var bShow = new Boolean(false);
		
		if (nAmortType.valueOf() == nAmortFixed.valueOf()) {
			sVisibility = "hidden";
			document.all(sPerRateControlsID).style.visibility = sVisibility;
		}
		else {
			sVisibility = "visible";
			setPeriodicDisplay(document.all(sCheckBoxID))
		}
		
		document.all(sInitialControlID).style.visibility = sVisibility;
		document.all(sPeriodicControlID).style.visibility = sVisibility;
				
				
		m_strVarRateVisibility[nControlIndex - 1] = sVisibility;
		for (i=0; i<nCount.valueOf(); i++)
		{
			if (m_strVarRateVisibility[i] == "visible")
			{
				bShow = new Boolean(true);
				break;
			}
		}
		
		//TM21799
		if (bShow.valueOf()) {
			document.all("divVariableInterestRateContainer").style.posHeight = 148;
			document.all("divVariableInterestRateContainer").style.visibility = "visible";
			document.all("divPeriodicRateContainer").style.visibility = "visible";
			document.all("divfootnotes").style.visibility = "visible";
		}
		else
		{
			document.all("divVariableInterestRateContainer").style.posHeight = 2;
			document.all("divVariableInterestRateContainer").style.visibility = "hidden";
			document.all("divPeriodicRateContainer").style.posHeight = 2;
			document.all("divPeriodicRateContainer").style.visibility = "hidden";
			document.all("divfootnotes").style.visibility = "hidden";
		}
		
				
	}
	
	//Add rek
	function addPeriodicRateAdjustment(objPeriodDropDown, i)
	{
		var elOption = document.createElement("option");
		var isetindex;
	    switch (i)
  	    {
	   		case 0: {   elOption.text = "1st";
	   			elOption.value = 1;
	   			isetindex++;
  				break }

			case 1: {   elOption.text = "2nd";
				elOption.value = 2;
				isetindex++;
				break }

			case 2: {   elOption.text = "3rd";
				elOption.value = 3;
				isetindex++;
				break }

			case 20: {	 elOption.text = "21st";
	   			elOption.value = 21;
	   			isetindex++;
  				break }
  				
			case 21: {	 elOption.text = "22nd";
	   			elOption.value = 22;
	   			isetindex++;
  				break }
  				
			case 22: {	 elOption.text = "23rd";
	   			elOption.value = 23;
	   			isetindex++;
  				break }				
			
			default: { i++;
				elOption.text = i + "th";
				elOption.value = i;
				isetindex++;
				break }
	

		}
		
		objPeriodDropDown.options.add(elOption);
	}
	function addFrequencyOption(objFrequency, frequency)
	{

		var elOption = document.createElement("option");
		elOption.text = frequency;
		
		switch (frequency.toString())
		{
		case ("Monthly"):
			elOption.value = 1;		
			objFrequency.options.add(elOption);
			objFrequency.selectedIndex = 0;
			ifrequency=1;		
			break;
		case ("Quarterly"):
			elOption.value = 3;		
			objFrequency.options.add(elOption);
			objFrequency.selectedIndex = 0;
			ifrequency=3;		
			break;
		case ("Semiannually"):
			elOption.value = 6;		
			objFrequency.options.add(elOption);
			objFrequency.selectedIndex = 0;
			ifrequency=1;		
			break;
		case ("Annually"):
			elOption.value = 12;		
			objFrequency.options.add(elOption);
			objFrequency.selectedIndex = 0;
			ifrequency=1;		
			break;
		default:
			
		}
		
	}
	
	function setArmProductPrefills(iControlIndex, xmlRate)
	{
		

		//set initial adjustment rate
		//alert('setArmProductPrefills -> ' + iControlIndex); 
		var nCurrentIndex;
		var nMargin;
		if (isBlendedRateProduct(iControlIndex))
		{
			nCurrentIndex = new Number(xmlRate.selectSingleNode("@AmortIndex").text);
			nMargin = new Number(xmlRate.selectSingleNode("@AmortMargin").text);
		}
		else
		{
		
			nCurrentIndex = new Number(xmlRate.selectSingleNode("@IndexValue").text);
			nMargin = new Number(xmlRate.selectSingleNode("@Margin").text);
		
		}
	//	alert("nCurrentindex " + nCurrentIndex);
	   //alert("margin " + nMargin);
		
		var nInitialAdjustmentRate = new Number(nCurrentIndex.valueOf() + nMargin.valueOf());
	//	alert("initadjrate  " +  nInitialAdjustmentRate);
		var testrate = RoundToNearestEighth(nInitialAdjustmentRate);
	//	alert("test rate " + testrate);
		nInitialAdjustmentRate = new Number(testrate.valueOf());
		//document.all("txtInitAdjRate" + iControlIndex.toString()).value = testrate.toFixed(3);
		document.all("txtInitAdjRate" + iControlIndex.toString()).value = nInitialAdjustmentRate.toFixed(3);

// hold the original adjustment rate when a product is selected
		document.all("txtOrigAdjRate" + iControlIndex.toString()).value = nInitialAdjustmentRate.toFixed(3);
		//alert("original " + document.all("txtOrigAdjRate" + iControlIndex.toString()).value);

		//set range of adjustment periods
		var strbeginmonths=0;
		var strendmonths;
		//alert("xmlrate " + xmlRate);
		
		strbeginmonths = getInitAdjPeriod(iControlIndex).toString();
		strendmonths = getLoanTerm(xmlRate).toString();
		// translate the months to year/months and select that value in the dropdowns
		var iyears;
		var imonths;
		
		iyears = strbeginmonths/12;
		iyears = parseInt(iyears);
	
		imonths = strbeginmonths - (iyears*12);
		iyears = iyears + 1;
	// set the dropdown values - this is zero based
     	var ifrequency;
	   try
	   {
	       var obj = document.all("ddlAdjFrequency" + iControlIndex.toString());
		   ifrequency = obj.selectedIndex;
		}
		catch (e)
		{
			ifrequency=0;
		}
					  
	
		var nYears;
		nYears = strendmonths/12;
		
		reloadPeriodicRangeAdjs(iControlIndex,nYears,ifrequency);

	  //  document.all("ddlBeginPeriodYear"  + iControlIndex.toString()).selectedIndex= iyears-1;
	  //  document.all("ddlBeginPeriodMonths" + iControlIndex.toString() ).selectedIndex= imonths-1;
		
		
		iyears = strendmonths/12;
		iyears = parseInt(iyears);
	
		imonths = strendmonths - (iyears*12);
	//	iyears = iyears + 1;
	
		//alert("ifrequency" + ifrequency + '\n imonthd = ' + imonths);

		
		if (imonths == 0)
		{
			imonths=12
		}
		var Nbeginmonth;
		var Nbeginyear;
	    var Nendyear;
	    var Nendmonth;
	    var ncalc;
	    try
	    {
			ddlBobj = document.all("ddlBeginPeriodYear"+ iControlIndex.toString());
			ddlBobjmonth = document.all("ddlBeginPeriodMonths" + + iControlIndex.toString());
			Nbeginmonth= ddlBobjmonth.options[ddlBobjmonth.selectedIndex].value;
			Nbeginyear = ddlBobj.options[ddlBobj.selectedIndex].value;
		
		    Ncalc = (Nbeginyear-1) * 12;
			Nbeginyear = parseInt(Ncalc) + parseInt(Nbeginmonth);
			//  alert("Begin Period " + Nbeginyear);
	     
			//alert( " here");
			ddlobj = document.all("ddlEndPeriodYear"+ iControlIndex.toString());
			ddlobjmonth = document.all("ddlEndPeriodMonths" + + iControlIndex.toString());
			//alert(ddlobj);
			//alert(ddlobjmonth);
			Nendmonth= ddlobjmonth.options[ddlobjmonth.selectedIndex].value;
			//alert	 ('Nendmonth ' + Nendmonth);
			Nendyear = ddlobj.options[ddlobj.selectedIndex].value;
			Ncalc = (Nendyear-1) * 12;
			//alert("ncalc " + Ncalc);
			Nendyear=0;
			Nendyear = parseInt(Ncalc) + parseInt(Nendmonth);

			//alert('Nbeginmonth = ' + Nbeginmonth + '\nNbeginmonth =' + Nbeginmonth + '\nNendyear = ' + Nendyear + '\nNendmonth = ' + Nendmonth + '\nNcalc = ' + Ncalc) 
			
			//alert("ending year" + Nendyear);
		
		}
		catch (e)
		{
			//alert('error')
		}	  
		
		//alert("begin months - set arm " + Nbeginyear);	
	    document.all("TxtBeginPeriod" + iControlIndex.toString()).value = Nbeginyear;
		//alert("end year set arm " + Nendyear);
		document.all("TxtEndPeriod" + iControlIndex.toString()).value = Nendyear;

		//set period adjustment rate DEFAULT
		if (document.all("txtSubsequentAdj" + iControlIndex.toString()).value == "")
		{
			//alert("load first time");
			  document.all("txtSubsequentAdj" + iControlIndex.toString()).value = "0.000";
		}
		// ddlAdjFrequency indexes:
		// 0 = Monthly(every period), 1 = Semi-Annually(every 6 periods), 2 = Annually(every 12 periods)
		//set frequency of adjustment periods
		//rekha test
		var iSubsequentAdjustmentPeriod = getSubAdjPeriod(iControlIndex);
		//alert('iSubsequentAdjustmentPeriod' + iSubsequentAdjustmentPeriod);
		
		var objFrequency = document.all("ddlAdjFrequency" + iControlIndex.toString())
		
		while  (objFrequency.options.length > 0) 
	    {
	          removeAllOptions(objFrequency);
	         
         }
         
        
         
         var strProductCode = getProductCode(iControlIndex); 
       //alert("product code setArmProductPrefills" + strProductCode);
		// only choose monthly
		
		//frequency = 1 = monthly = semiannulaay
		//frequency = 2 = Annually
		//frequency = 3 = Q
		//frequency = 0 = All
		switch (strProductCode.toString())
		{
			case '771': case 'A02': case '791': case '793': case '795': case '780':
			{
				addFrequencyOption(objFrequency, "Monthly")
				ifrequency=1;								//check this ifreq shd be 0 like in other parts of the code
				break;
			}
			case 'H70': case 'H72':
			
				addFrequencyOption(objFrequency, "Monthly")
				addFrequencyOption(objFrequency, "Semiannually")
				addFrequencyOption(objFrequency, "Annually")
				ifrequency=0;
				break;
			case '61M':	case '63M':	case '64M':	case '65M':	case '66M':	case '67M':
			case '84M':	case '88M': case '37C':	case '58N':	case '58C':
	 		case '37N': case '78N':	case '78C':	case '97N':	case '97C':	case '12N':
				addFrequencyOption(objFrequency, "Annually")
				ifrequency=2;
				break;
			case '781':
				addFrequencyOption(objFrequency, "Quarterly")
				ifrequency=3;
				break;
			default:
				addFrequencyOption(objFrequency, "Semiannually")
				ifrequency=1;
			
		}
		
		
		// if semi annual, need to add 5 months since the range represents the start and
		//ending period, which has to include the 6 months inbetween adjustments
		
		//alert("test3" + iControlIndex.toString());
		
		var iEndYear;
		iEndYear = Nendyear;
		//alert('iEndYear - ' + iEndYear)
		var iholding = document.all("txtHoldingPeriod").value * 12;
		if (iEndYear  > iholding)
		{
			iEndYear  = iholding;
								
		}
		
		document.all("TxtEndPeriod" + iControlIndex.toString()).value = iEndYear;
		
		iyears = parseInt(strbeginmonths/12);
	
		if (iyears  >= document.all("txtHoldingPeriod").value)
		{
		  //  alert("disable Field#15");
		  	document.all("divfootnotes").style.visibility = "hidden";
			toggleProductCheckbox(false, iControlIndex);
		}
		else
		{
			//alert("Enable Field#15");
			document.all("divfootnotes").style.visibility = "visible";
			toggleProductCheckbox(true, iControlIndex);
		}
	}
	
	 function setBeginPeriod(iIndex)
	 {

	 	var iyears;
		var imonths;
		var strbeginmonths;
	 // get years value
		var ddlobj;
		var ddlobjmonth;
		//alert("setbegin period " + iIndex);
		try
		{
			calculate_beginend_periods(iIndex);
			
	    }
	    catch (e)
	   {
	 // field 15 is disbled, we are hiding this info			
	        strbeginmonths=0;
	  /*  
	        document.all("TxtBeginPeriod" + iIndex.toString()).value = 0;
	        document.all("TxtEndPeriod" + iIndex.toString()).value = 0;
	*/
	   }
	   strbeginmonths = document.all("TxtBeginPeriod" + iIndex.toString()).value;
	
	  return strbeginmonths;
	}
	
	function  calculate_beginend_periods(iIndex)
	{
		var iyears;
		var imonths;
		var Nendyear;
		var Nendmonth;
		var strbeginmonths;
		var Ncalc;
		var strProductCode = getProductCode(iIndex);

		//alert("index calculate beginend " + iIndex);
		//alert("TxtEndPeriod -> " + TxtEndPeriod1.value);
	    ddlobj = document.all("ddlBeginPeriodYear" + iIndex.toString());
		ddlobjmonth = document.all("ddlBeginPeriodMonths" + iIndex.toString());

	    imonths= ddlobjmonth.options[ddlobjmonth.selectedIndex].value;
		iyears = ddlobj.options[ddlobj.selectedIndex].value;
		
		//alert("iyears -> " + iyears);
		document.all("ddlbeginM" + iIndex.toString()).value = ddlobjmonth.selectedIndex;
		
		document.all("ddlbeginY" + iIndex.toString()).value = ddlobj.selectedIndex;

		// translate the months to year/months and select that value in the dropdowns
		/*
		if ((strProductCode == "65M") || ((strProductCode == "37N")))		   
		{
			imonths = imonths;
			alert('ddlobj.selectedIndex -> ' + ddlobj.selectedIndex);
			if (ddlobj.selectedIndex == 0)
			{
				iyears = 43;
			}
			else
				iyears = iyears * 12;
	
			strbeginmonths = iyears; //+ parseInt(imonths) + parseInt(1);

		}
		else
		{
			imonths = imonths-1;   
			iyears = iyears-1;
			iyears = iyears * 12;
			strbeginmonths = parseInt(iyears) + parseInt(imonths) + parseInt(1);
		}
		*/
// translate the months to year/months and select that value in the dropdowns
	     imonths = imonths-1
	   
	    iyears = iyears-1
		iyears = iyears * 12;
	
		strbeginmonths = iyears + (imonths+1);
	
		/*if (!(strProductCode == "65M") || ((strProductCode == "37N")))		   
		{
			strbeginmonths = strbeginmonths -1;
		}
		alert ('strProductCode -> ' + strProductCode + '\nimonths -> ' + imonths + '\niyears -> ' + iyears + '\nstrbeginmonths  -> ' + strbeginmonths);
		*/
		//alert((!(strProductCode == "65M") || ((strProductCode == "37N"))))
		document.all("TxtBeginPeriod" + iIndex.toString()).value = strbeginmonths;
		
		ddlobj = document.all("ddlEndPeriodYear"+ iIndex.toString());
		ddlobjmonth = document.all("ddlEndPeriodMonths" + + iIndex.toString());
	    Nendmonth= ddlobjmonth.options[ddlobjmonth.selectedIndex].value;
		Nendyear = ddlobj.options[ddlobj.selectedIndex].value;
		
	    document.all("ddlendM" + iIndex.toString()).value = ddlobjmonth.selectedIndex;
		document.all("ddlendY" + iIndex.toString()).value = ddlobj.selectedIndex;
		 
		Ncalc = (Nendyear-1) * 12;
		
		Nendyear=0;
		Nendyear = parseInt(Ncalc) + parseInt(Nendmonth);
	//	alert("end year  " + Nendyear);
		document.all("TxtEndPeriod" + iIndex.toString()).value = Nendyear;
	
	}
	
	function setRateValues(iIndex,xmlRate)
	{
	
	   	
	    var nFloor;
		var nIRateCap;
		var nLifetimeCap;
		var nSubRateCap;
		var nCeiling;
		var nCBR;  // cap by rules flag
		var strproductcode;
		strproductcode = xmlRate.selectSingleNode("@ProductCode").text;
		nFloor = new Number(xmlRate.selectSingleNode("@Margin").text);
		
		// if blended product type - use AmortMargin as floor
		if (isBlendedRateProduct(iIndex))
		{
			nFloor = new Number(xmlRate.selectSingleNode("@AmortMargin").text);
		}
		
		try { 
			 nIRateCap = new Number(xmlRate.selectSingleNode("@LifeCap").text);
		} 
		catch(er) {
			nIRateCap=0;
		} 

		nSubRateCap = new Number(xmlRate.selectSingleNode("@SubsequentRateCap").text);
		//alert("sub rate cap " + nSubRateCap);
		nCeiling= new Number(xmlRate.selectSingleNode("@Ceiling").text);
		var nRate = new Number(xmlRate.selectSingleNode("@Rate").text);
		// calculate ceiling as initial rate + Initial rate cap(5%)
	
		
		//alert (" nRate " + nRate);
		
		/* TM21799
		var HypoRate;
			// if Hypothetical rate entered, use that rate instead
			HypoRate = document.all("txtHypoRate" + iIndex).value
			
			if (!(HypoRate == 0))
			{
				nRate = HypoRate;
				
			}
		*/
		//don't add ceiling, use rate + initial rate cap (this affect those not capped by rule)
		//uses initial rate or hypo rate
		//alert("nrate " + nRate);
		//alert("nIrateCap " + nIRateCap);
		nLifetimeCap = parseFloat(nRate) + parseFloat(nIRateCap);
		//alert("nlifetime " + nLifetimeCap);
	    var obj = getProductDropDown(iIndex);
		var nSAP;
		
		if (obj.selectedIndex > 0)
		{
			var arrValues = obj.options[obj.selectedIndex].value.split(",");
			//alert('arrValues' + arrValues);
			nCBR = new Number(arrValues[7].substr(4));			
		}
		
		var nlifetime;
	
	//	alert("ceiling " + nCeiling);
	//alert("nRate " + nRate);
		//alert(xmlRate.xml);
		//alert(nCBR);
		
		// perform Cap by rule logic if set to 1
		// Initial rate cap and subsequent rate cap are N/A - make them zero.
		if (nCBR==1)
		{
			
			//	alert("Nrate " + nRate);
			//   alert("nIRateCap" + nIRateCap);	
		// lifetimecap = 5% (rate cap) + initial rate
			nlifetime = parseFloat(nRate) + parseFloat(nIRateCap);
		//alert("lifetime " + nlifetime);
			
			//alert("nRate " + nRate);
		//	alert("nIrateCap " + nIRateCap);
		//alert("nlifetime = nrate + nIrateCap" + nlifetime);
	//	alert("nceiling " + nCeiling);
		//alert("Nlifetime " + nlifetime);
						// if life time calc > 12% (ceiling)  then use the greater amt, not the
			// ceiling amt, otherwise use the ceiling amt
			if (nlifetime > nCeiling)
			{
					nLifetimeCap = nlifetime;
					//alert("CBR - lifetimecap = lifetime" + nLifetimeCap);
			}
			else
			{
			// use ceiling amt, lifetime cap = Ceiling-nIRateCap
					nLifetimeCap = nCeiling 
				//	alert("CBR - lifetimecap = Ceiling-IRateCap" + nLifetimeCap);
			}
			
			//alert("final lifetime " + nLifetimeCap);
			
							
		}	
		
		// margin will be zero or positive value. If negative then floor = zero
		if (strproductcode == "H70" || strproductcode == "H72")
		{
				if (nFloor < 0) 
				{
					nFloor = 0;
				}
		}
				
		switch (iIndex.valueOf())
		{
			case 1:
				    
					document.all("floor1").Text = nFloor;
					document.all("initratecap1").Text = nIRateCap;
					document.all("subratecap1").Text = nSubRateCap;
					document.all("lifecap1").Text = nLifetimeCap;
					document.all("subceiling1").Text = nCeiling;
					document.all("initRate1").Text = nRate;
				//		alert("nSubRateCap" + nSubRateCap);
						
					break;
						
			case 2:
			
				    document.all("floor2").Text = nFloor;
					document.all("initratecap2").Text = nIRateCap;
					document.all("subratecap2").Text = nSubRateCap;
					document.all("lifecap2").Text = nLifetimeCap;
					document.all("subceiling2").Text = nCeiling;
					document.all("initRate2").Text = nRate;
				//	alert("nSubRateCap" + nSubRateCap);
					break;
			
			case 3:
			
				    document.all("floor3").Text = nFloor;
				    document.all("initratecap3").Text = nIRateCap;
					document.all("subratecap3").Text = nSubRateCap;
					document.all("lifecap3").Text = nLifetimeCap;
					document.all("subceiling3").Text = nCeiling;
					document.all("initRate3").Text = nRate;
					break;
			
		}
	
	//alert("floor" + nFloor);
	//	alert("IRate Cap" + nIRateCap);
	//		alert("Subsequent Rate Cap" + nSubRateCap);
		//		alert("LifeCap" + nLifetimeCap);
		//	alert("Ceiling" + nCeiling);		
	//	alert(nCBR);
	
	//iIndex - tells me which product code to load the values in
	
	}
	
	function ResetMonths(obj)
	{
		var iControlIndex = getControlIndex(obj).valueOf();

		// var obj = document.all("ddlAdjFrequency" + i);
		var ifrequency1 = obj.selectedIndex;
		document.all("ddlfrequency" + iControlIndex.toString()).value =  ifrequency1;
		_CHANGEDFREQ = true;
		//alert("reset")
		switch (ifrequency1)	
		{	  
			case 0:
				ifrequency=0;
 				break;
			case 1:
				ifrequency=1;
				break;
			case 2:
				ifrequency=2;
				break;
			default:
			//obj.selectedIndex = 0;
				ifrequency=0;	  
		}		  
		
		var strProductCode = getProductCode(iControlIndex);
		var strXPath = "NewDataSet/tblMLCCInternetRates[@ProductCode='" + strProductCode + "']";
		var xmlRates = document.all("xmlRates").XMLDocument;

		var xmlRateNodes = xmlRates.selectNodes(strXPath);	
		var xmlRate;
/*		
		alert("iControlIndex -> " + iControlIndex)
		alert("strXPath -> " + strXPath)
		alert("xmlRate -> " + xmlRateNodes[iControlIndex])
*/		
	
		if (xmlRateNodes[iControlIndex] != null)
		{	xmlRate = xmlRateNodes[iControlIndex];
		}
		else 
		{	xmlRate = xmlRateNodes[1];
		}
		
		var nLoanTerm = getLoanTerm(xmlRate).toString();
		nLoanTerm = nLoanTerm/12;

		/* alert(nLoanTerm); */
		// reset the months based on the new frequency
		reloadPeriodicRangeAdjs(iControlIndex,nLoanTerm,ifrequency);
			
	}
	
	function	RoundToNearestEighth(nInitialAdjRate)
	{
			var endpoint;
	 // Convert the number to a string
			var value_string = nInitialAdjRate.toString();
			var dIntegerPart;
		    var dFraction;
    
		    var ZERO_EIGHTHS  = 0;
			var ONE_EIGHTHS  = 125;
			var TWO_EIGHTHS  = 250;
			var THREE_EIGHTHS  = 375;
			var FOUR_EIGHTHS  = 500;
			var FIVE_EIGHTHS  = 625;
			var SIX_EIGHTHS  = 750;
			var SEVEN_EIGHTHS  = 875;
			var EIGHT_EIGHTHS  = 1000;
    
    
    // Locate the decimal point
			 var decimal_location = value_string.indexOf(".")

    // Is there a decimal point?
			 if (decimal_location != -1)
			  {
			       decimal_part_length = value_string.length - decimal_location - 1;
			       endpoint = decimal_location + decimal_part_length + 1
			       dFraction =   value_string.substring(decimal_location+1, endpoint);  
				 // we need to add a zero so we are testing on 3 decimals , the 
				 // math works better that way
				  if (dFraction.length < 2)
				   {
						dFraction = dFraction + '00';
				   }
				   if (dFraction.length < 3)
				   {
						dFraction = dFraction + '0';
				   }
				   if (dFraction.length > 3)
				   {
				   // just need the 3 places to round
						dFraction = dFraction.substring(0,3);
				   }
				   
			   }
			   else
			  {
					dFraction=0;
			  }
      
       //  alert("dfraction " + dFraction);
     		 endpoint = decimal_location-1;
			 dIntegerPart =  value_string.substring(1,endpoint);
// at this point we have the whole number and the fractional part of the rate
		
			if (dFraction >= ZERO_EIGHTHS && dFraction < ONE_EIGHTHS) 
			{
				dLower = dFraction - ZERO_EIGHTHS;
				dUpper = ONE_EIGHTHS - dFraction;
				dFraction = (dLower < dUpper ? ZERO_EIGHTHS : ONE_EIGHTHS);
			}
			
			
			if (dFraction >= ONE_EIGHTHS && dFraction < TWO_EIGHTHS) 
			   {
					dLower = dFraction - ONE_EIGHTHS;
					dUpper = TWO_EIGHTHS - dFraction;
					dFraction = (dLower < dUpper ? ONE_EIGHTHS : TWO_EIGHTHS);
			   }
			
			
			if (dFraction >= TWO_EIGHTHS && dFraction < THREE_EIGHTHS) 
			{
				dLower = dFraction - TWO_EIGHTHS;
				dUpper = THREE_EIGHTHS - dFraction;
				dFraction = (dLower < dUpper ? TWO_EIGHTHS :THREE_EIGHTHS);
			}
			if (dFraction >= THREE_EIGHTHS && dFraction < FOUR_EIGHTHS)
			 {
				dLower = dFraction - THREE_EIGHTHS;
				dUpper = FOUR_EIGHTHS - dFraction;
				dFraction = (dLower < dUpper ? THREE_EIGHTHS : FOUR_EIGHTHS);
			}
			if (dFraction >= FOUR_EIGHTHS && dFraction < FIVE_EIGHTHS) 
			{
				dLower = dFraction - FOUR_EIGHTHS;
				dUpper = FIVE_EIGHTHS - dFraction;
				dFraction = (dLower < dUpper ? FOUR_EIGHTHS : FIVE_EIGHTHS);
			}
			if (dFraction >= FIVE_EIGHTHS && dFraction < SIX_EIGHTHS)
			{
				dLower = dFraction - FIVE_EIGHTHS;
				dUpper = SIX_EIGHTHS - dFraction;
				dFraction = (dLower < dUpper ? FIVE_EIGHTHS : SIX_EIGHTHS);
			}
			if (dFraction >= SIX_EIGHTHS && dFraction < SEVEN_EIGHTHS) 
			{
				dLower = dFraction - SIX_EIGHTHS;
				dUpper = SEVEN_EIGHTHS - dFraction;
				dFraction =(dLower < dUpper ? SIX_EIGHTHS : SEVEN_EIGHTHS);
			}
			if (dFraction >= SEVEN_EIGHTHS && dFraction < EIGHT_EIGHTHS)
			 {
			   
				dLower = dFraction - SEVEN_EIGHTHS;
				dUpper = EIGHT_EIGHTHS - dFraction;
				dFraction = (dLower < dUpper ? SEVEN_EIGHTHS : EIGHT_EIGHTHS);
	     	}

// add a whole number for the rounding. we are rounding up one integer,no fractions
			if (dFraction == 1000)
			{
				var nAddInt;
				vAddInt = parseInt(dIntegerPart) + 1;
				return (vAddInt + '.' + '000');	
			}
			else
			{
			     return (dIntegerPart + '.' + dFraction);
			}
			

  
	}
	
	
	
	
	function setEndPeriodChange(obj)
	{
	
        var iControlIndex = getControlIndex(obj).valueOf();
	 	var Nendmonth;
	 	var Nendyear;
	 	//alert("starting setendperiodchange");
	 	ddlobj = document.all("ddlEndPeriodYear"+ iControlIndex.toString());
		ddlobjmonth = document.all("ddlEndPeriodMonths" + + iControlIndex.toString());

	    Nendmonth= ddlobjmonth.options[ddlobjmonth.selectedIndex].value;
		Nendyear = ddlobj.options[ddlobj.selectedIndex].value;
		var iholding = document.all("txtHoldingPeriod").value * 12;
	
		//alert("Nendyear " + Nendyear);
		
		Nendyear = (Nendyear-1) * 12;
		
	//	alert("Nendyear " + Nendyear);
		Nendyear = parseInt(Nendyear) + parseInt(Nendmonth);
	
	//	alert("Nendyear " + Nendyear);
		
		 var obj = document.all("ddlAdjFrequency" + iControlIndex.toString());
	      var ifrequency = obj.selectedIndex;	
	     
		// if semi annual, need to add 5 months since the range represents the start and
		//ending period, which has to include the 6 months inbetween adjustments
		if (ifrequency == 1)
		{
		  
			iEndYear = parseInt(Nendyear) + parseInt(5);
		}
		else
		{
			iEndYear = Nendyear;
		}
	
//alert("iholding " + iholding);
		if (iEndYear  > iholding)
		{
			iEndYear  = iholding;
								 
		}
		
		//alert("test2" + iControlIndex.toString());
		//alert("set end period " + iEndYear);
		document.all("TxtEndPeriod" + iControlIndex.toString()).value = iEndYear;
	
		document.all("ddlendM" + iControlIndex.toString()).value = ddlobjmonth.selectedIndex;
	
		document.all("ddlendY" + iControlIndex.toString()).value = ddlobj.selectedIndex;

	
	}
	
	function setCompareDisplay()
	{
		var n = getCompareCount();
		//alert("setCompareDisplay() -> " + n.valueOf());
		switch (n.valueOf())
		{
			case 1:
				document.all("divProduct1").style.visibility = "visible";	
				document.all("divProduct2").style.visibility = "hidden";
				document.all("divProduct3").style.visibility = "hidden";
				document.all("divRate1").style.visibility = "visible";
				document.all("divRate2").style.visibility = "hidden";
				document.all("divRate3").style.visibility = "hidden";
				
				setArmInputDisplay(1, getAmortType(1));
				document.all("divVarRate2").style.visibility = "hidden";
				document.all("divVarRate3").style.visibility = "hidden";
				document.all("divPerRate2").style.visibility = "hidden";
				document.all("divPerRate3").style.visibility = "hidden";
				document.all("divPerRateControls2").style.visibility = "hidden";
				document.all("divPerRateControls3").style.visibility = "hidden";
				break;
			case 2:
				
				document.all("divProduct1").style.visibility = "visible";
				document.all("divProduct2").style.visibility = "visible";
				document.all("divProduct3").style.visibility = "hidden";
				
				document.all("divRate1").style.visibility = "visible";
				document.all("divRate2").style.visibility = "visible";
				document.all("divRate3").style.visibility = "hidden";
				
				setArmInputDisplay(1, getAmortType(1));
				setArmInputDisplay(2, getAmortType(2));
			
				document.all("divVarRate3").style.visibility = "hidden";
				document.all("divPerRate3").style.visibility = "hidden";
				document.all("divPerRateControls3").style.visibility = "hidden";
				break;
			case 3:
				
				//CalculatePrefills(document.all["txtPropertyValue"]);
				
				document.all("divProduct1").style.visibility = "visible";
				document.all("divProduct2").style.visibility = "visible";
				document.all("divProduct3").style.visibility = "visible";
				document.all("divRate1").style.visibility = "visible";
				document.all("divRate2").style.visibility = "visible";
				document.all("divRate3").style.visibility = "visible";
				setArmInputDisplay(1, getAmortType(1));
				setArmInputDisplay(2, getAmortType(2));
				setArmInputDisplay(3, getAmortType(3));
				break;
			default:
				document.all("divProduct1").style.visibility = "visible";
				document.all("divProduct2").style.visibility = "hidden";
				document.all("divProduct3").style.visibility = "hidden";
				document.all("divRate1").style.visibility = "visible";
				document.all("divRate2").style.visibility = "hidden";
				document.all("divRate3").style.visibility = "hidden";
				setArmInputDisplay(1, getAmortType(1));
				document.all("divVarRate2").style.visibility = "hidden";
				document.all("divVarRate3").style.visibility = "hidden";
				document.all("divPerRate2").style.visibility = "hidden";
				document.all("divPerRate3").style.visibility = "hidden";
				document.all("divPerRateControls2").style.visibility = "hidden";
				document.all("divPerRateControls3").style.visibility = "hidden";
			break;
		}
		return;
	}
	function setCoordinates()
	{
		var sControlID = document.all("selDivName").value;
//		alert("setCoordinates(" + sControlID + ")");
		
		var objStyle = document.all(sControlID).style;
		var sCoords = "top: " + document.all("txtTop").value + " left: " + document.all("txtLeft").value + " height: " + document.all("txtHeight").value + " width: " + document.all("txtWidth").value;
		//alert(sCoords);
		objStyle.posHeight = parseFloat(txtHeight.value);
		
	}
	function setErrorFocus(obj, message)
	{
		if (obj.style != null) 
		{
		
			obj.style.borderColor="red";
		}
		alert(message);
		try
		{
			//obj.focus();
		}
		catch (e)
		{
		// possible this object is not visible, 
		}
	}
	
	function setLoanType(nLoanAmount, iIndex)
	{
		
		//alert("setLoanType(" + nLoanAmount.valueOf() + ", " + iIndex + ")");
		var iLoanType;
		var strWarning = "";
		var bShowWarning = new Boolean(false);
		
		if ( nLoanAmount.valueOf() > 0)
		{
			
//			alert('strProductCode ' + document.all(m_strProductDropDownNames[i]).selectedIndex);
			var strProductCode = document.all(m_strProductDropDownNames[i]).selectedIndex;
			if (strProductCode !=  0)
			{
				if ((strProductCode == "H70") || (strProductCode == "H72") || (strProductCode == "S21") || (strProductCode == "S22") || (strProductCode == "H20") || (strProductCode == "H23"))
				{
					if ( nLoanAmount.valueOf() > m_dEquityloanAmtLimt.valueOf() ) {
						iLoanType = new Number(m_iLoanTypeNonConforming.valueOf());
						bShowWarning = new Boolean(true);
						strWarning = "*Exceeds $2 Million";
						document.all[m_strLoanAmountNames[iIndex-1]].style.borderColor="red";
					}
				}
				else
				{
					if ( nLoanAmount.valueOf() > m_dLoanAmountLimit.valueOf() ) {
					iLoanType = new Number(m_iLoanTypeNonConforming.valueOf());
					bShowWarning = new Boolean(true);
					strWarning = "*Exceeds $3 Million";
					document.all[m_strLoanAmountNames[iIndex-1]].style.borderColor="red";
					}
				}
			}
			else
			{
				if ( nLoanAmount.valueOf() > m_dLoanAmountLimit.valueOf() ) {
				iLoanType = new Number(m_iLoanTypeNonConforming.valueOf());
				bShowWarning = new Boolean(true);
				strWarning = "*Exceeds $3 Million";
				document.all[m_strLoanAmountNames[iIndex-1]].style.borderColor="red";
				}
			}			
			if (bShowWarning == false)
			{
				document.all[m_strLoanAmountNames[iIndex-1]].style.borderColor="white";
				if (isNonConforming(nLoanAmount)){
					iLoanType = new Number(m_iLoanTypeNonConforming.valueOf());
					//alert("Non-Conforming:" + iLoanType.toString());
					bShowWarning = new Boolean(true);
					strWarning = "Non-Conforming";
				}
				else {
					iLoanType = new Number(m_iLoanTypeConforming.valueOf());
					//alert("Conforming:" + iLoanType.toString());
					bShowWarning = new Boolean(true);
					strWarning = "Conforming";
				}
			}

			m_iCurrentLoanTypes[iIndex-1] = iLoanType.valueOf();
			 var strProductCode = getProductCode(iIndex);
			// alert("index " + iIndex);
			 
		//	alert("product code in setloantype " + strProductCode);
			// alert("loantypes " + m_iCurrentLoanTypes[iIndex-1]);
			 if (strProductCode == "110")
			 {
				 strWarning = "Conforming";
			 }
			 if ((strProductCode == "A02") || (strProductCode == "12N"))
			 {
				 strWarning = "Non-Conforming";
			 }

			// alert("Warning " + strWarning);
			
			// if product type EA fixed, Blended, PFirst or EA - then display Non-conforming
			// regardless of loan amount
			if (isBlendedRateProduct(iIndex) || isPrimeFirstProduct(iIndex) || isEquityAccessARMProduct(iIndex) || isEquityAccessFIXEDProduct(iIndex))
			{
					strWarning = "Non-Conforming";
			}
			
		//	document.all[m_strAsteriskNames[iIndex-1]].style.visibility = (bShowWarning.valueOf()) ? "visible" : "hidden";
			//alert("index -> " + (iIndex-1) + "\ncomp prods -> " + getCompareCount()) 
			//Added this condition to support Firefox. The label's visibility in FF is not dependent on the parent's (in this case the DIV element)
			if ((iIndex-1) < getCompareCount())
			{
				document.all[m_strLoanAmountWarningNames[iIndex-1]].style.visibility = (bShowWarning.valueOf()) ? "visible" : "hidden";
				document.all[m_strLoanAmountWarningNames[iIndex-1]].innerHTML = strWarning;
			}
		}
		return;		
	}
	
	function setPeriodicDisplay(obj)
	{
		//alert("setPeriodicDisplay(" + obj.id + ")");
		var nControlIndex = getControlIndex(obj);
		var sControlID = "divPerRateControls" + nControlIndex.toString();
		var nPeriodicDivHeight = new Number(84);
		var nCount = getCompareCount();
										
		if (obj.checked)
		{
			document.all(sControlID).style.visibility = "visible";
			m_strPerRateVisibility[nControlIndex - 1] = "visible";
			
			// reset the months/years dropdown when user clicks product - could have
			// change holding period
			var obj = document.all("ddlAdjFrequency" + nControlIndex.toString());
			var ifrequency = obj.selectedIndex;
			var objRateDropDown = document.all(m_strRateDropDownNames[nControlIndex -1]);
			
			var strProductCode = getProductCode(nControlIndex);
			  
			//   alert("product code - set periodic display " + strProductCode);
			try
			{
				strID = objRateDropDown.options[objRateDropDown.selectedIndex].value;
			}
			catch (e)
			{
			// this error will occur when the users hits the back button
			// rates are not re-loaded, so refreshpricing will load the rates
			// and set it back to the default. 
			  	refreshPricing(nControlIndex);
			   	strID = objRateDropDown.options[objRateDropDown.selectedIndex].value;

			}
			var strXPath = "NewDataSet/tblMLCCInternetRates[@ID='" + strID + "']";
		//  var strXPath = "NewDataSet/tblMLCCInternetRates[@ProductCode='" + strProductCode + "']";
		 		 	   
			var xmlRates = document.all("xmlRates").XMLDocument;
			var xmlRateNodes = xmlRates.selectNodes(strXPath);
			var xmlRate;
			xmlRate = xmlRateNodes[0];
			var nLoanTerm = getLoanTerm(xmlRate).toString();
			nLoanTerm = nLoanTerm/12;
	     // reset the months based on the new frequency
	        reloadPeriodicRangeAdjs(nControlIndex,nLoanTerm,ifrequency);
	
			onBeginPeriodChange(document.all("txtBeginPeriod" + nControlIndex.toString()));
		
		    var ddlobjmonth = document.all("ddlEndPeriodMonths" + nControlIndex.toString());
		    var ddlobj = document.all("ddlEndPeriodYear" + nControlIndex.toString());
		//	var ddlobjmonth = document.all("ddlEndPeriodMonths" + nControlIndex.toString());
			  
		//  index of end year selected - load if not already loaded
			if (document.all("ddlendM" + nControlIndex.toString()).value == ""){
				document.all("ddlendM" + nControlIndex.toString()).value = ddlobjmonth.selectedIndex;
			}
				
			if (document.all("ddlendY" + nControlIndex.toString()).value == ""){
				document.all("ddlendY" + nControlIndex.toString()).value = ddlobj.selectedIndex;
			}
		}
		else
		{
		// zero out initial adj rate
		   
		    document.all("txtSubsequentAdj" + nControlIndex.toString()).value = "0.000";
		    
			document.all(sControlID).style.visibility = "hidden";
			m_strPerRateVisibility[nControlIndex - 1] = "hidden";
			toggleInitialAdjRate(false, nControlIndex.valueOf());
		}
		
		for (j=0; j<nCount.valueOf(); j++)
		{
			if (m_strPerRateVisibility[j] == "visible")
			{
				nPeriodicDivHeight = new Number(355);
				break;
			}
		}
				
		document.all("divPeriodicRateContainer").style.posHeight = nPeriodicDivHeight.valueOf();
			
	}
	function toggleInitialAdjRate(bValue, i)
	{
		var b = new Boolean(bValue);
		if(b.valueOf())
		{
			document.all(m_strInitialAdjRateNames[i - 1]).readOnly = true;
			document.all(m_strInitialAdjRateNames[i - 1]).style.backgroundColor = "lightgrey";
		}
		else
		{
			document.all(m_strInitialAdjRateNames[i - 1]).readOnly = false;
			document.all(m_strInitialAdjRateNames[i - 1]).style.backgroundColor = "white";
		}
		return;	
	}
	
	function toggleProductCheckbox(bValue, i)
	{
	  
		var b = new Boolean(bValue);
	 
		if(b.valueOf())
		{
			
			document.all("chkPerRate" + i).disabled = false;
		}
		else
		{
			
		    	var sControlID = "divPerRateControls" + i.toString();
				document.all(sControlID).style.visibility = "hidden";
			    m_strPerRateVisibility[i - 1] = "hidden";
			    toggleInitialAdjRate(false, i.valueOf());
		        document.all("chkPerRate" + i).checked =false;
			    document.all("chkPerRate" + i).disabled = true;
			
		}
		return;	
	}
	
	
	function togglerates(obj)
	{
		   
		   
			var iControlIndex = getControlIndex(obj).valueOf();
			if (obj.value == "0" || obj.value == "")
			{
				obj.value = "";
				document.all("ddlRates" + iControlIndex).disabled=false;
			}
			else
			{
			// disable the rates, so reset to default rates
				refreshPricing(iControlIndex);
				document.all("ddlRates" + iControlIndex).disabled=true;
			}
			
			
	}
	
		function up_percent(i)
	{
			var nDPP = document.all("txtPercentDownPayment" + i).value;
					
			nDPP = parseInt(nDPP) + parseInt(m_dIncrement.valueOf());
			if (nDPP > 100)
			{
				nDPP = 100;
			}
					
			sDPP = round(nDPP, 3).toString();
		    document.all("txtPercentDownPayment" + i).value =sDPP;
		    document.all[m_strDPPercentNames[i-1]].value = sDPP;
		    
		    updateDPDolFromPCT(i);
		  
    		    
		
						
	}
	
	function CalculatePrefills(obj)
	{
		//property value passed as argument...
		var nPV = new Number(sfStripDollar(sfStripComma(obj.value)));
		
		//downpayment percent
		var nDP1P = new Number(sfStripPercent(document.all["txtPercentDownPayment1"].value))/100;
		var nDP2P = new Number(sfStripPercent(document.all["txtPercentDownPayment2"].value))/100;
		var nDP3P = new Number(sfStripPercent(document.all["txtPercentDownPayment3"].value))/100;
		
		//downpayment amounts
		var nDP1D = new Number(nPV.valueOf() * nDP1P.valueOf());
		var nDP2D = new Number(nPV.valueOf() * nDP2P.valueOf());
		var nDP3D = new Number(nPV.valueOf() * nDP3P.valueOf());
		
		
		//transfer downpayment percents to display if applicable
		if (nPV.valueOf() == 0)
		{
			document.all["txtPercentDownPayment1"].value = "0%";
			document.all["txtPercentDownPayment2"].value = "0%";
			document.all["txtPercentDownPayment3"].value = "0%";
		}

		//transfer downpayment amounts to display
		document.all["txtAmountDownPayment1"].value = FmtComma(nDP1D.toString());
		document.all["txtAmountDownPayment2"].value = FmtComma(nDP2D.toString());
		document.all["txtAmountDownPayment3"].value = FmtComma(nDP3D.toString());
		
		//alert('txtAmountDownPayment3 -> ' + document.all["txtAmountDownPayment3"].value);
		//update loan amounts to display
		updateLoanAmount(nPV, nDP1D, 1, obj)
		updateLoanAmount(nPV, nDP2D, 2, obj)
		updateLoanAmount(nPV, nDP3D, 3, obj)
//		alert('All done');
		//put the property value back
		obj.value = FmtComma(nPV.toString());
	
	}
	
	//update downpayment dollars from property value handles the onChange() event for the txtPropertyValue field.
	//it recomputes the downpayment based on the new property value and the previously entered downpayment percentages.
	//downpayment percentages are defaulted to 20% on the intial page load. this function also calls updateLoanAmounts
	//which recomputes the loan amounts, and ltvs, transfering all of these values to their associated fields.
	function updateDPDolFromPV(obj)
	{
//		alert("updateDPDolFromPV");
		
		if (sfStripDollar(sfStripComma(obj.value)) >= 10000000)
		{
		          	 setErrorFocus(obj, "The maximum Property value/Purchase price must be below $10 million. Properties $10 million and over require special handling. Please contact Merrill Lynch Credit Corporation for more information." );

		         return false;
		}
		var bNoError = new Array(new Boolean(false), new Boolean(false), new Boolean(false));
		
		CalculatePrefills(obj);
		// if product code was already selected, re-test loan amount requirements
		try
		{
		/*
			var strProductName = getProductName(1);
			var obj = getProductDropDown(1);  
  			var arrValues = obj.options[obj.selectedIndex].value.split(",");
            var strproductcode = new String(arrValues[1].substr(2));
			//var  strID = objRateDropDown.options[objRateDropDown.selectedIndex].value;
			//validateLoanChanges(1,strproductcode);
		*/
			
			document.all(m_strProductDropDownNames[0]).selectedIndex = 0;			
			refreshPricing(1);
			
	    }
		catch (e)
		{
		// no problem, just continue testing other loan amounts
		}
		
		try
		{
		/*
			var strProductName = getProductName(2);
			var obj = getProductDropDown(2);  
  			var arrValues = obj.options[obj.selectedIndex].value.split(",");
            var strproductcode = new String(arrValues[1].substr(2));
			validateLoanChanges(2,strproductcode);
		*/
			document.all(m_strProductDropDownNames[1]).selectedIndex = 0;			
			refreshPricing(2);
	    }
		catch (e)
		{
		// no problem, just continue testing other loan amounts
		}
		try
		{
		/*
			var strProductName = getProductName(3);
			var obj = getProductDropDown(3);  
  			var arrValues = obj.options[obj.selectedIndex].value.split(",");
            var strproductcode = new String(arrValues[1].substr(2));
			validateLoanChanges(3,strproductcode);
		*/
			document.all(m_strProductDropDownNames[2]).selectedIndex = 0;			
			refreshPricing(3);
	    }
		catch (e)
		{
		// no problem, just continue testing other loan amounts
		}
		
		
	}
	//Update Down Payment Dollar Amount from Laon to Value Ratio
	
	function UpdateDPDolFromLTV(i)
	{
		//alert("UpdateDPDolFromLTV");
		var obj = document.all[m_strLTVNames[i-1]];		
		var tmpLTV = sfStripDollar(sfStripComma(obj.value));
	//	alert(tmpLTV.substring(0, tmpLTV.length -1));
		
		if (tmpLTV.lastIndexOf("%") > 0)
		{
			var nLTV = new Number(tmpLTV.substring(0, tmpLTV.length -1));		
		}
		else
		{
			var nLTV = new Number(tmpLTV);		
				
		}
		//alert(nLTV);
		var nPV = new Number(sfStripDollar(sfStripComma(document.all["txtPropertyValue"].value)));

		//checks before proceeding to calculate the Down Payment and DP Percentage
		if (nPV == 0)
		{		
			setErrorFocus(document.all["txtPropertyValue"],'Please enter a property value');
			return false;
		}
		
//		alert(nLTV);	
		//Calculate the Down Payment			
		var nDPD = new Number(nPV.valueOf() - (nLTV.valueOf()/100 * nPV.valueOf()));
		document.all[m_strDPDollarNames[i-1]].value = FmtComma(nDPD.toString());
		
//		alert(nDPD);	
		//Calculate the PCT
		updateDPPctFromDol(i);
		
		document.all[m_strDPDollarNames[i-1]].value = FmtComma(nDPD.toString());
		
		//update loan amount to display
		updateLoanAmount(nPV, nDPD, i, obj);
		
		 
/*
		var obj = getProductDropDown(i);  
	  	var arrValues = obj.options[obj.selectedIndex].value.split(",");
	  	// no product has been selected, skip next process
		if (arrValues == -1)
		{
			return;
		}
	    
	    strproductcode = new String(arrValues[1].substr(2));
*/			
//	    validateLoanChanges(i,strproductcode)
	    validateLoanChanges(i)
			
	}
	
	//end of UpdateDPDolFromLTV
	
	//Update Down Payment Dollar Amount from Loan Amount 
	
	function UpdateDPDolFromLA(i)
	{
//		alert("UpdateDPDolFromLA");
		var obj = document.all[m_strLoanAmountNames[i-1]];		
		var nLA = new Number(sfStripDollar(sfStripComma(obj.value)));
		var nPV = new Number(sfStripDollar(sfStripComma(document.all["txtPropertyValue"].value)));
		//checks before proceeding to calculate the Down Payment and DP Percentage
		if (nPV == 0)
		{		
			setErrorFocus(document.all["txtPropertyValue"],'Please enter a property value');
			return false;
		}
		if (nPV < nLA)
		{		
			setErrorFocus(obj,'Loan amount value cannot exceed property value');
			return false;
		}
		
		
		//Calculate the Down Payment			
		var nDPD = new Number(nPV.valueOf() - nLA.valueOf());
		document.all[m_strDPDollarNames[i-1]].value = FmtComma(nDPD.toString());
		
		//Calculate the PCT
		updateDPPctFromDol(i)		
		
		//update loan amount to display
		updateLoanAmount(nPV, nDPD, i, obj);
		
		 
/*
		var obj = getProductDropDown(i);  
	  	var arrValues = obj.options[obj.selectedIndex].value.split(",");
	  	// no product has been selected, skip next process
		if (arrValues == -1)
		{
			return;
		}
	    strproductcode = new String(arrValues[1].substr(2));
*/			
//	    validateLoanChanges(i,strproductcode)
	    validateLoanChanges(i)

		/*
		if (!(refreshPricing(i)))
			return false;
		*/

		refreshPricing(i);
/*
// Added by rekha to fix the IOF problem.
		var objRateDropDown = document.all(m_strRateDropDownNames[i-1]);
		selectRate(objRateDropDown);
*/
		setArmInputDisplay(i, getAmortType(i));			
	}
	
	//end of UpdateDPDolFromLA
	
	function updateDPDolFromPCT(i)
	{
		//alert("updateDPDolFromPCT");
		var obj = document.all[m_strDPPercentNames[i-1]];
		var sDPP;
		var nPV = new Number(sfStripDollar(sfStripComma(document.all["txtPropertyValue"].value)));
		var nDPP = new Number(sfStripPercent(obj.value))/100;
	
		//maximum limited to 100%
		if (nDPP.valueOf() > 1)
		{
			nDPP = 1;
		}
		else
		{
			//minimum limited to 0%
			if (nDPP.valueOf() < 0)
			{
				nDPP = 0;
			}
		}
		var nDPD = new Number(nPV.valueOf() * nDPP.valueOf());
		
		nDPP *= 100;
		sDPP = round(nDPP, 3).toString();	
		document.all("txtdownpercent" + i).value = sDPP;
		document.all[m_strDPDollarNames[i-1]].value = FmtComma(nDPD.toString());
		document.all[m_strDPPercentNames[i-1]].value = sDPP.toString() + "%";
		
		//update loan amount to display
		updateLoanAmount(nPV, nDPD, i, obj);
		
		 
/*
		var obj = getProductDropDown(i);  
		
	  	var arrValues = obj.options[obj.selectedIndex].value.split(",");
	  	// no product has been selected, skip next process
		if (arrValues == -1)
		{
			return;
		}
	    strproductcode = new String(arrValues[1].substr(2));

*/			
	    //validateLoanChanges(i,strproductcode)
	    validateLoanChanges(i)
		
		/*
		if (!(refreshPricing(i)))
			return false;
		*/

		refreshPricing(i);
		setArmInputDisplay(i, getAmortType(i));			
			
	}

	function updateDPPctFromDol(i)
	{
//		alert("updateDPPctFromDol");
		var obj = document.all[m_strDPDollarNames[i-1]];
		var sDPP;
		var nPV = new Number(sfStripDollar(sfStripComma(document.all["txtPropertyValue"].value)));
		var nDPD = new Number(sfStripDollar(sfStripComma(obj.value)));
		nDPD = Math.round(nDPD);
		
//		alert("nPV = " + nPV + '\n nDPD = ' + nDPD);
		
		//limits downpayment to the property value
		if(nDPD.valueOf() > nPV.valueOf())
		{
			nDPD = nPV;
		}
		var nDPP = new Number(nDPD.valueOf()/nPV.valueOf())*100;	
		sDPP = round(nDPP, 3).toString()
		document.all("txtdownpercent" + i).value = sDPP;
		document.all[m_strDPDollarNames[i-1]].value = FmtComma(nDPD.toString());
		document.all[m_strDPPercentNames[i-1]].value = sDPP.toString() + "%";
		
		//update loan amount to display
		updateLoanAmount(nPV, nDPD, i, obj);
	}
	
	
	//AR Working on 
	function updateLoanAmount(nPV, nDPD, i, obj)
	{
//		alert("updateLoanAmount" + i.toString());
		
		//loan amount
		var nLA = new Number(nPV.valueOf() - nDPD.valueOf());
		nLA = nLA.toFixed(0);
		
		//ltv
		var nLTV;
		if (nPV.valueOf() > 0) { //don't want to divide by zero!
			nLTV = new Number(nLA.valueOf() / nPV.valueOf());
		}
		else {
			nLTV = 0;
		}
		
		//transfer loan amount to display
		document.all[m_strLoanAmountNames[i-1]].value = FmtComma(nLA.toString());

		//transfer ltv to display			
		document.all[m_strLTVNames[i-1]].value = (round((nLTV * 100), 2).toString() + "%");
		
					
		//when the loan amount crosses the conforming threshold, the pricing becomes invalid, this call refreshes the pricing
//		alert("(isNewLoanType(nLA, i))-> " + isNewLoanType(nLA, i))
		if (isNewLoanType(nLA, i)){
		   
		    setLoanType(nLA, i);
			refreshPricing(i);
		}
		else
		{
		//set the warning label's visibility for non-conforming or invalid loans
			setLoanType(nLA, i);	
		}	

		setArmInputDisplay(i, getAmortType(i));			

	
	}

// force only numbers in the initial adjustment field
	function validnumber(elem,e) {
			key = getkey(e);
	
			if (key == null) 
				return false;

			keychar = String.fromCharCode(key);
		
			if (keychar >= 0 && keychar <= 9 || keychar == ".")
			{
	
				return true;
			
			}
			else
			{
				
				return false;
			}
		}
		
	
		function getkey(e)
		{
			if (window.event)
				return window.event.keyCode;
			else if (e)
				return e.which;	
			else
			return null;
		}



	function  validateproductcheckbox(obj)
	{
		// remove any decimals values, just integer allowed
		obj.value = parseInt(obj.value);
		
		var iControlIndex = getControlIndex(obj).valueOf();
	
		// if no product code selected, then skip test
		var strbeginmonths;
		var i=0;
		try
		{
			for (i=1; i<4; i++)
	     	{
	         
		        iyears = getInitAdjPeriod(i);
	     
		   		iyears = parseInt(iyears)/12; 
		     		     	       
			//	alert("iyears " + iyears);
			//	alert("obj " + obj.value);
				
	             if (iyears  >= obj.value)
			     {
								
				         toggleProductCheckbox(false, i);
			     }
		         else
			     {
				 			  
				      var obj = document.all("ddlAdjFrequency" + i);
					  var ifrequency = obj.selectedIndex;
					  var obj = getProductDropDown(i);  
	  				  var arrValues = obj.options[obj.selectedIndex].value.split(",");
				      var objRateDropDown = document.all(m_strRateDropDownNames[i-1]);

			          strproductcode = new String(arrValues[1].substr(2));
					  var  strID = objRateDropDown.options[objRateDropDown.selectedIndex].value;
			
				      var strXPath = "NewDataSet/tblMLCCInternetRates[@ID='" + strID + "']";
				
										  
				    //  var strXPath = "NewDataSet/tblMLCCInternetRates[@ProductCode='" + strProductCode + "']";
					   var xmlRates = document.all("xmlRates").XMLDocument;
			
				   	   var xmlRateNodes = xmlRates.selectNodes(strXPath);
					   var xmlRate;
						
					   xmlRate = xmlRateNodes[0];
									  
					  var nLoanTerm = getLoanTerm(xmlRate).toString();
					  nLoanTerm = nLoanTerm/12;
					//  alert("validatecheckbox - right before resetperiods" + nLoanTerm);
					//	alert("frequency " + ifrequency);
						
				      reloadPeriodicRangeAdjs(i,nLoanTerm,ifrequency);
				       var Nendyear;
					  var Nendmonth;
					   ddlobj = document.all("ddlEndPeriodYear"+ i.toString());
						ddlobjmonth = document.all("ddlEndPeriodMonths" + + i.toString());

						Nendmonth= ddlobjmonth.options[ddlobjmonth.selectedIndex].value;
						Nendyear = ddlobj.options[ddlobj.selectedIndex].value;
						
						var ncalc;
						ncalc = ((Nendyear-1) * 12);
						
						Nendyear = parseInt(ncalc) + parseInt(Nendmonth);
						//alert("nendyear " + Nendyear);
		// if semi annual, need to add 5 months since the range represents the start and
		//ending period, which has to include the 6 months inbetween adjustments
				    	if (ifrequency == 1)
						{
		  
							iEndYear = parseInt(Nendyear) + parseInt(5);
						}
						else
						{
							iEndYear = Nendyear;
						}
						//alert("iEndYear after calc " + iEndYear);
						var iholding = document.all("txtHoldingPeriod").value * 12;
						// convert to months
						nLoanTerm = parseInt(nLoanTerm) * 12;
						if (nLoanTerm < iholding)
						{
								iEndYear  = nLoanTerm;
								 
						}
						
						
					//	alert("end months " + iEndYear);
					///	document.all("TxtBeginPeriod" + iControlIndex.toString()).value = strbeginmonths;
						
						//alert("test1" + iControlIndex.toString());
						document.all("TxtEndPeriod" + i.toString()).value =iEndYear;
	
				      toggleProductCheckbox(true, i);
			    }
			}
		}
		catch(e)
		{
		// comes here is noproduct was selected, no error, 
		
		}
	
	// test holding period, in case it has changed
		if (isValidHoldingPeriod(document.all("txtHoldingPeriod")))
		{
			return true;
		}
		else
		{
			return false;
		}
				
	}

	function  validatereturninvestment(obj)
	{
		
		// remove any decimals values, just integer allowed
		if (obj.value != "")
		{
			
			//obj.value = parseInt(obj.value);
		
		if (obj.value < 0 || obj.value > 15)
		{
			setErrorFocus(obj, 'Enter an Expected Return on Investments between 0% and 15%. (Use 0% if you do not intend to invest monthly payment savings in an investment vehicle.)');
			return false;
		}
		else
		{
			return true;
		}
	  }
	  else
	  {
		return true;
	  }
	}

// this function simply test on loan amount given a product code, we know
// the product code is selected, this is triggered by the Increase/decrease buttons

	function validateLoanChanges(i)
	{
	    var iLoanObj =  document.all("txtLoanAmount" + i);
	    var nLoanAmount = new Number(sfStripDollar(sfStripComma(iLoanObj.value)));

		//PCTUP00316186
		var obj = getProductDropDown(i);  
		var arrValues = obj.options[obj.selectedIndex].value.split(",");
	  	// no product has been selected, skip next process
		if (arrValues == -1)
		{
			return;
		}

		strProductName = obj.options[obj.selectedIndex].text;
		
		//we don't know what the product is until we know how big the loan is (conforming vs. non-conforming)
		if (isNonConforming(nLoanAmount))
		{
			strproductcode = new String(arrValues[2].substr(2));
		}
		else
		{
			strproductcode = new String(arrValues[1].substr(2));
		}

		//PCTUP00347206
		if (strproductcode == "510" && nLoanAmount > 417000)
		{
			setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts above $417,000. Please select another product." );
			return false;
		}	 

		//TM22181
		//PCTUP00316186
		if (strproductcode == "520" && nLoanAmount > 417000)
		{
			setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts above $417,000. Please select another product." );
			return false;
		}	 
		if (strproductcode == "535" && nLoanAmount > 417000)
		{
			setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts above $417,000. Please select another product." );
			return false;
		}	 
		if (strproductcode == "542" && nLoanAmount > 417000)
		{
			setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts above $417,000. Please select another product." );
			return false;
		}	 
		
		//TM21119 changed m_nEAFixedMaxLoanAmount to 350000
		if ((strproductcode == "S20" || strproductcode == "S21" || strproductcode == "S22" || strproductcode == "S23") &&  (nLoanAmount > m_nEAFixedMaxLoanAmount.valueOf()))
		{
			setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts above $350,000." );
			return false;
		}
		if ((strproductcode == "S20" || strproductcode == "S21" || strproductcode == "S22" || strproductcode == "S23") &&  (nLoanAmount < 20000))
		{
			setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts below $20,000." );
			return false;
		}
		
		if ((nLoanAmount < 417001) && (strproductcode == "554" ))
		{
			setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts below $417,001." );
			return false;
		}

		//PCTUP00533234 - Mortgage Comparison Calculator Equity Minimum Loan Amount Revision
		if ((nLoanAmount < 50000) && (strproductcode == 'H70'))
		{
			setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts below $50,000." );
			return false;
		}
					
		//PCTUP00533234 - Mortgage Comparison Calculator Equity Minimum Loan Amount Revision
		if ((nLoanAmount < 50000) && (strproductcode == 'H72'))
		{
			setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts below $50,000." );
			return false;
		}
		
		//TM21035 - m_nNonEAMinimumLoanAmount.valueOf() Default minimum loan amount is $10,000 on first lien products
		if (nLoanAmount < m_nNonEAMinimumLoanAmount.valueOf())
		{
			setErrorFocus(iLoanObj, "The " + strProductName + " is not available for loan amounts below $10,000." );
			return false;
		}
		
		if ((strproductcode == "H70") || (strproductcode == "H72") || (strproductcode == "S21") || (strproductcode == "S22") || (strproductcode == "H20") || (strproductcode == "H23"))
		{
			if (nLoanAmount > m_dEquityloanAmtLimt) //PCTUP00457627
			{
				var strMM = m_dEquityloanAmtLimt.toString().substr(0,1);

				setErrorFocus(iLoanObj, "The Loan Amount is more than $" + strMM + " million. For Home Equity Lines of Credit we are able to offer loans up to $" + strMM + " million on our Web site. Loans over $" + strMM + " million for Home Equity Lines of Credit require special handling. Please visit the contact us page for more information." );
				iLoanObj.value = 0;				
				return false;
			}
		}
		else
		{
			if (nLoanAmount > 3000000) //TM 12413 from $2M to $3M
			{
				setErrorFocus(iLoanObj, "The loan amount is more than $3 million. We are able to offer loans up to $3 million on our Web site. Loans over $3 million require special handling. Please contact us for more information" );
				iLoanObj.value = 0;				
				return false;
			}
		}
		/* ------------------------------------------------------------------------------------------ 
			* Commented by AR 11/23 as per change requests
			*/	
		var nPV = new Number(sfStripDollar(sfStripComma(document.all["txtPropertyValue"].value)));
		if (nPV < nLoanAmount)
		{
			setErrorFocus(iLoanObj, "The loan amount value cannot exceed the property value" );
			return false;
		}
	}

	function validateLoanAmount(i)
	{
		//alert("validateLoanAmount(" + i.toString() + ")");
		var bReturn = new Boolean(true);
		var j;
		if (i == 0) {
			for (j=0; j<3; j++) {
				if (!isValidLoanAmount(j+1)) {
					handleInvalidLoanAmount(j+1);
					bReturn = new Boolean(false)
					break;
				}				
			}
		}
		else {
			if (!isValidLoanAmount(i)) {
				handleInvalidLoanAmount(i);
				bReturn = new Boolean(false);
			}				
		}
		
		
		return bReturn.valueOf();
	}

	function validateProductSelection()
	{
		//alert("validateProductSelection()");
		var bReturn = new Boolean(true);
		var i = 0;
		var iCount = getCompareCount();
		var obj;
		var iAdjRate;
		var iFloor;
		var iLifeTime;
		var iCeiling;
		var iSubRate;
		var strProductName;
		var iSubAdjRate;
		var iRateObj;
		var iSubRateObj;
		var  objDir;
		var atrDirection;
		var iRate;
		var strProductCode1, strProductCode2, strProductCode3;
		
		// document.all("initratecap3").Text = nIRateCap;
		//			document.all("subratecap3").Text = nSubRateCap;
		//			document.all("lifecap3").Text = nLifetimeCap;
		//			document.all("subceiling3").Text 
		
		var ierror;
		ierror=0;
		
		// test on ROI, can't be more than 15%
		var objROI;
		objROI = document.all("txtinvestmentROR");

		if (objROI.value < 0 || objROI.value > 15)
		{
			
			setErrorFocus(objROI, 'Enter an Expected Return on Investments between 0% and 15%. (Use 0% if you do not intend to invest monthly payment savings in an investment vehicle.)');
			bReturn = new Boolean(false);
			return bReturn.valueOf();
		}
		
		
		
		var str;			
		for (i=0; i<iCount; i++)
		{
			obj = document.all(m_strProductDropDownNames[i]);

			//PCTUP00316186
			//TM22181
			//str = new String(obj.options[obj.selectedIndex].text);
			//if((obj.selectedIndex <= 0) || (str == "Not Available"))
			if(obj.selectedIndex <= 0)
			{
				setErrorFocus(obj, "Please Select a Product")
				bReturn = new Boolean(false);
				break;
			}
			else
			{
			var nAmortType;
			// starts at zero - so add one, so we get the first/next product code
			nAmortType = getAmortType(i+1);
			
			// if nAmortType = 1  then edit the initial adjustment, etc
			// and the amount of adjustment, years/months are visible
			// if they are not, there is no need to edit that data
			
			var index = i + 1;
			var sRateHidden;
			sRateHidden = document.all("divPerRateControls"+ index).style.visibility;
		//	alert("rate hidden " + sRateHidden);
			if (nAmortType.valueOf() == 1)// && sRateHidden == "visible")
			{
		     // no need to test on these values, they are hidden
					strProductName = obj.options[obj.selectedIndex].text;
			
			//rekha
			// test Initial adjustment rate if entered for each product code
			
			    switch (i.valueOf())
		        {
				  case 0:
					iRateObj =  document.all("txtInitAdjRate1");
					iAdjRate = document.all("txtInitAdjRate1").value;
					iSubRateObj = document.all("txtSubsequentAdj1");
					iSubAdjRate = document.all("txtSubsequentAdj1").value;
					iFloor = document.all("floor1").Text;
					iLifeTime = document.all("lifecap1").Text;
					iSubRate = document.all("subratecap1").Text;
					objDir = document.all("ddlAdjDirection1");
					strDirection = objDir.options[objDir.selectedIndex].text;
					iRate = document.all("initRate1").Text;	
					strProductCode = getProductCode(1);
					//alert("strProductCode -> " + strProductCode);

				    /*alert("Direction " + strDirection);
					alert("rate cap1 " + iSubRate);
					alert("init adj rate " + iAdjRate);
					alert("iRate " + iRate);
					iAdjRate + iSubAdjRate
				  */
				  
					break;
						
				case 1:
					iRateObj =  document.all("txtInitAdjRate2");
					iAdjRate = document.all("txtInitAdjRate2").value;
					iSubRateObj = document.all("txtSubsequentAdj2");
					iSubAdjRate = document.all("txtSubsequentAdj2").value;
					iFloor = document.all("floor2").Text;
					iLifeTime = document.all("lifecap2").Text;
					iSubRate = document.all("subratecap2").Text;
					objDir = document.all("ddlAdjDirection2");
					strDirection = objDir.options[objDir.selectedIndex].text;
					iRate =  document.all("initRate2").Text;	
					strProductCode = getProductCode(2);
					//alert("strProductCode -> " + strProductCode);
					// alert("Direction " + strDirection);
					// alert("rate cap2 " + iSubRate);
					break;
					
				case 2:
					iRateObj =  document.all("txtInitAdjRate3");
					iAdjRate = document.all("txtInitAdjRate3").value;
					iSubRateObj = document.all("txtSubsequentAdj3");
					iSubAdjRate = document.all("txtSubsequentAdj3").value;
					iFloor = document.all("floor3").Text;
					iLifeTime = document.all("lifecap3").Text;
					iSubRate = document.all("subratecap3").Text;
					objDir = document.all("ddlAdjDirection3");
					strDirection = objDir.options[objDir.selectedIndex].text;
					iRate =  document.all("initRate3").Text;	
					strProductCode = getProductCode(3);
					//alert("strProductCode -> " + strProductCode);

					break;
					
					
				}
					
					// must have these value to test on, if floor or lifetime
					// is zero, it could be a interest only where init adj is n/a
					// life time cap would be zero			
					// if  (!(iAdjRate == 0) && !(iFloor == 0) &&  !(iLifeTime == 0)) 
					// floor can be zero, since the adj rate must be less then floor or
					// greater then lifetime.
					// alert('iRate -> ' + iRate + '\nRate Cap -> ' + iSubRate + '\n' + 'imin -> ' + (iRate - iSubRate) + '\niMax' + (iRate + iSubRate) )
					// alert(strProductCode);
					if (!(iAdjRate == 0) &&   !(iLifeTime == 0)) 

					{
							if ((strProductCode == "61M") || (strProductCode == "65M") || (strProductCode == '37N') || (strProductCode == '37C'))
							{
								if (iAdjRate < (iRate - iSubRate) || iAdjRate > (iRate + iSubRate))
								{
									setErrorFocus(iRateObj, "Initial adjustment interest rate for " + strProductName + " should be between " + (iRate - iSubRate).toFixed(3) + "% and " + (iRate + iSubRate).toFixed(3) + "%");									
									bReturn = new Boolean(false);
									ierror=1;
								}
							}
							else
							{
								//alert('iAdjRate -> ' + iAdjRate + '\niFloor -> ' + iFloor + '\n' + 'iLifeTime -> ' + iLifeTime + '\n' + document.all(m_strRateDropDownNames[1]).selectedIndex )

								if (iAdjRate < iFloor || iAdjRate > iLifeTime)
								{
									setErrorFocus(iRateObj, "Initial adjustment interest rate for " + strProductName + " should be between " + iFloor + "% and " + iLifeTime.toFixed(3) + "%");
									bReturn = new Boolean(false);
									ierror=1;
								}
							}
							
					}
				
				
				var ddlobj;
				var ddlobjmonth;
				var imonths;
				var iyears;
				var totalbeginmonths;
				var totalendmonths;
				
				if (sRateHidden == "visible")
				{
					// only test this if the years/months are visible
					// test on begin year and end year, end year can't be before begin year.
					ddlobj = document.all("ddlBeginPeriodYear" + index.toString());
					ddlobjmonth = document.all("ddlBeginPeriodMonths" + index.toString());

					imonths= ddlobjmonth.options[ddlobjmonth.selectedIndex].value;
					iyears = ddlobj.options[ddlobj.selectedIndex].value;
								
					totalbeginmonths = (iyears * 12) + parseInt(imonths);
					// index of begin month/year selected
					document.all("ddlbeginM" + index.toString()).value = ddlobjmonth.selectedIndex;
					document.all("ddlbeginY" + index.toString()).value = ddlobj.selectedIndex;

					
					ddlobj = document.all("ddlEndPeriodYear" + index.toString());
					ddlobjmonth = document.all("ddlEndPeriodMonths" + index.toString());

					imonths= ddlobjmonth.options[ddlobjmonth.selectedIndex].value;
					iyears = ddlobj.options[ddlobj.selectedIndex].value;
					totalendmonths = (iyears * 12) + parseInt(imonths);
					
					document.all("ddlendM" + index.toString()).value = ddlobjmonth.selectedIndex;
					document.all("ddlendY" + index.toString()).value = ddlobj.selectedIndex;

					if (totalendmonths < totalbeginmonths)
					{
							setErrorFocus(ddlobj, "Ending Years/Months can't be earlier then Beginning Years/Months" );
							bReturn = new Boolean(false);
							ierror=1;
					}
				
				}
				
				
				var strproductchecked;
				
				strproductchecked = document.all("chkPerRate" + index).checked;
			
				//	alert("IsubAdjRate " + iSubAdjRate);
				//	alert("testing subadjrate > subrate " + iSubRate);
				
				// test subsequent amounts if an periodic adj rate entered an check box selected
				if (!(iSubAdjRate == 0) && !(iSubRate == 0)) //&& (strproductchecked == true))
				{
				
				// periodic adjustment greater then subsequent rate cap
						if (iSubAdjRate > iSubRate)
						{
							//alert("error ");
							setErrorFocus(iSubRateObj, "Amount of Periodic Adjustment for " + strProductName + " should be equal to or less than " +  iSubRate + "%" );
						    bReturn = new Boolean(false);
						        ierror=1;
						    
						}
				}
				
				// sum of field 14 and 17 - If a "decrease" adjustment, must be less then
				// then floor.
				
				var iSumInitSubRate;
				iSumInitSubRate = parseFloat(iSubAdjRate) + parseFloat(iRate)
				/*alert("strDirection" + strDirection);
				alert("iSubAdjRate " + iSubAdjRate);
				alert("isuminitsubrate " + iSumInitSubRate);
				alert("iRate " + iRate);
				*/
				if (strDirection == "Decrease")
				{
				// the sub of field 14 and 17 - can't be less than the floor for a decrease
					if (iSumInitSubRate < iFloor)
					{
							setErrorFocus(iSubRateObj, "Amount of Periodic Adjustment for " + strProductName + " cannot be below  " +  iFloor + "%" );
						    bReturn = new Boolean(false);
						   	ierror=1;
					}
					else
					{
						var imaxThreshold = parseFloat(iRate) - parseFloat(iFloor) 
						if (iSubAdjRate > imaxThreshold)
						{
							setErrorFocus(iSubRateObj, "Amount of Periodic Adjustment for " + strProductName + " cannot be above  " +  imaxThreshold + "%" );
						    bReturn = new Boolean(false);
						   	ierror=1;
						}							
					}
				}
				else
				{
				//	alert("testing suminitrate > lifetime" + iSumInitSubRate);
					
				// if increase, can't be greater than lifetimecap
			//	alert("Lifetime " + iLifeTime);
			//	alert("iRate " + iRate);
			//&& strproductchecked == true 
					if (iSumInitSubRate > iLifeTime && ierror == 0)
					{
						
							var lifetime;
							lifetime = parseFloat(iLifeTime) - parseFloat(iRate)
							
							setErrorFocus(iSubRateObj, "Amount of Periodic Adjustment for " + strProductName + " should be equal to or less than   " +  lifetime + "%" );
						    bReturn = new Boolean(false);
						    ierror=0;
					}
				}
			}	
		}
	

			// re-test product loan/loan amounts for any errors
			//var objProductDropDown = document.all(m_strProductDropDownNames[i]);
			
			// i starts at zero, but what we want passed is either 
			// 1, 2, or 3 to represent the product code index
			if (!(isvalidPcLoanAmount(obj,i+1)))
			{
						bReturn = new Boolean(false);
							ierror=1;
			}
			
			//test for loan amount > purchase price
			obj = document.all[m_strLoanAmountNames[i]];		
			var nLA = new Number(sfStripDollar(sfStripComma(obj.value)));
			var nPV = new Number(sfStripDollar(sfStripComma(document.all["txtPropertyValue"].value)));
			//checks before proceeding to calculate the Down Payment and DP Percentage
			if (nPV == 0)
			{		
				setErrorFocus(document.all["txtPropertyValue"],'Please enter a property value');
				bReturn = new Boolean(false);
				break;
			}
			if (nPV < nLA)
			{		
				setErrorFocus(obj,'Loan amount value cannot exceed property value');
				bReturn = new Boolean(false);
				break;
			}
						
		}
	//	alert("ierror " + ierror);
		
		 if (ierror==1)
		 {
			return false;
		 }
		else
		{
			return bReturn.valueOf();
		}
	}

	
