// Power of Compuding Calculator 

/*
	This function call appropiate method  when user wants to calculate any field value
*/
function fieldCheck(frmPowerCalc)
{
	var fieldDepositAmount = frmPowerCalc.DepositAmount;
	var fieldRateOfInterest = frmPowerCalc.RateOfInterest;
	var fieldPeriod = frmPowerCalc.Period;
	var fieldCorpusAmount = frmPowerCalc.CorpusAmount;
	var fieldPaymentPeriod = frmPowerCalc.PaymentPeriod;
	var vCount = 0;
	
	// Deposit Amount
	DepositAmount = fieldDepositAmount.value; 
	// Rate of interest
	RateOfInterest =fieldRateOfInterest.value;
	// Period of Investment
	Period = fieldPeriod.value;
	//Corpus Amount
	CorpusAmount = fieldCorpusAmount.value;
	// Periodicity of Payment
	PaymentPeriod = fieldPaymentPeriod.value;
	
	if(DepositAmount =="")
	{
		vCount++;
	}
	if(RateOfInterest == "")
	{
		vCount++;
	}
	if(Period == "")
	{
		vCount++;
	}
	if(PaymentPeriod =="-1")
	{		
		alert("Please select Periodicity of payment");
		fieldPaymentPeriod.focus();
		return false;
	}
	if(CorpusAmount == "")
	{
		vCount++;		
	}	
		
	if(vCount == 1)
	{
		if(CorpusAmount == "")
		{
			getCorpusAmount(frmPowerCalc);
		}
		
		if(DepositAmount =="")
		{
			getDepositAmount(frmPowerCalc);
		}
		if(Period == "")
		{
			getPeriodOfInvestment(frmPowerCalc);
		}
		if(RateOfInterest == "")
		{
			getRateOfInterest(frmPowerCalc);
		}
	}
	else if(vCount == 0)
	{
		getCorpusAmount(frmPowerCalc);
		//alert("please clear the field you want ro calculate");
		//return false;
	}
	else
	{	
		alert("Please enter only 4 values!");
		return false;	
	}
}

/*
	This function will be return how much amount he/she will ger after 
	certain years.
	@return CorpusAmount
*/
function getCorpusAmount(frmPowerCalc)
{
	var fieldDepositAmount = frmPowerCalc.DepositAmount;
	var fieldRateOfInterest = frmPowerCalc.RateOfInterest;
	var fieldPaymentPeriod = frmPowerCalc.PaymentPeriod;
	var fieldPeriod = frmPowerCalc.Period;
	
	// Deposit Amount
	DepositAmount = fieldDepositAmount.value; 
	// Rate of interest
	RateOfInterest =fieldRateOfInterest.value;
	// Periodicity of Payment
	PaymentPeriod = fieldPaymentPeriod.value;
	// Period of Investment
	Period = fieldPeriod.value;
			
	if(PaymentPeriod == 1 || PaymentPeriod ==2 || PaymentPeriod == 4 || PaymentPeriod == 12)
	{
		var vPeriod = PaymentPeriod * Period;
		//presemt value
		var pv = 0;		
		//payment due value at the beginning of the period
		var type=1;
		var vRateOfInterest = RateOfInterest / (PaymentPeriod * 100);		
		var vTotalRateOfInterest=Math.pow(1+vRateOfInterest,vPeriod);		
		var vRate=(Math.pow(1+vRateOfInterest,vPeriod)-1)/vRateOfInterest;		
		var vIntCorpusAmount = ((pv*vTotalRateOfInterest)+DepositAmount*(1+vRateOfInterest*type)*vRate);
		document.frmPowerCalc.CorpusAmount.value = Math.round(vIntCorpusAmount);		
	}
	else
	{
		var vRateOfInterest = RateOfInterest / (100);
		var vPeriod = Period;
		//Calcalute reate of interest for specific period
		var vTotalRateOfInterest=Math.pow(1+vRateOfInterest,vPeriod);
		var vIntCorpusAmount = DepositAmount * vTotalRateOfInterest;
		document.frmPowerCalc.CorpusAmount.value = Math.round(vIntCorpusAmount);		
	}
}

/*
	This function will be return how much amount he/she would be deposit.
	@return vIntDepositAmount
*/

function getDepositAmount(frmPowerCalc)
{
	var fieldRateOfInterest = frmPowerCalc.RateOfInterest;
	var fieldPeriod = frmPowerCalc.Period;
	var fieldCorpusAmount = frmPowerCalc.CorpusAmount;
	var fieldPaymentPeriod = frmPowerCalc.PaymentPeriod;
	// Deposit Amount
	var vIntDepositAmount = 0.0;	
	// Rate of interest
	RateOfInterest = fieldRateOfInterest.value;
	// Period of Investment
	Period = fieldPeriod.value;
	//Corpus Amount
	CorpusAmount = fieldCorpusAmount.value;
	// Periodicity of Payment
	PaymentPeriod = fieldPaymentPeriod.value;
	//payment due value at the beginning of the period
	var type = 1;
	
	if(PaymentPeriod == 1 || PaymentPeriod ==2 || PaymentPeriod == 4 || PaymentPeriod == 12)
	{
		var vPeriod = PaymentPeriod * Period;
		var vRateOfInterest = RateOfInterest / (PaymentPeriod * 100);		
		var vTotalRateOfInterest=Math.pow(1+vRateOfInterest,vPeriod);		
		var vRate=(Math.pow(1+vRateOfInterest,vPeriod)-1)/vRateOfInterest;		
		
		vIntDepositAmount = CorpusAmount / ((1+vRateOfInterest*type)*vRate);
		document.frmPowerCalc.DepositAmount.value = Math.round(vIntDepositAmount);		
	}
	else
	{	
		//Calcalute reate of interest for specific period
		var vRateOfInterest = RateOfInterest / (100);
		//alert("Rate of interst " + vRateOfInterest);
		var vTotalPeriod = Period;
		//Calcalute reate of interest for specific period
		var vTotalRateOfInterest=Math.pow(1+vRateOfInterest,vTotalPeriod);
		//Calculate deposit amount required
		vIntDepositAmount = CorpusAmount / vTotalRateOfInterest;
		document.frmPowerCalc.DepositAmount.value = Math.round(vIntDepositAmount);
	}			
}

/*
	This function will be return for how much year he/she will be deposit amount.
	
	@return vIntPeriodOfInvestment
*/

function getPeriodOfInvestment(frmPowerCalc)
{
	var fieldDepositAmount = frmPowerCalc.DepositAmount;
	var fieldRateOfInterest = frmPowerCalc.RateOfInterest;
	var fieldCorpusAmount = frmPowerCalc.CorpusAmount;
	var fieldPaymentPeriod = frmPowerCalc.PaymentPeriod;
	//Duration of Saving  in Months
	var vIntPeriodOfInvestment = 0
	
	// Deposit Amount
	var DepositAmount = fieldDepositAmount.value; 
	// Rate of interest
	var RateOfInterest =fieldRateOfInterest.value;
	// Periodicity of Payment
	var PaymentPeriod = fieldPaymentPeriod.value;
	//Corpus Amount
	CorpusAmount = fieldCorpusAmount.value;
	
	if(PaymentPeriod == 1 || PaymentPeriod ==2 || PaymentPeriod == 4 || PaymentPeriod == 12)
	{
		//Periodicity of payment
		var vPeriod = 12 / PaymentPeriod;
		
		var vCorpusRate = CorpusAmount * RateOfInterest/100 / PaymentPeriod;
		//alert(vCorpusRate);

		var vDepositRate = DepositAmount * (1 + RateOfInterest/ 100/ PaymentPeriod );
		//alert("Deposit :" + DepositAmount + " Rate: " + RateOfInterest + " Period : " + PaymentPeriod);
		//alert(vDepositRate);
		
		var vNumerator = Math.log(vCorpusRate / vDepositRate  + 1);
		//vNumerator = (vNumerator);
		//alert(vNumerator);
		
		var vRateOfInterest = Math.log(1 + (RateOfInterest / 100 / PaymentPeriod));
		//var vRateOfInterest = (vRateOfInterest);
		//alert(vRateOfInterest);
		
		var vIntPeriodOfInvestment = vPeriod *(vNumerator / vRateOfInterest);

		//alert(vIntPeriodOfInvestment);
		document.frmPowerCalc.Period.value = Math.round(vIntPeriodOfInvestment/12 * 100)/100;
	}
	else if(PaymentPeriod == 3)
	{
		var vNumerator = CorpusAmount / DepositAmount;
		vNumerator = Math.log(vNumerator);
		var vDenominator = (1 +(RateOfInterest/ (100)));
		vDenominator = Math.log(vDenominator);
		
		vIntPeriodOfInvestment = vNumerator / vDenominator;
		//calculate in number of year
		//vIntPeriodOfInvestment = parseInt(vIntPeriodOfInvestment);
		document.frmPowerCalc.Period.value = Math.round(vIntPeriodOfInvestment * 100)/100;
		//document.frmPowerCalc.Period.value = vIntPeriodOfInvestment;
	}
	else
	{
			document.frmPowerCalc.Period.value = vIntPeriodOfInvestment;
	}
}

/*
	This function will be return rate of interest on invested amount. 
	@return vIntRateOfInterest
*/
function getRateOfInterest(frmPowerCalc)
{
	var fieldPeriod = frmPowerCalc.Period;
	var fieldCorpusAmount = frmPowerCalc.CorpusAmount;
	var fieldPaymentPeriod = frmPowerCalc.PaymentPeriod;
	var fieldDepositAmount = frmPowerCalc.DepositAmount;
	//Expected rate of Interest
	var vIntRateOfInterest = 0.0;
	
	// Period of Investment
	Period = fieldPeriod.value;
	//Corpus Amount
	CorpusAmount = fieldCorpusAmount.value;
	// Periodicity of Payment
	PaymentPeriod = fieldPaymentPeriod.value;
	// Deposit Amount
	DepositAmount = fieldDepositAmount.value; 	
	
	var x,y,z;
	//payment due value at the beginning of the period
	var type = 0;
	x = 1;
	var wanted_precision=0.00000001;
	var current_diff = Number.MAX_VALUE;
	var max_iterations = 100;
	var iterations_done = 0;
	
	if(PaymentPeriod == 1 || PaymentPeriod ==2 || PaymentPeriod == 4 || PaymentPeriod == 12)
	{
		var vTotalPeriod = Period * (12/PaymentPeriod);
		DepositAmount = -DepositAmount;
		while(current_diff > wanted_precision && iterations_done < max_iterations)
		{
			y = Math.pow(1+x,vTotalPeriod-1);
			z = y * (1+x);
			
			vIntRateOfInterest= x * (1-(DepositAmount* (1 + x*type)*(z-1)+x*CorpusAmount)/(-DepositAmount*(z-1)+x*DepositAmount*(1 + x*
				type)*vTotalPeriod*y));
				
			iterations_done++;
			current_diff=Math.abs(vIntRateOfInterest-x);
			x = vIntRateOfInterest;
		}//end of while		
		if(current_diff>=wanted_precision)
		{			
			return  Number.NaN;
		}
		else
		{	
			if(x < 0)
			{
				alert("Please verify the values you have entered");
				document.frmPowerCalc.RateOfInterest.value = "";
				return;
			}
			document.frmPowerCalc.RateOfInterest.value = Math.round(x*100*1000)/1000;
		}			
	}	
	else if(PaymentPeriod == 3)
	{
		var vCorpusDeposit = (CorpusAmount/DepositAmount);
		
		vCorpusDeposit = Math.log(vCorpusDeposit);
		//alert("Log" + vCorpusDeposit);
		//Calculating exponential number
		var vExpNumber = vCorpusDeposit / (Period);
		vExpNumber = Math.exp(vExpNumber);
			
		vIntRateOfInterest = (vExpNumber - 1) * 100;
		//alert("Log" + vIntRateOfInterest);
		if(vIntRateOfInterest < 0)
		{
			alert("Please verify the values you have entered");
			document.frmPowerCalc.RateOfInterest.value = "";
			return;
		}
		document.frmPowerCalc.RateOfInterest.value = Math.round(vIntRateOfInterest*1000)/1000;
	}
	else
	{
		//alert(625);
		document.frmPowerCalc.RateOfInterest.value = vIntRateOfInterest;	
	}
}

//Takes number from 0 to 9
function onlyNums()
{	
  if((event.keyCode >= 48 && event.keyCode <= 57))
	{
		return true;
	}
	return false;
}

//Takes number from 0 to 9 and also dot
function onlyNumsDot()
{
	if((event.keyCode >= 48&& event.keyCode <= 57 || event.keyCode == 46))
	{
		return true;
	}
	return false;
}

function numeric(field)
{
	var vFieldValue = field.value;
	var vFieldLength = field.value.length;
	var vStringValue = new String();
	var j=0;
	var k=0;
	for(var i=0; i<vFieldLength; i++)
	{
		if(vFieldValue.charAt(i)=='.')
		{
			j=j+1;
			if(j>=2)
			{
				continue;
			}
		}
		if(vFieldValue.charAt(i)<=9 || vFieldValue.charAt(i) >=0 || vFieldValue.charAt(i)=='.')
		{
			k=k+1;
			vStringValue = vStringValue + vFieldValue.charAt(i);
		}
	}
	if(k==0)
	{
		field.value="";
		return;
	}
	field.value=parseFloat(vStringValue);
	return;
}