// Boat Loan Calculator, MooTools Version.
// By: Landon Shumway
// May 2008

var FormIsValid = true;
var GraphScript = './boat_loan_graphs.cgi';
var LoanAmountInvalidMsg = 'Please enter a valid loan amount. Please omit dollar signs and commas.';
var InterestRateInvalidMsg = 'Please enter a valid interest rate. (1.00 - 100.00)';
var LoanLengthInvalidMsg = 'Please enter a valid number of years. (1 - 20)';
var GraphLinksHidden = 1; var LoanAmount = 0; var InterestRate = 0; var LoanLengthMonths = 0; var LoanLength = 0; var ComputedRate = 0; var BubbleState = 0;
var CurrentGraph = '';

function AnimateGraphBubbleUp()
{
	var BubbleEffects = new Fx.Style($('GraphBubble'), 'opacity', {duration:750, transition: Fx.Transitions.Cubic.easeOut}).start(0,1);
	var BubbleBodyEffects = new Fx.Styles($('GraphBubbleBody'), {duration: 700, transition: Fx.Transitions.Cubic.easeOut}).start({'height': [35, 180], 'min-height': [35, 180]});
	return true;
}

function AnimateGraphBubbleDown()
{
	var BubbleEffects = new Fx.Style($('GraphBubble'), 'opacity', {duration:550, transition: Fx.Transitions.Cubic.easeIn}).start(1,0);
	var BubbleBodyEffects = new Fx.Styles($('GraphBubbleBody'), {duration: 600, transition: Fx.Transitions.Cubic.easeIn}).start({'height': [180, 35], 'min-height': [180, 35]});
	return true;
}

function RevertThinkingImage()
{
	var ThinkingImage = new Fx.Style($('ThinkingImage'), 'opacity', {duration:750, transition: Fx.Transitions.Cubic.easeOut}).start(1,0);
	return 1;
}

function HideGraph()
{
	if (BubbleState){
		AnimateGraphBubbleDown(); BubbleState = 0; CurrentGraph = '';
	} return true;
}

function ShowGraph(GraphName)
{
	if (ValidateLoanTerms()){
		if (CurrentGraph == GraphName){
			HideGraph(); return false;
		}else if (BubbleState == 0){
			AnimateGraphBubbleUp(); BubbleState = 1;
		}
		CurrentGraph = GraphName;
		$('GraphImage').setProperty('src', '/images/blank.gif');
		$('GraphImage').setProperty('src', GraphScript + '?principle='+LoanAmount+'&rate='+InterestRate+'&term='+LoanLength+'&graph='+GraphName);
		$('GraphBubble').removeClass("ElementHidden"); 
	} return true;
}

function ValidateLoanTerms()
{
	FormIsValid = true;
	
	var isAFloat = new RegExp("^[0-9]+$|^[0-9]+\.[0-9]+$");
	var isMoney = new RegExp("^[0-9]+$|^[0-9]+\.[0-9]{2}$");
	var isAnInteger = new RegExp("^[0-9]+$");
	
	var LoanAmountTemp = document.getElementById('amount_input');
	var InterestRateTemp = document.getElementById('interest_rate_input');
	var LoanLengthTemp = document.getElementById('length_input');
	
	if (isMoney.test(LoanAmountTemp.value) == false){
		alert (LoanAmountInvalidMsg); FormIsValid = false;
	}else{
		LoanAmount = parseFloat(LoanAmountTemp.value);
	}

	if (isAFloat.test(InterestRateTemp.value) == false){
		alert (InterestRateInvalidMsg); FormIsValid = false;
	}else{
		InterestRate = parseFloat(InterestRateTemp.value);
		ComputedRate = (InterestRate / 1200)
	}
	
	if (isAnInteger.test(LoanLengthTemp.value) == false || parseInt(LoanLengthTemp.value) > 20){
		alert (LoanLengthInvalidMsg); FormIsValid = false;
	}else{
		LoanLength = parseInt(LoanLengthTemp.value);
		LoanLengthMonths = 12 * LoanLength;
	}
	
	return FormIsValid;
}

function UpdateCalculations()
{
	if (FormIsValid){
		var TempResult = Math.pow((1 + ComputedRate), LoanLengthMonths);
		var MonthlyPayment = (ComputedRate + (ComputedRate / (TempResult - 1))) * LoanAmount;
		
		$('AmountComputed').setHTML('$' + PrettyMoney(parseInt(LoanAmount)));
		$('RateComputed').setHTML(InterestRate + '%');
		$('YearsComputed').setHTML(LoanLength);
		$('PaymentComputed').setHTML('$' + PrettyMoney(parseInt(MonthlyPayment)));
		var FadeInResults = new Fx.Style($('ResultsContainer'), 'opacity', {duration:750, transition: Fx.Transitions.Cubic.easeIn}).start(0,1);
		if (GraphLinksHidden){
			$('GraphsAndTables').setProperty('visibility', 'visible');
			var FadeInGraphLinks = new Fx.Style($('GraphsAndTables'), 'opacity', {duration:1500, transition: Fx.Transitions.Cubic.easeOut}).start(0,1); GraphLinksHidden = false;
		}
		RevertThinkingImage();
	}return true;
}

function CalculateLoan()
{
	var ThinkingImage = new Fx.Style($('ThinkingImage'), 'opacity', {duration:750, transition: Fx.Transitions.Cubic.easeOut}).start(0,1);
	$('GraphBubble').removeClass('ElementVisible').addClass('ElementHidden');
	
	if (ValidateLoanTerms() == false){
		RevertThinkingImage()
	}else{
		var FadeOutResults = new Fx.Style($('ResultsContainer'), 'opacity', {duration:750, transition: Fx.Transitions.Cubic.easeOut}).start(1,0);
		setTimeout("UpdateCalculations()", 1000);
	}
	
	return false;
}

function PrettyMoney(Value)
{
	var ValueStr = Value+'';
	var MyRegEx = new RegExp("([0-9])([0-9]{3}),");

	ValueStr = ValueStr.replace(/([0-9])([0-9]{3})$/g, "$1,$2");
	while (MyRegEx.test(ValueStr) == true){
		ValueStr = ValueStr.replace(/([0-9])([0-9]{3}),/g, "$1,$2,");
	}
	
	return ValueStr;
}