//
// COPYRIGHT (c) 2006 GMAC	All Rights Reserved
//

//Affordability Calculator functions
function calcRemainIncome(fieldObj)
{
	try
	{
		focusField=fieldObj;
		//alert("FUN : calcRemainIncome");
			
		
		inFlag++;
		var remainingIncome=0;
		flagIncome=0;
		totalValue=0;
		
		formObjIn=fieldObj.form.name;
		formObj=eval("document."+formObjIn)
	
		for (var i=0; i<expenseArray.length-1; i++)
		{
			expenseObj=eval("document."+formObjIn+"."+expenseArray[i][0])		
			if (!ValidateNumericInput(expenseObj))
			{
			    alert(expenseArray[i][1]);				    
		    }
			totalValue=totalValue+returnFieldValue(expenseObj,"float");
			
		}
	
				
		flagCalc=true;
	
		if ((formObj.monthlyIncome.value >= 0))
		{
			if (formObj.monthlyIncome.value == "")
				var initialIncome = 0;
			else
			{
				//alert"calcRemainIncome | formObj.monthlyIncome : "+formObj.monthlyIncome)
				var initialIncome = returnFieldValueIncome(formObj.monthlyIncome,"float");
			}
			var totExp=sumExpenses(fieldObj);
			
			//if (errFlag==2)
			if(formObj.monthlyIncome.value==""){
				formObj.monthlyIncome.value=0;	
			}
			
		
			var monthly = parseFloat(formObj.monthlyIncome.value);
			
			if(totExp>monthly){					
				validateMonthly=false;
				alert(insuficientIncomeMessage);
			}
			
			initIncome=initialIncome;//global variable used for negative value checking				
			remainingIncome=parseFloat(initialIncome)-parseFloat(totExp);
			document.affordabilityCalculatorActionForm.remainingIncome.value=outputMoney(remainingIncome);
		}
		
		
		if(flagCalc){
			
			calcPaymentRanges(formObj,remainingIncome); //calculates high and low ranges		    
			
		}
		inFlag=0;
	}			
	catch(ex)
	{
	}
}


function setIncome(fieldObj,insuficientIncomeMessage)
{	
	ok = true;
	
	if(document.forms[0].monthlyIncome.value==""){
		for (var i=0; i<expenseArray.length-1; i++)
		{
			expenseObj=eval("document.forms[0]."+expenseArray[i][0])	
			
			if(expenseObj.value!="" && expenseObj.value!="0"){
				ok=false
			}
			
		}
	}
	
	//alert("FUN : setIncome");
	if (!ValidateNumericInputIncome(fieldObj))
	{
		//alert("DEBUG  ValidateNumericInput("+fieldObj.name+") ON setIncome returned FALSE");
		fieldObj.value=0
		alert(formArray[0][2]);
		fieldObj.focus();
		fieldObj.select();
		return;
 	}
 	if(!ok){
 		alert(insuficientIncomeMessage);
 		fieldObj.focus();
		fieldObj.select();
		return;
 	}
	  
	initIncome=returnFieldValue(fieldObj,"float")

	downPayment=returnFieldValue(eval("document.affordabilityCalculatorActionForm.downPayment"),"float")
	 
	 if (fieldObj.value!="")
	 calcRemainIncome2(document.affordabilityCalculatorActionForm.mortgageOrRent);	 
	 //alert("FUN : setIncome - RETURN ");
}	


function calcRemainIncome2(fieldObj)
{
	//alert("FUN : calcRemainIncome2");
	var remainingIncome=0;
	flagIncome=0;
	totalValue=0;
	formObjIn=fieldObj.form.name
	formObj=eval("document."+formObjIn)				
	for (var i=0; i<expenseArray.length-1; i++)
	  {
	    expenseObj=eval("document.affordabilityCalculatorActionForm."+expenseArray[i][0])	
	   
	    if (!ValidateNumericInput(expenseObj)){
	    	//alert("DEBUG  ValidateNumericInput("+fieldObj.name+") ON calcRemainIncome2 returned FALSE"); 
	      	alert(expenseArray[i][1]);
	     }
	    totalValue=totalValue+returnFieldValue(expenseObj,"float");
	  }
	   
  	incomeVal=returnFieldValue(document.affordabilityCalculatorActionForm.monthlyIncome,"float");

	
	if (formObj.monthlyIncome.value == "")    //insure that calculations don't break
    formObj.monthlyIncome.value=incomeVal;
	

	if ((formObj.monthlyIncome.value != "") && (formObj.monthlyIncome.value >= 0))
    {
        var initialIncome = returnFieldValue(formObj.monthlyIncome,"float");
        var totExp=sumExpenses(fieldObj);

        initIncome=initialIncome;//global variable used for negative value checking
		if (totExp > initIncome)
		{
			document.affordabilityCalculatorActionForm.remainingIncome.value=outputMoney(0);
			//alert("in zero")
	    	calcRemainIncome(document.affordabilityCalculatorActionForm.monthlyIncome)	
		}
	  	else
		{
			remainingIncome=parseFloat(initialIncome)-parseFloat(totExp);
			document.affordabilityCalculatorActionForm.remainingIncome.value=outputMoney(remainingIncome);
		}
	}
	calcPaymentRanges(formObj,remainingIncome); //calculates high and low ranges
	//alert("FUN : calcRemainIncome2 - return");
}
	
	
function ValidateNumericRequired(textObject,msg)
{
	//alert("FUN: ValidateNumericInput("+textObject.name+"("+textObject.value+"))");
	var re = /^\s+/;
	if (textObject.value=="")
	{
		return true;
	}
	else
	{
		//alert("re.test("+textObject.value+") : "+re.test(textObject.value));
		if ( textObject.value=="" || isNaN(textObject.value) || (re.test(textObject.value)) || (textObject.value < 0) || (textObject.value >= 1000000)) 
		{
			textObject.value=0;
			alert(msg);
			temp1="document.affordabilityCalculatorActionForm."+textObject.name+".select()";
			//setTimeout(temp1,1); 
			eval(temp1);
			temp2="document.affordabilityCalculatorActionForm."+textObject.name+".focus()";
			//setTimeout(temp2,1); 
			eval(temp2);
			//textObject.value=0;
			
			errFlag=1;
			
			//alert("DEBUG : ValidateNumericInput("+textObject.value+") return false");
			return false;
		}
		else{
			return true;
		}
	}
}



function ValidateNumericNotRequired(textObject, msg)
{
	
	var re = /^\s+/;
	if (textObject.value=="")
	{
		return true;
	}
	else
	{
		
		if ( isNaN(textObject.value) || (re.test(textObject.value)) || (textObject.value < 0) || (textObject.value >= 1000000)) 
		{
			
			alert(msg);
			
			textObject.value="0";
			temp1="document.affordabilityCalculatorActionForm."+textObject.name+".select()";
			setTimeout(temp1,1); 
			temp2="document.affordabilityCalculatorActionForm."+textObject.name+".focus()";
			
			
			setTimeout(temp2,1); 
			errFlag=1;
			
			
			return false;
		}
		else{
			return true;
		}
	}
}





/*function ValidateNumericInput(textObject)
{
	//alert("FUN: ValidateNumericInput("+textObject.name+"("+textObject.value+"))");
	var re = /^\s+/;
	if (textObject.value=="")
	{
		
		return true;
	}
	else
	{
		//alert("re.test("+textObject.value+") : "+re.test(textObject.value));
		if (isNaN(textObject.value) || (re.test(textObject.value)) || (textObject.value < 0) || (textObject.value >= 1000000)) 
		{
			textObject.value=0;
			temp1="document.affordabilityCalculatorActionForm."+textObject.name+".select()";
			setTimeout(temp1,1); 
			temp2="document.affordabilityCalculatorActionForm."+textObject.name+".focus()";
			setTimeout(temp2,1); 
			
			errFlag=1;
			
			//alert("DEBUG : ValidateNumericInput("+textObject.value+") return false");
			return false;
		}
		else{
			return true;
		}
	}
}*/

function ValidateNumericInput(textObject)
{
   	var re = /^\s+/;
	try
	{
	   	if (isNaN(textObject.value) || (re.test(textObject.value)) || (textObject.value < 0) || (textObject.value >= 1000000))
	   	{
	      	//alert("Its either alpha or negative value generated from valid numeric function")
		  	textObject.value=0;
			temp1="document.affordabilityCalculatorActionForm."+textObject.name+".select()";
			setTimeout(temp1,1);
			temp2="document.affordabilityCalculatorActionForm."+textObject.name+".focus()";
			setTimeout(temp2,1);
			
		  	errFlag=1;
		  	return false;
	   	}
	   	else
	   	{
	   		errFlag=0;
	      	return true;
	   	}
	}
	catch(ex)
	{
		alert("Exception "+ex+" : "+ex.value)
	}		   	
}
	
function returnFieldValue(fieldObj,numericType)
{
	if (numericType=="float")
	{
		//alert("returnFieldValue obj : "+fieldObj);
		if(fieldObj.value!=""){
			(numericInput(fieldObj))?i=parseFloat(fieldObj.value):i=0.0;
			return i;
		}
		else
			return 0.0;
	}
	if (numericType=="int")
	{
		if(fieldObj.value!=""){
			(numericInput(fieldObj))?i=parseInt(fieldObj.value):i=0;						
			return i;
		}
		else
			return 0;
	}
	else
	{
		errFlag=0;
		return true;
	}
}


function sumExpenses(fieldObjectIn)
{
	//alert("FUN : sumExpenses");
	var totalOfExp=0;
	for (var i=0; i<expenseArray.length-1; i++)
	{
		fieldString="document.affordabilityCalculatorActionForm."+expenseArray[i][0]
		  fieldObj=eval(fieldString)
		  
		  if(fieldObj.value!="")
		  {
			  if (numericInput(fieldObj))
			  {
				  totalOfExp += parseFloat(fieldObj.value);
				  if (totalOfExp > initIncome && (errFlag==0||errFlag==1))
				  {
				  	
					  errFlag=2;
				  }
			  }
			 
		  } 
	}
	//alert("FUN : sumExpenses RETURN : "+totalOfExp);
	return(totalOfExp);	
}
	
function calcPaymentRanges(formObjIn,remainIncome)
{
	//alert("FUN : calcPaymentRanges");
	var formObj=formObjIn;
	// calculate debt
	var mortgageExp=0;
	var foodAndEntertExp=0;
	var creditCard=0; 
	var otherAuto=0; 
	var studentLoans=0;
	var utilitiesExp=0;
	var otherExpensesExp=0;
	var incomeVal=0;
	var highRate=0.2;
	var lowRate=0.15;
	
	
	mortgageExp=returnFieldValue(formObj.mortgageOrRent,"float");
	foodAndEntertExp=returnFieldValue(formObj.foodAndEntertainment,"float");
	creditCard=returnFieldValue(formObj.creditCard,"float");
	otherAuto=returnFieldValue(formObj.otherPayment,"float");
	studentLoans=returnFieldValue(formObj.studentLoans,"float");
	utilitiesExp=returnFieldValue(formObj.utilities,"float");	
	otherExpensesExp=returnFieldValue(formObj.otherExpenses,"float");
	
	debt=mortgageExp+foodAndEntertExp+creditCard+otherAuto+studentLoans+utilitiesExp+otherExpensesExp;
	
	
	if(document.affordabilityCalculatorActionForm.monthlyIncome.value!=""){
		(ValidateNumericInputIncome(document.affordabilityCalculatorActionForm.monthlyIncome))?incomeVal=parseFloat(document.affordabilityCalculatorActionForm.monthlyIncome.value):incomeVal=0;				
	}
	
	highVal=(incomeVal-debt)*highRate;
	lowVal=(incomeVal-debt)*lowRate;
	if (highVal<=remainIncome)
		highValAmount=highVal;
	else
		highValAmount=remainIncome;
	
	
	//alert(highVal+" "+remainIncome)
	if (highValAmount==remainIncome)
		lowValAmount=highValAmount-50;
	if (highValAmount<=50)
		lowValAmount=0;	
	if (highValAmount<remainIncome && highValAmount>50)
		lowValAmount=lowVal;
	
	if (lowValAmount<=0)
		lowValAmount=0;
	if (highValAmount<=0)
		highValAmount=0;
	

	document.affordabilityCalculatorActionForm.vehiclePayment.value=Math.round(highValAmount);
	document.affordabilityCalculatorActionForm.paymentRange.value=outputMoney(Math.round(lowValAmount))+" - "+outputMoney(Math.round(highValAmount));
	
	
	
		
		
	//alert("FUN : calcPaymentRanges - RETURN");
}

function formatPrice()
{
	affordablePurchasePrice = document.affordabilityCalculatorActionForm.affordablePurchasePrice.value;	
	if (affordablePurchasePrice!="")
	{
		document.affordabilityCalculatorActionForm.affordablePurchasePrice.value = outputMoney(affordablePurchasePrice);
	}
}

function outputMoney(number) {
	//alert("outputMoney : "+number);
	return outputDollars(Math.floor(number-0) + '');
}


function outputDollars(number) 
{  
	if (number>=0){			
		prefix = "$";
		suffix = "";			
		// prefix="$"
	}
	else
	{
		number=stripCharacters(number,"-")			
		prefix = "$-";
		suffix = "";			
		// prefix="$-"
		
	}	    
	return outputDollarsFcn(number,prefix,suffix)
}


function outputDollarsFcn(number,prefix,suffix)
{	
	sKSeparator = ",";
	sDecSeparator = ".";
	if (number.length <= 3)
		return (number == '' ? '0' : prefix+number+suffix);
	else {
		var mod = number.length%3;
		var output = (mod == 0 ? '' : (number.substring(0,mod)));
		for (i=0 ; i < Math.floor(number.length/3) ; i++) {
			if ((mod ==0) && (i ==0))
				output+= number.substring(mod+3*i,mod+3*i+3);
			else
				output+= sKSeparator + number.substring(mod+3*i,mod+3*i+3);
		}
		output=prefix+output+suffix
		return (output);
	}	    
}	

var tlmngr_msg;
var tlmngr_error;

function tlmngr_onSubmitForm(form){
	tlmngr_msg = '';
	tlmngr_error = false;        
	
	if (tlmngr_error){	
		alert(tlmngr_msg); //used to be -- 'Please check the following:\n' + tlmngr_msg -- localize if needed
		return false;	 	
	}	
	else {
		return chkSubmit();
	}
	return !tlmngr_error;
}

function tlmngr_submitForm(form){
	try{
		//Fixed according to Defect #420 - CR 24
		if (tlmngr_onSubmitForm(form)){
			form.submit()
		}
	}
	catch(ex)
	{	
	}
}

function chkSubmit()
{
	if (validateFields(formArray)){
		// Omniture code
	  if(s_account) {
		  var s=s_gi(s_account);
	 	  s.tl(this,'o','Affordability Calculator: Calculator Button');
	  }
	  document.forms[0].submit();
	  return true 
    }
  else {
    return false
    }
}


function stripCharacters(stringIn,replace) {
	var flag = false;
	for (var i = 0; i < stringIn.length && !flag; i++)
	{
		if (stringIn.substring(i,i+1) != replace) 
			flag = true;
	}
	if (flag) 
		return stringIn.substring(i-1); 
	else 
		return stringIn;
}

function chkEmptyString (elementOffset) //Empty String
{
	if (document.forms[0].elements[elementOffset].value=="")
	{
		document.forms[0].elements[elementOffset].focus()
		return false;
	}
	return true;
}



function chkRadio (elementOffset) //Empty String
{
	var isChecked=0;

	for (i=0; i<document.forms[0].elements[elementOffset].length; i++)
	{
		(document.forms[0].elements[elementOffset][i].checked) ? isChecked++ : isChecked+=0;
    }
	if (isChecked<1)
    {
		return false;
	}
	return true;
}


function chkNumeric (elementOffset) //Numeric
{
	
	if (isNaN(document.forms[0].elements[elementOffset].value) || document.forms[0].elements[elementOffset].value=="")
	{
		
	   
	     document.forms[0].elements[elementOffset].select();
		 document.forms[0].elements[elementOffset].focus();
	     return false;
	}
	else if (document.forms[0].elements[elementOffset].value<=0)
	{
	 	 
	    
	     document.forms[0].elements[elementOffset].select();
		 document.forms[0].elements[elementOffset].focus();
	     return false;
	}
	return true;
}

function chkNumericAllowZero(elementOffset) //Numeric
{
	
	if (isNaN(document.forms[0].elements[elementOffset].value) || document.forms[0].elements[elementOffset].value=="")
	{
		
	   
	     document.forms[0].elements[elementOffset].select();
		 document.forms[0].elements[elementOffset].focus();
	     return false;
	}
	else if (document.forms[0].elements[elementOffset].value<0)
	{
	 	 
	    
	     document.forms[0].elements[elementOffset].select();
		 document.forms[0].elements[elementOffset].focus();
	     return false;
	}
	return true;
}


function chkOptionNumeric (elementOffset) //Numeric
{

  if (document.forms[0].elements[elementOffset].value!="")
    {
	    if (isNaN(document.forms[0].elements[elementOffset].value))
	    {
	    
	     document.forms[0].elements[elementOffset].value=0;
	     document.forms[0].elements[elementOffset].select();
		 document.forms[0].elements[elementOffset].focus();
	     return false;
	    }
	   	if (document.forms[0].elements[elementOffset].value<0)
	   	{
	    
	   	 document.forms[0].elements[elementOffset].value=0; 
	   	 document.forms[0].elements[elementOffset].select();
		 document.forms[0].elements[elementOffset].focus();
	     return false;
	    }  
	  }
	  return true;
}





function chkApr (elementOffset)
{

  if (validateAPR(document.forms[0].elements[elementOffset].value))
		{
		  return true;
		}
		else
		{
		 	
		 // document.forms[0].elements[elementOffset].value=0; 
		  document.forms[0].elements[elementOffset].select();
		  document.forms[0].elements[elementOffset].focus();

		  return false;
		}

}


function validateAPR (string) {

  
    var valid = '0123456789.'
    sDecSeparator = "."
  
  var cnt=0;
  var cnt2=0;
  var charHold2;
  var stringIn=string
  
  if(stringIn.charAt(0)=="+"){
  	stringIn= stringIn.replace('+',''); 
  }
  
    for (var i=0; i<stringIn.length; i++) {
      if (valid.indexOf(stringIn.charAt(i)) == -1)
        return false;
        
      charHold2 = stringIn.substring(i,i+1)
      if(charHold2==sDecSeparator)cnt++  
      if(charHold2 =="%")cnt2++  
     
      if (cnt>1||cnt2>1)  
        return false;
    }
   
   // var myresult = stringIn.replace(stringIn,'1234567890','');
   // alert (myresult);
  
 if(stringIn.charAt(stringIn.length-1)=="%"){
  newString= stringIn.replace('%',''); 
  }
 else{
  newString=stringIn;
  }
  
  valueOfAPR=parseFloat(newString)
 
  if (valueOfAPR<0.01 || valueOfAPR>999.99)
  {
    if (valueOfAPR==0)
      return true;
    else 
      return false;
  }
 

    
    return true;
}



function showAlert(sLabel)
{
	alert(" " + sLabel);
} 
    

var jj = 0; //Variable used to hold the last value of the iterator j in validateFields() before calling itself.

function validateFields(myArray)
{
	//alert("validateFields " + myArray[0][0]);
	for (j=0; j<myArray.length; j++)
    {
		//alert("j = " + j);
	  switch(myArray[j][1]) 
	    {	
			case "NOT_EMPTY" :	if (chkEmptyString(myArray[j][0]))	break; else { showAlert(myArray[j][2]); return false; }
			case "NUMERIC" :	if (chkNumeric(myArray[j][0]))		break; else { showAlert(myArray[j][2]); return false; }
			case "NUMERIC_ALLOW_ZERO" :	if (chkNumericAllowZero(myArray[j][0]))		break; else { showAlert(myArray[j][2]); return false; }
			case "RADIO" :		if (chkRadio(myArray[j][0]))		break; else { showAlert(myArray[j][2]); return false; }
			case "APR" :		if (chkApr(myArray[j][0]))		break; else { showAlert(myArray[j][2]); return false; }
		  case "OPTNUMERIC" : if (chkOptionNumeric(myArray[j][0]))		break; else { showAlert(myArray[j][2]); return false; }
			default :				break;
	    } // end switch
	  } // end for 
	j = jj;
	//alert("return true");
	return true;
}


function setSelectedTerm(){
	selectedValue = document.affordabilityCalculatorActionForm.terms.value;
	options = document.affordabilityCalculatorActionForm.terms.options;
	for (i=0; i<options.length;i++)
	{
		if (options[i].value==selectedValue)
		{			
			document.affordabilityCalculatorActionForm.terms.selectedIndex=i;
			break;
		}
	}
}

function putZero(obj){
	
	if(obj.value==""){
		obj.value="0";
	}
}


function validateNumericInput(textObject,msg)
{
	//alert("FUN: ValidateNumericInput("+textObject.name+"("+textObject.value+"))");
	var re = /^\s+/;
	if (textObject.value=="")
	{		
		return true;
	}
	else
	{
		//alert("re.test("+textObject.value+") : "+re.test(textObject.value));
		if (isNaN(textObject.value) || (re.test(textObject.value)) || (textObject.value < 0) || (textObject.value >= 1000000)) 
		{
			//alert("DEBUG : ValidateNumericInput - VALIDATION_ERROR_CONDITION");
			textObject.value=0;
			alert(msg);
			temp1="document.affordabilityCalculatorActionForm."+textObject.name+".select()";
			eval(temp1); 
			temp2="document.affordabilityCalculatorActionForm."+textObject.name+".focus()";
			eval(temp2); 
			
			errFlag=1;
			
			//alert("DEBUG : ValidateNumericInput("+textObject.value+") return false");
			return false;
		}
		else{
			return true;
		}
	}
}



function numericInput(textObject)
{
	//alert("FUN: ValidateNumericInput("+textObject.name+"("+textObject.value+"))");
	var re = /^\s+/;
	if (textObject.value=="")
	{
		
		return true;
	}
	else
	{
		//alert("re.test("+textObject.value+") : "+re.test(textObject.value));
		if (isNaN(textObject.value) || (re.test(textObject.value)) || (textObject.value < 0) || (textObject.value >= 1000000)) 
		{
			
		
			return false;
		}
		else{
			return true;
		}
	}
}


function ValidateNumericInputIncome(textObject)
{
	//alert("FUN: ValidateNumericInput("+textObject.name+"("+textObject.value+"))");
	var re = /^\s+/;
	if (textObject.value=="")
	{
		
		return true;
	}
	else
	{
		//alert("re.test("+textObject.value+") : "+re.test(textObject.value));
		if (isNaN(textObject.value) || (re.test(textObject.value)) || (textObject.value < 0) || (textObject.value >= 10000000)) 
		{
			
			temp1="document.affordabilityCalculatorActionForm."+textObject.name+".select()";
			setTimeout(temp1,1); 
			temp2="document.affordabilityCalculatorActionForm."+textObject.name+".focus()";
			setTimeout(temp2,1); 
			
			errFlag=1;
			
			//alert("DEBUG : ValidateNumericInput("+textObject.value+") return false");
			return false;
		}
		else{
			return true;
		}
	}
}


function returnFieldValueIncome(fieldObj,numericType)
{
	if (numericType=="float")
	{
		//alert("returnFieldValue obj : "+fieldObj);
		if(fieldObj.value!=""){
			(numericInputIncome(fieldObj))?i=parseFloat(fieldObj.value):i=0.0;
			return i;
		}
		else
			return 0.0;
	}
	if (numericType=="int")
	{
		if(fieldObj.value!=""){
			(numericInputIncome(fieldObj))?i=parseInt(fieldObj.value):i=0;						
			return i;
		}
		else
			return 0;
	}
	else
	{
		errFlag=0;
		return true;
	}
}

function numericInputIncome(textObject)
{
	//alert("FUN: ValidateNumericInput("+textObject.name+"("+textObject.value+"))");
	var re = /^\s+/;
	if (textObject.value=="")
	{
		
		return true;
	}
	else
	{
		//alert("re.test("+textObject.value+") : "+re.test(textObject.value));
		if (isNaN(textObject.value) || (re.test(textObject.value)) || (textObject.value < 0) || (textObject.value >= 10000000)) 
		{
			
		
			return false;
		}
		else{
			return true;
		}
	}
}


