var ArgumentException = "系统错误。\n金融函数的参数与定义域不匹配。";

//检查贷款类函数的参数
function CheckLoanArguments(x, y, z, n)
{
	//x表示贷款金额，y表示利率，z表示还款总期数（下同）第n期的偿还本利和
	//x，(0, )，浮点型
	//y，[0, 1]，浮点型
	//z，(0, )，整型
	//n，[0, )，整型
	if (x<=0 || y<0 || y>1 || z<=0 || n<0)
	{
		//alert(ArgumentException);
		return false;
	}
	return true;
}

//检查年金类函数的参数
function CheckNnnuityArguments(x, y, z)
{
	//x表示每期付款或者到期本利，y表示收益率，z表示付款总次数
	//x，[0, )，浮点型
	//y，[0, 1]，浮点型
	//z，[0, )，整型
	if (x<0 || y<0 || y>1 || z<0)
	{
		//alert(ArgumentException);
		return false;
	}
	return true;
}

//函数一：等额本息偿还贷款，第n期的偿还本利和
function Fn101(x,y,z,n)
{
	if (!(CheckLoanArguments(x, y, z, n)))
		return 0;
		
	var ret = 0.0;
	if (n>z || n==0)
	{
		ret = 0;
	}
	else
	{
		if (y==0)
		{
			ret = x / z;
		}
		else
		{
			ret = x * y * Math.pow(1+y,z)/(Math.pow(1+y,z)-1);
		}
	}
	return ret;
}

//函数二：等额本息偿还贷款，第n期偿还后的剩余本金
function Fn102(x, y, z, n)
{  
	if (!(CheckLoanArguments(x, y, z, n)))
		return 0;

	var ret = 0.0;
    if (n == 0)
    {
		ret = x;
	}
	else if (n>z)
	{
		ret = 0;
	}
	else
	{
		//ret = Fn102(x,y,z,n-1) - (Fn101(x, y, z, n) - y * Fn102(x, y, z, n - 1));
		ret = x * Math.pow(1 + y, n) - Fn101(x, y, z, n) * (Math.pow(1 + y, n) - 1) / y;			
		
	}	
	return ret;
}
//函数三：等额本息偿还贷款，第n期时的偿还利息
function Fn103(x, y, z, n)
{
	if (!(CheckLoanArguments(x, y, z, n)))
		return 0;

	var ret = 0.0;
	if (n>z||n==0)
	{
		ret = 0;
	}
	else
	{
		ret = y * Fn102(x, y, z, n - 1);
	}
	return ret;
}

//函数四：等额本息偿还贷款，第n期时的偿还本金
function Fn104(x, y, z, n)
{
	if (!(CheckLoanArguments(x, y, z, n)))
		return 0;

	var ret = 0.0;
	if (n>z||n==0)
	{
		ret = 0;
	}
	else
	{
		ret = Fn101(x, y, z, n) - y * Fn102(x, y, z, n - 1);
	}
	return ret;
} 
//函数五：等额本息偿还贷款，第n期偿还后的累计偿还本利
function Fn105(x, y, z, n)
{
	if (!(CheckLoanArguments(x, y, z, n)))
		return 0;

	var ret = 0.0;
	if (n==0)
	{
		ret = 0;
	}
	else if	(n>0 && n<=z)
	{
		ret = n * Fn101(x, y, z, n);
	}
	else
	{
		ret = z * Fn101(x, y, z, z);
	}
	return ret;
}

//函数六：等额本息偿还贷款，第n期偿还后的累计偿还本金
function Fn106(x, y, z, n)
{
	if (!(CheckLoanArguments(x, y, z, n)))
		return 0;

	var ret = 0.0;
	if (n==0)
	{
		ret = 0;
		
	}
	else if (n>0 && n<=z)
	{
		for (t=0;t<n;t++)
		{
			ret += Fn104(x, y, z, t+1);
		}
	}
	else
	{
		for (t=0;t<z;t++)
		{
			ret += Fn104(x,y,z,t+1);
		}
	}
	return ret;
}

//函数七：等额本息偿还贷款，第n期偿还后的累计偿还利息
function Fn107(x, y, z, n)
{
	if (!(CheckLoanArguments(x, y, z, n)))
		return 0;

	var ret = 0.0;
	ret = Fn105(x, y, z, n) - Fn106(x, y, z, n);
	return ret;
}

//函数八：等额本金偿还贷款，第n期时的偿还本金
function Fn201(x, z, n)
{
	if (!(CheckLoanArguments(x, 0, z, n)))
		return 0;

	var ret = 0.0;
	if (n==0 || n>z)
	{
		ret = 0;
	}
	else
	{
		ret = x/z;
	}
	return ret;
}

//函数九：等额本金偿还贷款，第n期偿还后的剩余本金
function Fn202(x, z, n)
{
	if (!(CheckLoanArguments(x, 0, z, n)))
		return 0;

	var ret = 0.0;
	if (n==0)
	{
		ret = x;
	}
	else if (n>z)
	{
		ret = 0;
	}
	else
	{
		ret = x - n * Fn201(x, z, n); 
	}
	return ret;
}

//函数十：等额本金偿还贷款，第n期时的偿还利息
function Fn203(x, y, z, n)
{
	if (!(CheckLoanArguments(x, y, z, n)))
		return 0;

	var ret = 0.0;
	if (n==0||n>z)
	{
		ret = 0;
	}
	else
	{
		ret = y * Fn202(x, z, n - 1); 
	}
	return ret;
}

//函数十一：等额本金偿还贷款，第n期的偿还本息
function Fn204(x, y, z, n)
{
	if (!(CheckLoanArguments(x, y, z, n)))
		return 0;

	var ret = 0.0;
	
    ret = Fn201(x, z, n) + Fn203(x, y, z, n);
    return ret;
}

//函数十二：等额本金偿还贷款，第n期偿还后的累计偿还本息
function Fn205(x, y, z, n)
{
	if (!(CheckLoanArguments(x, y, z, n)))
		return 0;

	var ret = 0.0;
	if (n==0)
	{
		ret = 0;
	}
	else if (n>0 && n<=z)
	{
		for (t=0;t<n;t++)
		{
			ret += Fn204(x, y, z, t+1);
		}
	}
	else
	{
		for(t=0;t<z;t++)
		{
			ret += Fn204(x, y, z, t+1);
		}
	}
	return ret;
}

//函数十三：等额本金偿还贷款，第n期偿还后的累计偿还本金
function Fn206(x, z, n)
{
	if (!(CheckLoanArguments(x, 0, z, n)))
		return 0;

	var ret = 0.0;
	ret = x - Fn202(x, z, n);
	return ret;
}
 

//函数十四：等额本金偿还贷款，第n期偿还后的累计偿还利息
function Fn207(x, y, z, n)
{
	if (!(CheckLoanArguments(x, y, z, n)))
		return 0;

	var ret = 0.0;
	ret = Fn205(x, y, z, n) - Fn206(x, z, n);
	return ret;
}
 

//函数十五：先付年金计算到期本利(x,每期支付，Y：预期收益率，Z：期限）
function Fn208(x,y,z)
{
	if (!(CheckNnnuityArguments(x, y, z)))
		return 0;

	var ret = 0.0;
	for (t=0;t<z;t++)
	{
		ret += Math.pow((1+y),t+1);
		
	}
	return ret*x;
}



//函数十六：先付年金计算每期支付(到期本利, 预计收益率,期限）
function Fn209(x,y,z)
{
	if (!(CheckNnnuityArguments(x, y, z)))
		return 0;

	var ret = 0.0;
	for (t = 0;t<z;t++)
	{
		ret += Math.pow((1+y),t+1);
	}
	return x/ret;
}

//函数十七：后付年金计算到期本利(每期支付, 预计收益率,期限）
function Fn210(x,y,z)
{
	if (!(CheckNnnuityArguments(x, y, z)))
		return 0;

	var ret = 0.0;
	for (t=0;t<z;t++)
	{
		ret += Math.pow((1+y),t);
	}
	return ret*x;
}


//函数十八：后付年金计算每期支付(到期本利,预计收益率,期限）
function Fn211(x,y,z)
{
	if (!(CheckNnnuityArguments(x, y, z)))
		return 0;

	var ret = 0.0;
	for (t=0;t<z;t++)
	{
		ret += Math.pow((1+y),t);
	}
	return x/ret;
}

