PaymentCalculatorHandler = {
	MONTHLY_PAYMENT : "monthlyPayment",
	PURCHASE_PRICE : "purchasePrice",
	type : "monthlyPayment",
	PaymentCalcCookie : null,
	clickCalculate : function() {
		try {
			PaymentCalculatorHandler.validate();
			var results = (PaymentCalculatorHandler.type == PaymentCalculatorHandler.MONTHLY_PAYMENT) ? PaymentCalculator.calculateMonthlyPayment() : PaymentCalculator.calculatePurchasePrice();
			PaymentCalculator.displayResults(PaymentCalculatorHandler.type, results.price, results.total);
		} catch (err) {
			handleException(err);
		} finally {
			return false;
		}
	},
	clickMonthlyPayment : function(isTotalInterestAvailable) {
		FormUtility.resetErrors();
		PaymentCalculatorHandler.type = PaymentCalculatorHandler.MONTHLY_PAYMENT;
		PaymentCalculator.switchElements(PaymentCalculatorHandler.MONTHLY_PAYMENT,isTotalInterestAvailable);
	},
	clickPurchasePrice : function() {
		FormUtility.resetErrors();
		PaymentCalculatorHandler.type = PaymentCalculatorHandler.PURCHASE_PRICE;
		PaymentCalculator.switchElements(PaymentCalculatorHandler.PURCHASE_PRICE);
	},
	pageLoad : function(form) {
		PaymentCalculator.init(form);
	},
	validate : function() {
		FormUtility.resetErrors();
		var missingFields = PaymentCalculator.getMissingRequired(PaymentCalculatorHandler.type);
		if (missingFields.length) throw new MissingRequiredError(missingFields);
		var badFields = PaymentCalculator.getBadlyFormatted(PaymentCalculatorHandler.type);
		if (badFields.length) throw new BadFormatError(badFields);
		if (PaymentCalculatorHandler.type == PaymentCalculatorHandler.MONTHLY_PAYMENT) {
			var badPriceFields = PaymentCalculator.getBadPriceFields();
			if (badPriceFields.length) throw new BadPriceError(badPriceFields);
		}
	}
}
PaymentCalculator = {
	form : null,
	elementIds : ["FieldLabel", "Field", "Label", "Value", "Total"],
	bDownChanged : false,
	init : function(form) {
		PaymentCalculator.form = form;
		PaymentCalculator.bDownChanged = false;			
	},
	calculateMonthlyPayment : function() {
		var principal = PaymentCalculator.parseFloat(PaymentCalculator.form.purchasePrice.value) - PaymentCalculator.parseFloat(PaymentCalculator.form.downPayment.value);
		if(PaymentCalculator.form.trade.value) principal -= PaymentCalculator.parseFloat(PaymentCalculator.form.trade.value);
		var loanTerm = PaymentCalculator.parseFloat(PaymentCalculator.form.loanTerm.value);
		var interestRate = PaymentCalculator.parseFloat(PaymentCalculator.form.interestRate.value) / 100;
		var downPayment = PaymentCalculator.parseFloat(PaymentCalculator.form.downPayment.value);
		if (interestRate > 0) {
			var monthlyPayment = (principal * (interestRate / 12)) / (1 - Math.pow((1 + interestRate / 12), (loanTerm * -1)));
		} else if (interestRate == 0) {
			var monthlyPayment = principal / loanTerm;
		}
		var totalPrice = (monthlyPayment * loanTerm) + downPayment;
		PaymentCalculator.generateCookie("term",loanTerm);
		PaymentCalculator.generateCookie("rate",PaymentCalculator.parseFloat(PaymentCalculator.form.interestRate.value));
		if(PaymentCalculator.bDownChanged == true) {
			PaymentCalculator.generateCookie("down",downPayment);
		}
		return {price: payCalc.getFormattedPrice(monthlyPayment, 2), total: payCalc.getFormattedPrice(totalPrice, 2)};
	},
	calculatePurchasePrice : function() {
		var monthlyPayment = PaymentCalculator.parseFloat(PaymentCalculator.form.monthlyPayment.value);
		var loanTerm = PaymentCalculator.parseFloat(PaymentCalculator.form.loanTerm.value);
		var interestRate = PaymentCalculator.parseFloat(PaymentCalculator.form.interestRate.value) / 100;
		var downPayment = PaymentCalculator.parseFloat(PaymentCalculator.form.downPayment.value);
		var purchasePrice = ((monthlyPayment * (1 - Math.pow((1 + interestRate / 12), (loanTerm * -1)))) / (interestRate / 12)) + downPayment;
		var totalPrice = (monthlyPayment * loanTerm) + downPayment;
		return {price: payCalc.getFormattedPrice(purchasePrice, 2), total: payCalc.getFormattedPrice(totalPrice, 2)};
	},
	calculateDownPayment : function() {
	    if(PaymentCalculator.form.purchasePrice.value) {
	        var downPayment = (PaymentCalculator.parseFloat(PaymentCalculator.form.purchasePrice.value)* (PaymentCalculator.form.downPercentage.value)) / 100;
	        PaymentCalculator.form.downPayment.value = downPayment;
	    }
	},
	displayResults : function(type, result, total) {
		document.getElementById(type + "Value").innerHTML = result;
		jQuery(".symbol").show();
		if (document.getElementById(type + "Total")) document.getElementById(type + "Total").innerHTML = total;
	},
	generateCookie : function(strCookieName,strCookieValues,oCookieExpiration,strCookieDomain) {
		PaymentCalculatorHandler.PaymentCalcCookie = new CobaltCookie(strCookieName,strCookieValues,oCookieExpiration,strCookieDomain);
		PaymentCalculatorHandler.PaymentCalcCookie.create(strCookieName,strCookieValues,oCookieExpiration,strCookieDomain);
	},
	getBadPriceFields : function() {
		var priceField = PaymentCalculator.form[PaymentCalculatorHandler.PURCHASE_PRICE];
		var downPaymentField = PaymentCalculator.form["downPayment"];
		if (PaymentCalculator.parseFloat(priceField.value) < PaymentCalculator.parseFloat(downPaymentField.value)) return [priceField, downPaymentField];
		return [];
	},
	getBadlyFormatted : function(type) {
		var badFields = FormUtility.getBadlyFormatted(PaymentCalculator.form);
		var priceField = PaymentCalculator.form[type + "Field"];
		var interestField = PaymentCalculator.form["interestRate"];
		if (!PaymentCalculator.isNonNegativeNumber(priceField.value)) badFields.push(priceField);
		if (PaymentCalculator.parseFloat(interestField.value) > 100) badFields.push(interestField);
		return badFields;
	},
	getMissingRequired : function(type) {
		var missingFields = FormUtility.getMissingRequired(PaymentCalculator.form);
		var priceField = PaymentCalculator.form[type + "Field"];
		if (isEmpty(priceField.value)) missingFields.push(priceField);
		return missingFields;
	},
	initPaymentCalcCookies : function() {
		if(document.cookie.indexOf("term")!=-1) {
			var TermCookie = new CobaltCookie("term");
			var storedTermCookieVal = TermCookie.get("term");
			PaymentCalculator.form.loanTerm.value = storedTermCookieVal;
		}
		if(document.cookie.indexOf("rate")!=-1) {
			var RateCookie = new CobaltCookie("rate");
			var storedRateCookieVal = RateCookie.get("rate");
			PaymentCalculator.form.interestRate.value = storedRateCookieVal;
		}
		if(document.cookie.indexOf("down")!=-1) {
			var DownCookie = new CobaltCookie("down");
			var storedDownCookieVal = DownCookie.get("down");
			PaymentCalculator.form.downPayment.value = storedDownCookieVal;
		} 
	},
	isNonNegativeNumber : function(num) { return (!isNaN(PaymentCalculator.parseFloat(num)) && (PaymentCalculator.parseFloat(num) >= 0)) ? true : false; },
	parseFloat : function(num) { return parseFloat(num.replace(/,/g, "")); },
	setChangedDownPayment : function() {
		PaymentCalculator.bDownChanged = true;
	},
	switchElements : function(type,isTotalInterestAvailable) {
		var totalElements = (isTotalInterestAvailable) ? 5 :4;
		for (var i=0; i<totalElements; i++) document.getElementById(type + PaymentCalculator.elementIds[i]).style.display = "inline";
		var oldType = (type == PaymentCalculatorHandler.MONTHLY_PAYMENT) ? PaymentCalculatorHandler.PURCHASE_PRICE : PaymentCalculatorHandler.MONTHLY_PAYMENT;
		for (var j=0; j<totalElements; j++) document.getElementById(oldType + PaymentCalculator.elementIds[j]).style.display = "none";
	}
}
function BadPriceError(fieldList) {
	this.superClass(fieldList, ERRORMESSAGE_DOWNPAYMENTTOOLARGE);
}
BadPriceError.prototype = new FormValidationError;
BadPriceError.prototype.superClass = FormValidationError;
function disclaimer(obj) {
	var el = document.getElementById(obj);
	if ( el.style.display != "none" ) {
		el.style.display = 'none';
	}
	else {
		el.style.display = '';
	}
}
