var noLeadingZeros = /^0*(\d+)$/;
var replaceWordChars = /\D/;
var calculationLocation = "";

var availableTermsProcessing = false;
var monthlyPaymentProcessing = false;
var productDetailsProcessing = false;
var valueMapper = {
	calculatorid : null,
		
	termValues : new Array(),
	monthlyPaymentValues : new Array(),
	
	activeTermsValue : null,
	activeMonthlyPaymentsValue : null,
	
	lastTriggeredSlider : "applicationAmount"
};

function initializeSliderCalculator(calculatorid, minAmount, maxAmount, initialAmount, granularity, submitButtonLink, initalTermsValue, initialMonthlyPaymentValue, prod_id, prod_desc, gaNumber, gaCategory, gaAction, gaLabel, gaProductName) {
	$("#submitForm").attr("action", unescape(submitButtonLink));
	$("#submitForm").attr("method", "GET");
	$("#submitForm").attr("target", "_top");

	// Disable submitting the form by pressing the enter key
	$("#submitForm").bind("keypress", function(e) {
		if (e.keyCode == 13) {
			return false;
		}
	});
	
	$(".btn_oranje_pijl").click(function(e){
		//if google analytics is configured, send the measurecall, then submit the form
		if (gaNumber != null && gaNumber != "" && gaCategory != null && gaCategory != "" && gaAction != null && gaAction != "" && gaLabel != null && gaLabel != "") {
			_gaq.push(['_trackEvent', gaCategory, gaAction, gaLabel ]);
			setTimeout('$("#submitForm").submit()', 100);
		} else {
			$("#submitForm").submit();
		}
	});

	valueMapper.calculatorid = calculatorid;
	
	// Slider display fields
	$("#eindwaarden").html(formatMoneyValueNoFraction(parseFloat(maxAmount / 1000)));
	$("#beginwaarden").html(formatMoneyValueNoFraction(parseFloat(minAmount / 1000)));
	
	$("#submitForm").append("<input type='hidden' name='PROD_ID' id='PROD_ID' value='" + prod_id + "' />");
	$("#submitForm").append("<input type='hidden' name='IBIZA_PINKC_COMMERICAL_PRODDESC' id='IBIZA_PINKC_COMMERICAL_PRODDESC' value='" + prod_desc + "' />");
	$("#submitForm").append("<input type='hidden' id='gaProductName' name='gaProductName' value='" + gaProductName + "' />");

	// Configure slider
	$("#slider").slider({
		range: "max",
		min: parseFloat(minAmount / 1000),
		max: parseFloat(maxAmount / 1000),
		value: parseFloat(initialAmount / 1000),
		step : parseFloat(granularity / 1000),
		slide: function(event, ui) {
			$("#input_bedrag").val(ui.value);
		},
		change: function(event, ui){
			enableGUI(false);
			
			$("#availableTerms ul").children().unbind();
			$("#availableMonthlyPayments ul").children().unbind();
			
			valueMapper.lastTriggeredSlider = "applicationAmount";
			
			updateAvailableTerms(calculatorid, valueMapper.activeTermsValue, valueMapper.activeMonthlyPaymentsValue);
			updateMonthlyPayments(calculatorid, valueMapper.activeTermsValue, valueMapper.activeMonthlyPaymentsValue);
			
			var value = ui.value;
			if (value >= parseFloat(minAmount / 1000) && value <= parseFloat(maxAmount / 1000)) {
				$("#input_bedrag").removeClass("error");
				$(".btn_oranje_pijl").attr("disabled", false).removeClass("button_disabled");
				$("#tooltip").unbind();
				$("#tooltip").hide();
				$(".infoBlock_2").remove();
				$(".info").removeClass("info_invalid");
			}
		}
	});
	
	// Set slidervalue to inputvalue when inputvalue changes
	$("#input_bedrag").bind('keyup', {min : parseFloat(minAmount / 1000), max : parseFloat(maxAmount / 1000)} , function(event) {
		$(this).stopTime();
		
		var value = event.target.value;
		while (replaceWordChars.test(value)) {
			value = value.replace(replaceWordChars,"");
		}
		groups = noLeadingZeros.exec(value);
		if (groups != null) {
			value = groups[1];
		}
		$("#input_bedrag").val(value);
		if (value >= event.data.min && value <= event.data.max) {
			$("#input_bedrag").removeClass("error");
			$(".btn_oranje_pijl").attr("disabled", false).removeClass("button_disabled");
			$(this).oneTime(1000, function(){
				$('#slider').slider('value', value);
				$("#tooltip").unbind();
				$("#tooltip").hide();
				$(".infoBlock_2").remove();
				$(".info").removeClass("info_invalid");
			});
		} else {
			$("#input_bedrag").addClass("error");
			$(".btn_oranje_pijl").attr("disabled", true).addClass("button_disabled");
			showErrorTooltip($("#input_bedrag"), "Waarde is kleiner dan het minimum of groter dan het maximum.");
		}
	});
	
	$("#input_bedrag").val($("#slider").slider("value"));
	
	enableGUI(false);	
	updateAvailableTerms(calculatorid, parseFloat(initalTermsValue / 1000) , parseFloat(initialMonthlyPaymentValue / 1000));
	updateMonthlyPayments(calculatorid, parseFloat(initalTermsValue / 1000) , parseFloat(initialMonthlyPaymentValue / 1000));
}

function updateAvailableTerms(calculatorid, terms, monthlyPayment) {
	$.get(calculationLocation + "/slidercalculatorcalculation",
		{
			"calculatorID" : calculatorid,
			"lastTriggeredSlider" : valueMapper.lastTriggeredSlider,
			"detailsType" : "termsAmount",
			"amount" : $('#slider').slider('option', 'value'),
			"terms" : (terms ? terms : valueMapper.activeTermsValue),
			"monthlyPayment" : (monthlyPayment ?  monthlyPayment : valueMapper.activeMonthlyPaymentsValue),
			"cacheFix" : new Date().getTime()
		},
		function(body, status) {
			if (status == 'success') {
				
				$("#availableTerms").children().remove();
				$("#submitForm").find("#IBIZA_PINKC_COMMERICAL_PRODDESC").remove();
				$("#submitForm").find("#PROD_ID").remove();
				
				valueMapper.termValues = new Array();
				$("#availableTerms").append("<ul id='availableTermsList'></ul>");
				$('Property', body).each(function (i, value){
					var propName = $(this).find('Name').text();
					var propValue = $(this).find('Value').text();
					if (propName == "duration") {
						valueMapper.activeTermsValue = parseFloat(propValue);
					} else if (propName == "IBIZA_PINKC_COMMERICAL_PRODDESC" || propName == "PROD_ID") {
						$("#submitForm").append("<input type='hidden' id='" + $(this).find('Name').text() + "' name='" + $(this).find('Name').text() + "' value='" + $(this).find('Value').text() + "' />");
					} else {
						$("#availableTerms ul").append("<li><span>" + parseFloat(propValue) + "</span></li>");
						var lastFilledArrayIndex = $("#availableTerms ul li").size() - 1;
						$($("#availableTerms ul li").get(lastFilledArrayIndex)).click(function(event){
							valueMapper.activeTermsValue = $(event.target).text();
							valueMapper.lastTriggeredSlider = 'duration';
							
							$("#availableTerms ul").children().unbind();

							enableGUI(false);
							updateAvailableTerms(calculatorid);
							updateMonthlyPayments(calculatorid);
						});
					}
					var nextEmptyArrayIndex = valueMapper.termValues.length;
					valueMapper.termValues[nextEmptyArrayIndex] = $("#availableTerms ul li").get(lastFilledArrayIndex);
				});
				
				processDone('avaliableTerms');
			} else {
				alert('Probleem bij laden van looptijden.');
				processDone('avaliableTerms');
			}
		}
	);
}

function updateMonthlyPayments(calculatorid, terms, monthlyPayment) {
	$.get(calculationLocation + "/slidercalculatorcalculation",
		{
			"calculatorID" : calculatorid,
			"lastTriggeredSlider" : valueMapper.lastTriggeredSlider,
			"detailsType" : "montlyPayment",
			"amount" : $('#slider').slider('option', 'value'),
			"terms" : (terms ? terms : valueMapper.activeTermsValue),
			"monthlyPayment" : (monthlyPayment ? monthlyPayment : valueMapper.activeMonthlyPaymentsValue),
			"cacheFix" : new Date().getTime()
		},
		function(body, status) {
			if (status == 'success') {
				
				$("#availableMonthlyPayments").children().remove();
				valueMapper.monthlyPaymentValues = new Array();
				
				$("#availableMonthlyPayments").append("<ul id='monthlyPaymentList'></ul>");
				
				$('Property', body).each(function (i, value){
					var propName = $(this).find('Name').text();
					var propValue = $(this).find('Value').text();

					if (propName == "monthlyPayment") {
						valueMapper.activeMonthlyPaymentsValue = parseFloat(propValue);
					} else {
						$("#availableMonthlyPayments ul").append("<li><span>" + formatMoneyValue(parseFloat(propValue)) + "</span></li>");
						var lastFilledArrayIndex = $("#availableMonthlyPayments ul li").size() - 1;
						$($("#availableMonthlyPayments ul li").get(lastFilledArrayIndex)).click(function(event){
							valueMapper.activeMonthlyPaymentsValue = parseFloat(propValue);
							valueMapper.lastTriggeredSlider = 'monthlyPayment';
							
							$("#availableMonthlyPayments ul").children().unbind();
							
							enableGUI(false);
							updateAvailableTerms(calculatorid);
							updateMonthlyPayments(calculatorid);
						});
					}
					var nextEmptyArrayIndex = valueMapper.monthlyPaymentValues.length;
					valueMapper.monthlyPaymentValues[nextEmptyArrayIndex] = $("#availableMonthlyPayments ul li").get(lastFilledArrayIndex);
				});
				processDone('monthlyPayment');
			} else {
				alert('Probleem bij laden van maandbedragen.');
				processDone('monthlyPayment');
			}
		}
	);
}

function updateProductDetails(calculatorid, terms) {
	$.get(calculationLocation + "/slidercalculatorcalculation",
		{
			"calculatorID" : calculatorid,
			"lastTriggeredSlider" : valueMapper.lastTriggeredSlider,
			"detailsType" : "productDetails",
			"amount" : $('#slider').slider('option', 'value'),
			"terms" : (terms ? terms : valueMapper.activeTermsValue),
			"cacheFix" : new Date().getTime()
		},
		function(body, status) {
			if (status == 'success') {
				
				$("#submitForm").find("#IMM_AMT2").remove();
				$("#submitForm").find("#MonthlyPayment").remove();
				$("#submitForm").find("#LoanTermsAmount").remove();
				$("#submitForm").find("#site").remove();
				
				$('Property', body).each(function (){
					if ($(this).find('Name').text() == 'IMM_AMT2') {
						$('#resultLoanAmount').html(formatMoneyValue(parseFloat($(this).find('Value').text() / 1000)));
						$("#submitForm").append("<input type='hidden' id='" + $(this).find('Name').text() + "' name='" + $(this).find('Name').text() + "' value='" + parseFloat($(this).find('Value').text() / 1000) + "' />");
					} else if ($(this).find('Name').text() == 'duration') {
						$('#resultLoanTerm').html(parseFloat($(this).find('Value').text() / 1000));
						$("#submitForm").append("<input type='hidden' id='LoanTermsAmount' name='PNumTerm' value='" + parseFloat($(this).find('Value').text() / 1000) + "' />");
					} else if ($(this).find('Name').text() == 'monthlyPaymentAmount') {
						$('#resultMonthlyPayment').text(formatMoneyValue(parseFloat($(this).find('Value').text() / 1000)));
						$("#submitForm").append("<input type='hidden' id='MonthlyPayment' name='PMInstall' value='" + parseFloat($(this).find('Value').text() / 1000) + "' />");
					} else if ($(this).find('Name').text() == 'yearlyInterestPercentage') {
						$('#resultyearlyInterest').html(formatPercentageValue(parseFloat($(this).find('Value').text() / 1000)));
					} else if ($(this).find('Name').text() == 'yearlyCostPercentage') {
						$('#resultyearlyCostPercentage').html(formatPercentageValue(parseFloat($(this).find('Value').text()) / 1000));
					} else if ($(this).find('Name').text() == 'totalPaymentAmount') {
						$('#resultLoanTotal').html(formatMoneyValue(parseFloat($(this).find('Value').text() / 1000)));
					} else if ($(this).find('Name').text() == 'site') {
						$("#submitForm").append("<input type='hidden' id='" + $(this).find('Name').text() + "' name='" + $(this).find('Name').text() + "' value='" + $(this).find('Value').text() + "' />");
					}
				});
				processDone('productDetails');
			} else {
				alert('Probleem bij laden van productdetails.');
				processDone('productDetails');
			}
		}
	);
}

function getItemIndexByValue(array, activeValue, format) {
	var index = null;
	$.each(array, function(i , value){
		if ((format ? formatMoneyValue(activeValue) : activeValue) == $(value).text()) {
			index = i;
		}
	});
	return index;
}

function changeActiveTermsItem(activeItemIndex) {
	// Remove old active settings
	$.each(valueMapper.termValues, function(i , value){
		$(this).removeClass('active');
	});
	$.each(valueMapper.termValues, function(i , value){
		if (i == activeItemIndex) {
			$(this).addClass('active');
		}
	});
}

function changeActiveMonthlyPaymentsItem(activeItemIndex) {
	$.each(valueMapper.monthlyPaymentValues, function(i , value){
		$(this).removeClass('active');
	});
	$.each(valueMapper.monthlyPaymentValues, function(i , value){
		if (i == activeItemIndex) {
			$(this).addClass('active');
		}
	});
}

function processDone(processType) {

	if (processType == 'avaliableTerms') {
		availableTermsProcessing = true;
	} else if (processType == 'monthlyPayment') {
		monthlyPaymentProcessing = true;
	} else if (processType == 'productDetails') {
		productDetailsProcessing = true;
	}
	if (availableTermsProcessing && monthlyPaymentProcessing && !productDetailsProcessing) {
		updateProductDetails(valueMapper.calculatorid, valueMapper.activeTermsValue);
	}

	if (availableTermsProcessing && monthlyPaymentProcessing && productDetailsProcessing) {
		changeActiveTermsItem(getItemIndexByValue(valueMapper.termValues, valueMapper.activeTermsValue, false));
		changeActiveMonthlyPaymentsItem(getItemIndexByValue(valueMapper.monthlyPaymentValues, valueMapper.activeMonthlyPaymentsValue, true));
		
		availableTermsProcessing = false;
		monthlyPaymentProcessing = false;
		productDetailsProcessing = false;
		enableGUI(true);
	}
}

function enableGUI(enable) {
	if (enable) {
		$("#input_bedrag").attr('disabled',false);
		$(".btn_oranje_pijl").attr('disabled',false).removeClass("button_disabled");;
		$("#slider").slider('enable');
	} else {
		$("#input_bedrag").attr('disabled',true);
		$(".btn_oranje_pijl").attr('disabled',true).addClass("button_disabled");
		$("#slider").slider('disable');
	}
}
