function LoanCaculator (totalLoan, loanYear, yearRate, loanMethod, periodMonthNum, floatRate) {
	var self = null;
	var _totalLoan = totalLoan;
	var _loanYear = loanYear;
	var _yearRate = yearRate;
	var _loanMethod = loanMethod;
	var _floatRate = 0;
	var _periodMonthNum = periodMonthNum;

	var _loanPlan = [];

	var _totalPay = 0;
	var _totalInterestPay = 0;
	
	
	function LoanCaculator() {
		self = this;
		self.setLoanMethod(loanMethod);
		if (typeof floatRate == "number") {
			_floatRate = floatRate;
		}
		//self.calculate();
	}

	function calculateDengEBenXi() {
		_loanPlan = [];
		
		var P = self.getTotalLoan();
		var I = self.getPeriodRate();
		var T = self.getPeriodNum();

		//每期应还金额 A = P*I/(1-Math.pow(1+I, -T))
		var periodPay = Math.round(P*I*100/(1-Math.pow(1+I, -T))) / 100.0;		
		var loanBalance = _totalLoan;
	
		_totalPay = 0;
		_totalInterestPay = 0;
				
		for (var i=0; i<T-1; i++) {
			var monthPlan = {};
			monthPlan.interestPay = Math.round(loanBalance * I * 100) / 100;
						
			monthPlan.corpusPay = periodPay - monthPlan.interestPay;
			monthPlan.corpusPay = Math.round(monthPlan.corpusPay * 100) / 100;

			monthPlan.totalPay = periodPay;	
						
			_loanPlan.push(monthPlan);
			
			_totalPay += monthPlan.totalPay;
			_totalPay = Math.round(_totalPay * 100) / 100;
			
			_totalInterestPay += monthPlan.interestPay;
			_totalInterestPay = Math.round(_totalInterestPay * 100) / 100;
			
			loanBalance = loanBalance - monthPlan.corpusPay;
			loanBalance = Math.round(loanBalance * 100) / 100;
			
			monthPlan.loanBalance = loanBalance;
		}
		
		var monthPlan = {};
		monthPlan.interestPay = Math.round(loanBalance * I * 100) / 100;
			
		monthPlan.corpusPay = loanBalance;

		monthPlan.totalPay = monthPlan.corpusPay + monthPlan.interestPay;	
		monthPlan.totalPay = Math.round(monthPlan.totalPay * 100) / 100;

		monthPlan.loanBalance = 0;

						
		_loanPlan.push(monthPlan);
			
		_totalPay += monthPlan.totalPay;
		_totalPay = Math.round(_totalPay * 100) / 100;

		_totalInterestPay += monthPlan.interestPay;
		_totalInterestPay = Math.round(_totalInterestPay * 100) / 100;
	}
	
	function calculateDengEBenJin() {
		_loanPlan = [];
		
		var P = self.getTotalLoan();
		var I = self.getPeriodRate();
		var T = self.getPeriodNum();

		var corpusPay = Math.round(P * 1.0 / T * 100) / 100;
		var loanBalance = _totalLoan;
	
		_totalPay = 0;
		_totalInterestPay = 0;
		
		for (var i=0; i<T-1; i++) {
			var monthPlan = {};
			monthPlan.interestPay = Math.round(loanBalance * I * 100) / 100;
			
			monthPlan.corpusPay = corpusPay;
			monthPlan.totalPay = monthPlan.interestPay + monthPlan.corpusPay;
			monthPlan.totalPay = Math.round(monthPlan.totalPay * 100) / 100;
									
			_loanPlan.push(monthPlan);
			
			_totalPay += monthPlan.totalPay;
			_totalPay = Math.round(_totalPay * 100) / 100;
			
			_totalInterestPay += monthPlan.interestPay;
			_totalInterestPay = Math.round(_totalInterestPay * 100) / 100;
			
			loanBalance = loanBalance - monthPlan.corpusPay;
			loanBalance = Math.round(loanBalance * 100) / 100;

			monthPlan.loanBalance = loanBalance;
		}
		
		var monthPlan = {};
		monthPlan.interestPay = Math.round(loanBalance * I * 100) / 100;
			
		monthPlan.corpusPay = loanBalance;

		monthPlan.totalPay = monthPlan.corpusPay + monthPlan.interestPay;	
		monthPlan.totalPay = Math.round(monthPlan.totalPay * 100) / 100;
						
		monthPlan.loanBalance = 0;

		_loanPlan.push(monthPlan);
			
		_totalPay += monthPlan.totalPay;
		_totalPay = Math.round(_totalPay * 100) / 100;

		_totalInterestPay += monthPlan.interestPay;
		_totalInterestPay = Math.round(_totalInterestPay * 100) / 100;
	}

	function calculateAnJiJieXi() {
		_loanPlan = {};
		var P = self.getTotalLoan();
		var I = self.getPeriodRate();
		var T = self.getPeriodNum();
		
		_loanPlan.periodInterest = Math.round(P * I * 100)/100;

		_totalInterestPay = Math.round(_loanPlan.periodInterest * T * 100) / 100;	

		_totalPay = _totalLoan + _totalInterestPay;
		_totalPay = Math.round(_totalPay * 100) / 100;			
	}

	with (LoanCaculator) {
		// 贷款总月数 Y
		prototype.getMonthNum = function() {
			return self.getLoanYear() * 12;
		}

		// 还款周期月数 Z
		prototype.getPeriodMonthNum = function() {
			return _periodMonthNum;
		}
		prototype.setPeriodMonthNum = function(thePeriodMonthNum) {
			_periodMonthNum = thePeriodMonthNum;
		}
		
		// 还款周期数(可以为小数) T = Y/Z
		prototype.getPeriodNum = function() {
			return self.getMonthNum() / self.getPeriodMonthNum();
		}
		
		// 贷款年利率 G
		prototype.getYearRate = function() {
			return _yearRate;
		}
		prototype.setYearRate = function(theYearRate) {
			_yearRate = theYearRate;
		}

		// 浮动比率 H
		prototype.getFloatRate = function() {
			return _floatRate;
		}
		prototype.setFloatRate = function(theFloatRate) {
			_floatRate = theFloatRate;
		}
		
		// 浮动比率 H
		prototype.getFloatedYearRate = function() {
			return Math.round(self.getYearRate() * (1 + self.getFloatRate()/100.0) * 10000) / 10000;
		}

		// 还款周期利率 I = G/12 * Z * (1+H)
		prototype.getPeriodRate = function() {
			//return Math.round(self.getYearRate() * self.getPeriodMonthNum() * (1 + self.getFloatRate()/100.0) *100 / 12 ) / 10000.0;
			return self.getFloatedYearRate() * self.getPeriodMonthNum() / 12 / 100.0;
		}
		
		// 贷款额	
		prototype.getTotalLoan = function() {
			return _totalLoan;
		}
		prototype.setTotalLoan = function(theTotalLoan) {
			_totalLoan = theTotalLoan;
		}
		
		// 贷款年数
		prototype.getLoanYear = function() {
			return _loanYear;
		}
		prototype.setLoanYear = function(theLoanYear) {
			_loanYear = theLoanYear;
		}

		// 还款方式
		prototype.getLoanMethod = function() {
			return _loanMethod;
		}
		prototype.setLoanMethod = function(theLoanMethod) {
			if (!theLoanMethod) {
				_loanMethod = "debx";
			}
			else {
				_loanMethod = theLoanMethod;
			}
		}
		
		prototype.calculate = function() {
			if (_loanMethod == "debx") {
				calculateDengEBenXi();
			}
			else if (_loanMethod == "debj") {
				calculateDengEBenJin();
			}
			else {
				calculateAnJiJieXi();
			}
			return this;
		}
		
		prototype.getLoanPlan = function() {
			return _loanPlan;
		}

		prototype.getTotalPay = function() {
			return _totalPay;
		}

		prototype.getTotalInterestPay = function() {
			return _totalInterestPay;
		}
	}
	
	return new LoanCaculator();
}