// Copyright Calculator.co.uk All Rights Reservered

var mortgageAmount_min = 10000;
var mortgageAmount_max = 500000;
var mortgageAmount = 170000;

var mortgageTerm_min = 1;
var mortgageTerm_max = 45;
var mortgageTerm = 25;

var interestRate_min = 0.25;
var interestRate_max = 15;
var interestRate = 5.0;

var initializing = true;

function setupCalculator()
{	
   	var mortgageAmountValues = CreateSliderValues(new Array(), mortgageAmount_min, 150000, 2000);
	mortgageAmountValues = CreateSliderValues(mortgageAmountValues, 152000, 300000, 3000);
	mortgageAmountValues = CreateSliderValues(mortgageAmountValues, 304000, mortgageAmount_max, 4000);
	
	var mortgageTermValues = CreateSliderValues(new Array(), mortgageTerm_min, mortgageTerm_max, 1);
	var interestRateValues = CreateSliderValues(new Array(), interestRate_min, interestRate_max, 0.25);		
		
	// loan amount
	var mortgageAmountSlider = new Control.Slider('mortgageAmountHandle', 'mortgageAmountTrack', {
		range: $R(mortgageAmount_min, mortgageAmount_max),				
		sliderValue: mortgageAmount,	
		values: mortgageAmountValues,
		onSlide: Slider_onSlide,
		onChange: Slider_onChange
	});	
	mortgageAmountSlider.sliderId = 'mortgageAmountSlider';
	mortgageAmountSlider.textInput = $('mortgageAmountTextInput');
	mortgageAmountSlider.textInput.onchange = function(){TextBox_onChange(this, mortgageAmountSlider.textInput.value, mortgageAmountSlider, true)}	
	
	// term (in years)
	var mortgageTermSlider = new Control.Slider('mortgageTermHandle', 'mortgageTermTrack', {
		range: $R(mortgageTerm_min, mortgageTerm_max),				
		sliderValue: mortgageTerm,	
		values: mortgageTermValues,
		onSlide: Slider_onSlide,
		onChange: Slider_onChange
	});	
	mortgageTermSlider.sliderId = 'mortgageTermSlider';
	mortgageTermSlider.textInput = $('mortgageTermTextInput');
	mortgageTermSlider.textInput.onchange = function(){TextBox_onChange(this, mortgageTermSlider.textInput.value, mortgageTermSlider, false)}	
	
	// interest rate
	var interestRateSlider = new Control.Slider('interestRateHandle', 'interestRateTrack', {
		range: $R(interestRate_min, interestRate_max),				
		sliderValue: interestRate,	
		values: interestRateValues,
		onSlide: Slider_onSlide,
		onChange: Slider_onChange
	});	
	interestRateSlider.sliderId = 'interestRateSlider';	
	interestRateSlider.textInput = $('interestRateTextInput');
	interestRateSlider.textInput.onchange = function(){TextBox_onChange(this, interestRateSlider.textInput.value, interestRateSlider, true)}		
	
	mortgageAmountSlider.setValue(mortgageAmount);
	mortgageTermSlider.setValue(mortgageTerm);
	interestRateSlider.setValue(interestRate);
	
	// this variable is used to avoid initial ajax requests while we're creating
	// the sliders and setting its values.
	// from this point we want to flag the initialization as finished
	initializing = false;
	
	// now we need to have the initial values written on the sliders
	// and also issue the 1st ajax request, to show the result message
	Slider_onSlide(mortgageAmount, mortgageAmountSlider);
	Slider_onSlide(mortgageTerm, mortgageTermSlider);
	Slider_onChange(interestRate, interestRateSlider);
}

function Slider_onSlide(sliderValue, sliderObj)
{	
	if(initializing == false)
	{
		var formattedValue = '';
		
		sliderObj.textInput.value = sliderValue;
		
		if(sliderObj.sliderId == 'mortgageAmountSlider')
		{		
			formattedValue = FormatCurrency(sliderValue, false);
			mortgageAmount = sliderValue;
			$('mortgageAmountHandleAmount').update(formattedValue);
		}
		else if(sliderObj.sliderId == 'mortgageTermSlider')
		{
		    formattedValue = sliderValue + ((sliderValue == 1) ? ' Year' : ' Years');
			mortgageTerm = sliderValue;
			$('mortgageTermHandleAmount').update(formattedValue);
		}
		else if(sliderObj.sliderId == 'interestRateSlider')
		{
		    formattedValue = sliderValue + '%';
			interestRate = sliderValue;
			$('interestRateHandleAmount').update(formattedValue);
		}
	updatePayments();
	}
}

function Slider_onChange(sliderValue, sliderObj)
{
	if(initializing == false)
	{
		Slider_onSlide(sliderValue, sliderObj);
		updatePayments();
	}
}
function updatePayments()
{
		var modifiedInterestRate = interestRate / 100;

		var P = Math.round(((mortgageAmount * modifiedInterestRate) / 12) * (1 / (1 - (Math.pow(1 / (1 + modifiedInterestRate), mortgageTerm)))));
		$('monthlyrepayment').update("£" + P);

		var monthlyPayment_InterestOnly = Math.round(((mortgageAmount * mortgageTerm) * (interestRate / 100)) / (12 * mortgageTerm));
		$('monthlyinterestonly').update("£" + monthlyPayment_InterestOnly);
}

Event.observe(window, 'load', setupCalculator);

// Common Below

function FormatCurrency(num, includeCents)
{
	// this will format a number to currency
	
	num = num.toString().replace(/\$|\,/g,'');
	
	if(isNaN(num))
	{
		num = "0";
	}
	
	var sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	
	var cents = num%100;
	num = Math.floor(num/100).toString();
	
	if(cents<10)
	{
		cents = "0" + cents;
	}
	
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
	{
		num = num.substring(0,num.length-(4*i+3))+','+
			num.substring(num.length-(4*i+3));
	}
	
	var ret = (((sign)?'':'-') + '&pound;' + num);
	if(includeCents)
	{
		ret += '.' + cents;
	}
	return ret;
}

function CreateSliderValues(arr, min, max, increment)
{
	for(var i = min; i <= max; i = i + increment)
	{
		arr[arr.length] = i;
	}
	return arr;
}

function TextBox_onKeyPress(evt, textBox)
{
	var keyCode = null;
	
	//get keyCode from the key press event
	if(evt.which)
	{
		keyCode = evt.which;
	}
	else if(evt.keyCode)
	{
		keyCode = evt.keyCode;
	}
	
	//if the key pressed is enter (13) lose focus (this makes clicking enter fire the onchange event)
	if(keyCode == 13)
	{
		textBox.blur();
		return false;
	}
    return true;
}

function TextBox_onChange(inputElement, textValue, sliderObj, acceptDecimals)
{
    if(!initializing)
    {        
        textValue = textValue.sub('\u00A3', '');
        textValue = textValue.sub(',', '');
        textValue = textValue.sub('%', '');
        if(!isNaN(textValue) && textValue >= sliderObj.minimum && textValue <= sliderObj.maximum)
        {
            var v = null;
            if(acceptDecimals == true)
            {
                v = parseFloat(textValue);
            }        
            else
            {
                v = parseInt(textValue);
            }
        
            //moves the slider to approx value (e.g. 12000 becomes 13000 - this is okay for the slider position)
            sliderObj.setValue(v);
            
            // set the text on the slider to accurate value
            Slider_onChange(v, sliderObj);
        }
        else
        {            
            alert('The amount is invalid. Please enter a number between ' + sliderObj.minimum + ' and ' + sliderObj.maximum);            
        }
    }
}