/// 计算债券的持有期年收益率为：%（正数，保留两位小数；计算得出）		
function CalcBondHold()
{
	/// 债券种类：0 附息、1 贴现（默认为0附息）
	var BondType = 0;
	/// 债券面额：元（正整数；无默认值）
	var Cost = 0;
	/// 附息债券利率：%（正数，保留两位小数；债券种类为贴现，则此项不出现）
	var FxRate = 0;
	/// 债券买入价格：元（正数，小数点后两位）
	var BuyPrice = 0;
	/// 债券买入年份：年 
	var BuyYears = new Date();
	/// 债券卖出价格：元（正数，小数点后两位）
	var SalePrice = 0;
	/// 债券卖出年份：年（大于买入年份）
	var SaleYears = new Date();
	/// 债券首次付息日
	var FirstPayDate = new Date();
	/// 卖出时的市场利率：  %（正数，小数点后两位）
	var MarketRate = 0;
	/// 附息债券利息支付方式：0 按年支付利息、1 一次还本付息(默认为0)
	var PayType = 0;
	///附息债券年利息支付频率：  次，正整数
	var Freq = 0;
	var rate = 0;
	
	BondType=BondHoldCalc.cbType.selectedIndex;
	if(BondType==0)
	{
		Cost = parseInt(BondHoldCalc.edSum.value);
		FxRate = parseFloat(BondHoldCalc.edInterestRate.value)/100;
		PayType = BondHoldCalc.cbMethod.selectedIndex;
	}
	BuyYears.setTime(StrToDate(BondHoldCalc.edBuyYear.value));
	BuyPrice = parseFloat(BondHoldCalc.edBuyPrice.value);
	SaleYears.setTime(StrToDate(BondHoldCalc.edSellYear.value));
	SalePrice = parseFloat(BondHoldCalc.edSellPrice.value);
	if((BondType==0)&&(PayType==0))
	{
		Freq = parseInt(BondHoldCalc.edFreq.value);
		//计算第一次付息日
		var limitdate = new Date(Cal_strtodate(BondHoldCalc.edPayDate.value))
		FirstPayDate = CalcPayDate(limitdate, BuyYears, Freq);
	}

	var DiffYear= GetDayLen1(SaleYears, BuyYears)/365;//持有年限＝（卖出日期—买入日期）/365
	var w,n,y;
	var isetp=0.0001;//误差上限
	var s=0.001;//黄金下限值
	var e=1;//黄金上限值
	var pv=0;//收益率计算所得的购买价格
	var tDays;
	tDays=GetDayLen1(FirstPayDate,BuyYears);//债券交割日距下一次付息日的实际天数
	if(BondType==0)	    // 付息债券
	{
		if (PayType==0) // 按年付息
		{
			w=tDays*Freq/365;//债券交割日距下一次付息日的实际天数 * 年付息频率 / 365			
			n=parseInt(GetDayLen1(SaleYears, FirstPayDate)	/365*Freq);//剩余的付息次数=1+[(卖出日 - 首次付息日)	/365 * 年付息频率]取整，不舍入
			if(FirstPayDate<=SaleYears)//如果第一次付息日早与卖出日期则计算为付息次数+1
				n = n+1;
			if(n>0)//如果购买期间有付息
			{
				y=(e-s)/2;//收益率初次估算值
				while ((Math.abs(pv-BuyPrice)>isetp)&&(Math.abs(e-s)>isetp))
				{
					pv=Calc(y,w,n,Cost*FxRate,Freq,SalePrice, DiffYear);
					if (pv==0) 
						break;
					if (pv<BuyPrice) 
					{
						e=y;
						y=(s+e)/2;
					}
					if (pv>BuyPrice)
					{
						s=y;
						y=(s+e)/2;
					}
				}
			}
			else//购买时间内无付息
			{
				y=(((SalePrice - BuyPrice)/DiffYear)/BuyPrice);
			}
			rate=y;
		}
		else // 一次还本付息
			rate=(((SalePrice - BuyPrice)/DiffYear)/BuyPrice);
	}
	else // 贴现债券
	{
			if ((BuyPrice==0)||(BuyPrice<0)) return -1;		
			rate=(((SalePrice - BuyPrice)/DiffYear)/BuyPrice);
	}
	
	return rate;
}	

function Calc(y, w, n, C, f, M, diffDay)
{
	var PV=0;
	for (var i=0;i<=n-1;i++)
	{
		PV=PV+(C/f)/Math.pow((1+y/f),i+w);
	}
	PV=PV+ M/Math.pow((1+y/f),diffDay);

	return PV;
}

/*根据债券到期日计算首次付息日 aiai add 6/21/04
EndDate:债券到期日
BuyDate:债券购买日 
PayFreq:年付息平率（次/年）
思路：假设购买年=第一次付息年，根据年付息频率估算付息年所有的付息日；
比较付息日与购买日的天数差，取最小的正整数差得付昔日作为第一次付息日。
*/
function CalcPayDate(limitdate, buydate, PayFreq)
{
	var BuyDate = new Date(Cal_strtodate(buydate));
	var EndDate = new Date(Cal_strtodate(limitdate));
	var PayDiffDays = Math.ceil(365/PayFreq);
	var tmpPayDate=new Array();
	var diff=new Array();
	var i;
	for(i=0; i<PayFreq; i++)
	{
		tmpPayDate[i] = new Date(BuyDate.getFullYear(), EndDate.getMonth(), EndDate.getDate()+new Number((i+1)*PayDiffDays+1));
		diff[i] = (tmpPayDate[i]-BuyDate)/(60*60*24*1000);
	}
	var tmpdiff=365;
	var nearDate=tmpPayDate[0];
	for(i=0; i<PayFreq; i++)
	{
		if(diff[i]<tmpdiff && diff[i]>0)
		{
			tmpdiff=diff[i];
			nearDate = tmpPayDate[i];
		}
	}
	return nearDate;
}