var flag = 0;

function Fn (x, clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue)
{
	var y;
	y = (1 * LoanAmountValue) + ((1 + (clci * clcs)) * clcpmt * (1 - Math.pow (1.0 + clci, -x)) / clci);
    y = (y * 1) + clcfv * Math.pow (1.0 + clci, -x);
    return y;
}

function Fi (x, clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue)
{
    var y;
    y = (LoanAmountValue * 1) + ((1 + (x * clcs)) * clcpmt * (1 - Math.pow (1.0 + x, -clcn)) / x);
	y = (y * 1) + clcfv * Math.pow (1.0 + x, -clcn);
    return y;
}

function Fpmt (x, clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue)
{
    var y;
	y = 0;
	y = ((1 + (clci * clcs)) * (1 - Math.pow (1.0 + clci, -clcn)) / clci); 
	y = y * x;
 	y = (y + (LoanAmountValue * 1));
    y = (y * 1) + (clcfv * Math.pow (1.0 + clci, -clcn));
    return y;
}

function Ffv (x, clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue)
{
    var y;
	y = (LoanAmountValue * 1) + ((1 + (clci * clcs)) * clcpmt * (1 - Math.pow (1.0 + clci, -clcn)) / clci);
    y = (y * 1) + x * Math.pow (1.0 + clci, -clcn);
    return y;
}

function Fpv (x, clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue)
{
    var y;
    y = (x * 1) + ((1 + (clci * clcs)) * clcpmt * (1 - Math.pow (1.0 + clci, -clcn)) / clci);
    y = (y * 1) + clcfv * Math.pow (1.0 + clci, -clcn);
    return y;
}

function Calculate(i_type, sval, ev, iv, clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue)
{
    var d_temp, d_temp2, eval, val1, val2;
	if (i_type == 0) // Number of Payments
	{
		while (true)
        {
			val1 = Fn((sval+ev), clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue);
            d_temp = sval * val1;
            val2 = Fn(sval, clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue);
            d_temp = d_temp - (sval+ev)*val2;
            d_temp2 = val1 - val2;
            d_temp = d_temp/d_temp2;
            eval = d_temp;
            if ( (Math.abs(eval) > ev) && (++iv < 100) )
				sval = eval;
            else
				break;
		}
		return eval;
	}
	if (i_type == 1) // Interest
	{
		while (true)
		{
			val1 = Fi((sval+ev), clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue);
			d_temp = sval * val1;
			val2 = Fi(sval, clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue);
			d_temp = d_temp - (sval+ev)*val2;
			d_temp2 = val1 - val2;
			d_temp = d_temp/d_temp2;
			eval = d_temp;
			if ( (Math.abs(eval) > ev) && (++iv < 100) )
				sval = eval;
			else
                break;
		}
		return eval;
	}
    if (i_type == 2) // Payment
    {
		while (true)
        {
			val1 = Fpmt((sval+ev), clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue);
            d_temp = sval * val1;
            val2 = Fpmt(sval, clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue);
            d_temp = d_temp - (sval+ev)*val2;
            d_temp2 = val1 - val2;
            d_temp = d_temp/d_temp2;
            eval = d_temp;
            if ( (Math.abs(eval) > ev) && (++iv < 100) )
				sval = eval;
			else
				break;
        }
		return eval;
	}
    if (i_type == 3) // Present Value
    {
		while (true)
        {
			val1 = Fpv((sval+ev), clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue);
            d_temp = sval * val1;
            val2 = Fpv(sval, clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue);
            d_temp = d_temp - (sval+ev)*val2;
            d_temp2 = val1 - val2;
            d_temp = d_temp/d_temp2;
            eval = d_temp;
            if ( (Math.abs(eval) > ev) && (++iv < 100) )
				sval = eval;
            else
                break;
		}
		return eval;
	}
    if (i_type == 4) //Future Value
    {
		while (true)
        {
			val1 = Ffv((sval+ev), clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue);
            d_temp = sval * val1;
            val2 = Ffv(sval, clcs, clcn, clcfv, clci, clcpmt, LoanAmountValue);
            d_temp = d_temp - (sval+ev)*val2;
            d_temp2 = val1 - val2;
            d_temp = d_temp/d_temp2;
            eval = d_temp;
            if ( (Math.abs(eval) > ev) && (++iv < 100) )
				sval = eval;
			else
				break;
		}
		return eval;
	}
}


function selectPmtFreq_onDesignLoad()
{
   this.form.selectPmtFreq.value = "Monthly - 12 Installments p.a.";
}

function selectPmtFreq_onServerLoad()
{
   this.form.selectPmtFreq.value = "Monthly - 12 Installments p.a.";
}


function SetThingmagiggyHilighted(field)
{
	//field.select();
}
	


function HelpNdx_onChange()
{
//      form.help1.rowset.applyLocate("HLP_INDEX='" + form.HelpNdx.value + "'");
//      form.HTMLHelpArea.text = form.help1.rowset.fields["TEXT"].value;
}

function SpiffyNumberChecker (numb, field)
{
	dec_cnt = 0;
   for (var i = 0; i < numb.length; i++)
   {
       ch = numb.charAt(i)
       if (ch == '.')
	   {
			dec_cnt++;
	   }
		   
       if (((ch < "0" || "9" < ch) && ch != '.') || dec_cnt > 1)
       {
	
          alert("Please enter a valid positive number!");
		  field.focus();
		  return 0;
	   }
   }
   return numb;
}

function StupendousResidualChecker()
{
	perc = (document.form.TextLaonAmt.value / document.form.textArticlePrice.value) * 100 ;
	if (document.form.TextR.value > perc)
	{
		alert("Residual must be less then the LOAN AMOUNT, and will be set to zero.");
		document.form.TextR.value = 0;
		document.form.TextValue.value = 0;
	}
}

function MakeStringPretty (numb)	
{
	numb = Math.round(numb * 100) / 100 + 0.0001;
    numstring = "" + numb;
    index = numstring.lastIndexOf(".");
    numb = numstring.substring(0, index + 3);
	if (numb == 0.00) 
	{
	   return 0;
	} else {
		return numb;
	}

}

function textArticlePriceOnChange(form)
{
   flag = 1;
   form.textArticlePrice.value = SpiffyNumberChecker(form.textArticlePrice.value, form.textArticlePrice);
  
   if (form.textArticlePrice.value < -(-form.TextDeposit.value - form.TextTradIn.value))
   {
	    form.TextDeposit.value = 0;
	    form.TextTradIn.value = 0;
   };

  form.textArticlePrice.value = MakeStringPretty(form.textArticlePrice.value);

   form.TextLaonAmt.value = MakeStringPretty (form.textArticlePrice.value - 
      form.TextDeposit.value - form.TextTradIn.value);
  form.TextValue.value = MakeStringPretty((form.textArticlePrice.value * form.TextR.value) / 100);
 StupendousResidualChecker();

 }

function TextRonChange(form)
{
   flag = 1;
	form.TextR.value = SpiffyNumberChecker(form.TextR.value, form.TextR);
	if (form.TextR.value > 100)
	{
		alert("Percentage was greater than 100. Automatic conversion procedure initiated.");
		form.TextR.focus();
	}
	while (form.TextR.value > 100) 
		form.TextR.value /= 10;

	perc = (form.TextLaonAmt.value / form.textArticlePrice.value) * 100 ;
	if ((form.TextR.value * 1) > (perc * 1))
	{
		alert("Residual must be less then the LOAN AMOUNT.");
		form.TextR.value = 0;
		form.TextR.focus();
	}
   form.TextValue.value = MakeStringPretty((form.textArticlePrice.value * form.TextR.value) / 100);
}


function TextValueonChange(form)
{
	flag = 1;
	form.TextValue.value = SpiffyNumberChecker(form.TextValue.value, form.TextValue);
	if ((form.TextValue.value * 1) > (form.textArticlePrice.value * 1))
	{
		alert("Residual Value cannot exceed the Article Price.");
		form.TextValue.value = 0;
		form.TextValue.focus();
	}

	if ((form.TextValue.value * 1) > (form.TextLaonAmt.value * 1))
	{
		alert("Residual Value cannot exceed the LOAN AMOUNT.");
		form.TextValue.value = 0;
		form.TextValue.focus();
	}

	form.TextR.value = MakeStringPretty((form.TextValue.value / form.textArticlePrice.value) * 100);
}

function TextInterestonChange(form)
{
	flag = 1;
	form.textI.value = SpiffyNumberChecker(form.textI.value, form.textI);
	if (form.textI.value > 100)
	{
		alert("Percentage was greater than 100. Automatic conversion procedure initiated.");
		form.textI.focus();
	}
	while (form.textI.value > 100) 
		form.textI.value /= 10;		
}

function TextTermsonChange(form)
{
	flag = 1;
	form.TextTerms.value = SpiffyNumberChecker(form.TextTerms.value, form.TextTerms);
	if (form.TextTerms.value > 60)
	{
		alert("Term cannot be greater than 60 months.");
		form.TextTerms.value = 60;
	}

	thisstr = "" + form.TextTerms.value;
    if (thisstr.lastIndexOf(".") > -1)
	{
		alert("The Term can only be full months, ie: 30 months NOT 30,5 months.");
		form.TextTerms.value = 0;
		form.TextTerms.focus();
		form.TextTerms.select();
		return;
	}
	
	return;

}

function TextExtraPmtonChange(form)
{
	form.TextExtraPmt.value = SpiffyNumberChecker(form.TextExtraPmt.value, form.TextExtraPmt);
	if ((form.TextExtraPmt.value * 1) > (form.TextLaonAmt.value * 1))
	{
		alert("The Extra Payment cannot exceed the Loan Amount");
		form.TextExtraPmt.value = 0;
	}
}	


function TextLoanAmtonChange(form)
{
	flag = 1;

   form.TextLaonAmt.value = SpiffyNumberChecker(form.TextLaonAmt.value, form.TextLaonAmt);

	if (form.TextLaonAmt.value < -(-form.TextDeposit.value - form.TextTradIn.value))
	{
		form.TextDeposit.value = 0;
		form.TextTradIn.value = 0;
	}

	form.textArticlePrice.value = MakeStringPretty(-(-form.TextLaonAmt.value - form.TextDeposit.value - form.TextTradIn.value));
	form.TextValue.value = MakeStringPretty((form.textArticlePrice.value * form.TextR.value) / 100);
	form.TextLaonAmt.value = MakeStringPretty(form.TextLaonAmt.value);
 StupendousResidualChecker();
}

function TextDepositonChange(form)
{
	flag = 1;

   form.TextDeposit.value = SpiffyNumberChecker(form.TextDeposit.value, form.TextDeposit);

   if ((form.TextDeposit.value * 1) > (form.textArticlePrice.value * 1))
   {
	   alert("Deposit cannot exceed Article Price");
   	   form.TextDeposit.value = form.textArticlePrice.value;
	   form.TextDeposit.focus();
   }

   if (form.TextDeposit.value > (form.textArticlePrice.value - form.TextTradIn.value))
   {
	   form.TextTradIn.value = 0;
   }

   form.TextLaonAmt.value = MakeStringPretty(form.textArticlePrice.value - 
      form.TextDeposit.value - form.TextTradIn.value);
   form.TextDeposit.value = MakeStringPretty(form.TextDeposit.value);
 StupendousResidualChecker();
}

function TextTradInonChange(form)
{
	flag = 1;
   form.TextTradIn.value = SpiffyNumberChecker(form.TextTradIn.value, form.TextTradIn);

   if (form.TextDeposit.value > (form.textArticlePrice.value - form.TextTradIn.value))
   {
	   alert("Deposit + Trade-in cannot exceed Article Price");
   	   form.TextTradIn.value = form.textArticlePrice.value - form.TextDeposit.value;
	   form.TextTradIn.focus();
   }

   form.TextLaonAmt.value = MakeStringPretty(form.textArticlePrice.value - 
      form.TextDeposit.value - form.TextTradIn.value);
   form.TextTradIn.value = MakeStringPretty(form.TextTradIn.value);
 StupendousResidualChecker();
}

function Clear(form)
{
   flag = 0;
   form.textArticlePrice.value = 0;
   form.TextDeposit.value = 0;
   form.TextTradIn.value = 0;
   form.TextLaonAmt.value = 0;
   form.textI.value = 0;
   form.TextR.value = 0;
   form.TextValue.value = 0;
   form.TextTerms.value = 0;
   form.TextPmt.value = 0;
   form.TextExtraPmt.value = 0;
   form.HTMLTerms.text = "Months"
   form.selectPmtFreq.value = "Monthly - 12 Installments p.a.";
}



function Calculate1(form)
{
   if (flag == 1)
   {
	form.TextExtraPmt.value = 0;	
	var value, d_temp, d_temp2;
	ev = Math.pow(10, (-6));
	clcpv = tmppv = form.textArticlePrice.value;
	clcz = ((form.textI.value/100)/360)*30;
	clcpv = clcpv + ( clcpv * clcz );
	PayFreqValue = 0;
	if (form.selectPmtFreq.selectedIndex == 0)
	   PayFreqValue = 1;
	if (form.selectPmtFreq.selectedIndex == 1)
	   PayFreqValue = 2;
	if (form.selectPmtFreq.selectedIndex == 2)
	   PayFreqValue = 4;
	if (form.selectPmtFreq.selectedIndex == 3)
	   PayFreqValue = 12;
	clci = form.textI.value/100/PayFreqValue;
	clcn = form.TextTerms.value * PayFreqValue / 12;

	clcnstr = "" + clcn;
    if (clcnstr.lastIndexOf(".") > -1)
	{
		alert("The 'Term / Payment Frequency' does not relate to an exact number of payments,r eg: Semi-annualy Payments must have a Term which is a multiple of 6 months.");
		form.TextTerms.focus();
		form.TextTerms.select();
		return;
	}
    


	clcfv = (form.TextValue.value)*-1;
	clcs = 0; // Interest Paid at end.
	LoanAmountValue = form.TextLaonAmt.value;
	clcpmt = 0.0;
	sval = 1.0;
	iv = 0;
	Pmt = 2;

	if (clcn == 0)
	{
		temp = 0;
		temp3 = temp;
	}
	else if (clci == 0)
	{
		temp = form.TextLaonAmt.value / clcn;
		temp3 = temp;
	}
	else
	{
		temp = Math.abs(Calculate(Pmt, sval, ev, iv, clcs, clcn, clcfv, clci, clcpmt, 
			LoanAmountValue));
		temp3 = temp;
	}	
	form.TextPmt.value = MakeStringPretty (temp);
	flag = 0;
   }
   	
   if (form.TextExtraPmt.value > 0)
   {
	  if (form.textI.value == 0)
	  {
	      clcpmt = (form.TextPmt.value * 1) + (form.TextExtraPmt.value * 1);
		  value = Math.round(form.TextLaonAmt.value / clcpmt);
		  value = value * (12 / PayFreqValue);
	  }
	  else
	  {	
		clcpmt = -(temp3 * 1) - (form.TextExtraPmt.value * 1);
		clcn = 0.0;
		sval = 1.0;
		iv = 0;
		value = Calculate(0, sval, ev, iv, clcs, clcn, clcfv, clci, clcpmt, 
		  LoanAmountValue);
	  }
	  form.TextTerms.value = Math.abs(Math.round(value));
   }
  return;
}

