fscalc = {
	
	url : "",
	endpreis : "", 
	anzahlung : "", 
	laufzeit : "",
	oldEndpreis : "", 
	oldAnzahlung : "", 
	oldLaufzeit : "",
	erstzulassung : "", 
	validLaufzeiten : new Object(),	
	depositSliderValues : new Array(),
	calculationInAction : false,	
	sliderDown : false,
	vehiclePriceSlider: null,
	depositSlider: null,
	durationSlider: null,
	oldAnzahlungBetrag: "",
	
	activateVehiclePriceSlider : function(){
	var preis = (fscalc.getUrlParameter("vehiclePriceEditableByUserAmount") != "") ? fscalc.getUrlParameter("vehiclePriceEditableByUserAmount").replace(/\./, ",") : 10000;
	fscalc.endpreis.innerHTML = fscalc.validateBetrag(preis);
		fscalc.vehiclePriceSlider = new Control.Slider('sliderVehiclePrice', 'sliderLineVehiclePrice', {
			range: $R(3000, 35000),
			values: [3000, 3500, 4000, 4500, 5000, 5500, 6000, 6500, 7000, 7500, 8000, 8500, 9000, 9500, 10000, 10500, 11000, 11500, 12000, 12500, 13000, 13500, 14000, 14500, 15000, 15500, 16000, 16500, 17000, 17500, 18000, 18500, 19000, 19500, 20000, 20500, 21000, 21500, 22000, 22500, 23000, 23500, 24000, 24500, 25000, 25500, 26000, 26500, 27000, 27500, 28000, 28500, 29000, 29500, 30000, 30500, 31000, 31500, 32000, 32500, 33000, 33500, 34000, 34500, 35000],
			sliderValue: preis,
			onSlide: function(v){
				var depositPercent = document.getElementById("depositPercent").innerHTML;
				fscalc.endpreis.innerHTML = fscalc.validateBetrag(v);
				var result = v * fscalc.depositSliderValues[0][depositPercent];				
				document.getElementById("depositAmount").innerHTML = fscalc.validateBetrag(result);
				var handlePosition = new Number(document.getElementById("sliderVehiclePrice").style.left.split("px")[0]);
				document.getElementById("sliderLineVehiclePrice").style.backgroundPosition = fscalc.calculateSliderBackgroundPosition(handlePosition) + "px 0px";
			},
			onChange: function(v){ 
				var depositPercent = document.getElementById("depositPercent").innerHTML;
				fscalc.endpreis.innerHTML = fscalc.validateBetrag(v);	
				var result = v * fscalc.depositSliderValues[0][depositPercent];		
				document.getElementById("depositAmount").innerHTML = fscalc.validateBetrag(result);
				var handlePosition = new Number(document.getElementById("sliderVehiclePrice").style.left.split("px")[0]);
				document.getElementById("sliderLineVehiclePrice").style.backgroundPosition = fscalc.calculateSliderBackgroundPosition(handlePosition) + "px 0px";
			}		
		});
		var handlePosition = new Number(document.getElementById("sliderVehiclePrice").style.left.split("px")[0]);
		document.getElementById("sliderLineVehiclePrice").style.backgroundPosition = fscalc.calculateSliderBackgroundPosition(handlePosition) + "px 0px";
	},
	
	revertBetragToDezimal : function(element){
		return element.replace(/\./, "").replace(/\,/, ".");
	},
	
	activateDepositSlider : function(sliderValue){
		var inputPercent = 	(fscalc.getUrlParameter("depositAmount") != "") ? (fscalc.getUrlParameter("depositAmount") / fscalc.revertBetragToDezimal(fscalc.endpreis.innerHTML)) : null;
		var selectedValue = (inputPercent != null) ? inputPercent*100 : 20;		
		if(inputPercent != null){
			$('depositAmount').innerHTML = fscalc.validateBetrag(fscalc.getUrlParameter("depositAmount"));
		} else {
			$('depositAmount').innerHTML = fscalc.validateBetrag(fscalc.revertBetragToDezimal(fscalc.endpreis.innerHTML) * fscalc.depositSliderValues[0][selectedValue]);
		} 
		fscalc.depositSlider = new Control.Slider('sliderDepositPercent', 'sliderLineDepositPercent', {
			range: $R(0, 40),
			values: [0, 5, 10, 15, 20, 25, 30, 35, 40],
			sliderValue: selectedValue,
			onSlide: function(v){ 	
				var preis = fscalc.revertBetragToDezimal(fscalc.endpreis.innerHTML);
				document.getElementById("depositPercent").innerHTML = v;
				$('depositAmount').innerHTML = fscalc.validateBetrag(preis * fscalc.depositSliderValues[0][v]);	
				var handlePosition = new Number(document.getElementById("sliderDepositPercent").style.left.split("px")[0]);
				document.getElementById("sliderLineDepositPercent").style.backgroundPosition = fscalc.calculateSliderBackgroundPosition(handlePosition) + "px 0px";
			},
			onChange: function(v){ 		
				var preis = fscalc.revertBetragToDezimal(fscalc.endpreis.innerHTML);
				document.getElementById("depositPercent").innerHTML = v;
				$('depositAmount').innerHTML = fscalc.validateBetrag(preis * fscalc.depositSliderValues[0][v]);	
				var handlePosition = new Number(document.getElementById("sliderDepositPercent").style.left.split("px")[0]);
				document.getElementById("sliderLineDepositPercent").style.backgroundPosition = fscalc.calculateSliderBackgroundPosition(handlePosition) + "px 0px";
			}
		});
		var handlePosition = new Number(document.getElementById("sliderDepositPercent").style.left.split("px")[0]);
		document.getElementById("sliderLineDepositPercent").style.backgroundPosition = fscalc.calculateSliderBackgroundPosition(handlePosition) + "px 0px";
	},
	activateDurationSlider : function(durationValues){			
		var selectedValue = (fscalc.getUrlParameter("selectedDuration") != "") ? fscalc.getUrlParameter("selectedDuration") : 48;	
		fscalc.laufzeit.innerHTML = selectedValue;
		fscalc.durationSlider = new Control.Slider('sliderSelectedDuration', 'sliderLineSelectedDuration', {
			range: $R(12, durationValues[durationValues.length-1]),
			values: durationValues,
			sliderValue: selectedValue,
			onSlide: function(v){ 
			    $('selectedDuration').innerHTML = v;
			    var handlePosition = new Number(document.getElementById("sliderSelectedDuration").style.left.split("px")[0]);
				document.getElementById("sliderLineSelectedDuration").style.backgroundPosition = fscalc.calculateSliderBackgroundPosition(handlePosition) + "px 0px";
			},
			onChange: function(v){ 
				 $('selectedDuration').innerHTML = v;
				 var handlePosition = new Number(document.getElementById("sliderSelectedDuration").style.left.split("px")[0]);
					document.getElementById("sliderLineSelectedDuration").style.backgroundPosition = fscalc.calculateSliderBackgroundPosition(handlePosition) + "px 0px";
			}
		});
		var handlePosition = new Number(document.getElementById("sliderSelectedDuration").style.left.split("px")[0]);
		document.getElementById("sliderLineSelectedDuration").style.backgroundPosition = fscalc.calculateSliderBackgroundPosition(handlePosition) + "px 0px";
	},
	handleOutSliderTeaser : function(event){		
		var element = Event.element(event).up("#sliderTeaser") || Event.element(event);
		if(element.id == "sliderTeaser"){
			//do nothing, this was false alarm
		}else{			
			fscalc.durationSlider.finishDrag(null, true);
			fscalc.depositSlider.finishDrag(null, true);
			fscalc.vehiclePriceSlider.finishDrag(null, true);
			fscalc.handleSliderUp();
		}
	},	
	handleSliderDown: function(){
		fscalc.sliderDown = true;
	},
	handleSliderUp: function(){
		if(fscalc.sliderDown == true){
			fscalc.sliderDown = false;
			fscalc.execute();
		}
	},
	
	initDealer : function(){
		
		fscalc.depositSliderValues[0] = new Object();		
		fscalc.depositSliderValues[0]["0"] = "0.0";
		fscalc.depositSliderValues[0]["5"] = "0.05";		
		fscalc.depositSliderValues[0]["10"] = "0.1";
		fscalc.depositSliderValues[0]["15"] = "0.15";
		fscalc.depositSliderValues[0]["20"] = "0.2";
		fscalc.depositSliderValues[0]["25"] = "0.25";
		fscalc.depositSliderValues[0]["30"] = "0.3";
		fscalc.depositSliderValues[0]["35"] = "0.35";
		fscalc.depositSliderValues[0]["40"] = "0.4";
		
		//define fields
		fscalc.endpreis = document.getElementById("vehiclePriceEditableByUserAmountStr"); 
		fscalc.anzahlung = document.getElementById("depositPercent"); 
		fscalc.laufzeit = document.getElementById("selectedDuration");
		
				
		this.addEvent(document.getElementById("formContent"), "mouseup", fscalc.handleSliderUp, false);
		this.addEvent(document.getElementById("formContent"), "mouseover", fscalc.handleOutSliderTeaser, false);
		this.addEvent(document.getElementById("sliderTeaser"), "mouseout", fscalc.handleOutSliderTeaser, false);
		
		this.addEvent(document.getElementById("sliderVehiclePrice"), "mouseup", fscalc.handleSliderUp, false);
		this.addEvent(document.getElementById("sliderDepositPercent"), "mouseup", fscalc.handleSliderUp, false);
		this.addEvent(document.getElementById("sliderSelectedDuration"), "mouseup", fscalc.handleSliderUp, false);
		
		this.addEvent(document.getElementById("sliderVehiclePrice"), "mousedown", fscalc.handleSliderDown, false);
		this.addEvent(document.getElementById("sliderDepositPercent"), "mousedown", fscalc.handleSliderDown, false);
		this.addEvent(document.getElementById("sliderSelectedDuration"), "mousedown", fscalc.handleSliderDown, false);
		this.addEvent(document.getElementById("sliderLineVehiclePrice"), "mousedown", fscalc.handleSliderDown, false);
		this.addEvent(document.getElementById("sliderLineDepositPercent"), "mousedown", fscalc.handleSliderDown, false);
		this.addEvent(document.getElementById("sliderLineSelectedDuration"), "mousedown", fscalc.handleSliderDown, false);
		
		
		//set car image and car type if available
		var bildUrl = unescape(fscalc.getUrlParameter("BILDURL")); 
		//if original html needs to be changed
		if (bildUrl != null && bildUrl != ""){
			if(document.getElementById("hasBrandOrImage")){
				document.getElementById("hasBrandOrImage").style.display='block'; 
				document.getElementById("image").src = bildUrl;
			}
			if(document.getElementById("hasNoBrandOrImage")){
				document.getElementById("hasNoBrandOrImage").style.display='none'; 
			}
		}
		
		//set defaults
		fscalc.oldEndpreis = "10.000";
		
		fscalc.initValidProductDurations();
		fscalc.validatePriceInput(); 
		
		//activate Slider
		this.activateVehiclePriceSlider();		
		this.activateDepositSlider();
		this.activateDurationSlider(fscalc.validLaufzeiten.basic);

		fscalc.execute();	
	},
	
	initValidProductDurations : function () {
		fscalc.validLaufzeiten.basic = new Array();
		fscalc.validLaufzeiten.basic.push(12,18,24,30,36,42,48,54,60,66,72,78,84,90,96,102,108,114,120);			
	},
	
	validatePriceInput : function (event) {
		var price = fscalc.endpreis.innerHTML ;
		
		var formattedPrice = price.match(/[0-9\,]*/g).join("");
		
			var initalLength = (formattedPrice.indexOf(",") == -1)?formattedPrice.length:formattedPrice.indexOf(","); 
			var lastChar = initalLength; 
			
			while (lastChar > 3){
				lastChar -= 3; 
				formattedPrice = fscalc.addComma(formattedPrice,lastChar); 
			}
		
			fscalc.endpreis.innerHTML = formattedPrice;
	}, 
	rundeBetragKaufm : function (element) {
		  var k = (Math.round(element * 100) / 100).toString();
		  k += (k.indexOf('.') == -1)? '.00' : '00';
		  return k.substring(0, k.indexOf('.') + 3);
	},
	validateBetrag : function (element) {	
		var formattedValue = fscalc.rundeBetragKaufm(element.toString().replace(/\,/, ".")).replace(/\./, ",");		
		formattedValue = formattedValue.match(/[0-9\,]*/g).join("");
		
			var initalLength = (formattedValue.indexOf(",") == -1)?formattedValue.length:formattedValue.indexOf(","); 
			var lastChar = initalLength; 
			
			while (lastChar > 3){
				lastChar -= 3; 
				formattedValue = fscalc.addComma(formattedValue,lastChar); 
			}
			
		return formattedValue;
	}, 
	
	addComma : function (str, position){
		return str.substr(0,position) + "." + str.substr(position,str.length); 
	},
	calculateSliderBackgroundPosition : function (handlePosition){
		
		return -337 + handlePosition;
		
	},
	getUrlParameter : function ( name ){
		name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
		
		var regexS = "[\\?&]"+name+"=([^&#]*)";
		var regex = new RegExp( regexS );
		var results = regex.exec( window.location.href );
		
		if( results == null )
			return "";
		else
			return results[1];
	},
	
	backupParameters : function (event) {	
		fscalc.oldEndpreis = fscalc.revertBetragToDezimal(fscalc.endpreis.innerHTML);		
		fscalc.oldAnzahlung = fscalc.anzahlung.innerHTML;
		fscalc.oldAnzahlungBetrag = $('depositAmount').innerHTML;
		fscalc.oldLaufzeit = fscalc.laufzeit.innerHTML;				
	},
	
	recoverParameters : function (event) {			
		fscalc.endpreis.innerHTML = fscalc.oldEndpreis;		
		fscalc.vehiclePriceSlider.setValue(fscalc.oldEndpreis);		
		try{
			fscalc.anzahlung.innerHTML = fscalc.oldAnzahlung;
			$('depositAmount').innerHTML = fscalc.oldAnzahlungBetrag;
			fscalc.depositSlider.setValue(fscalc.oldAnzahlung); 
		} catch (e){}
		try{									
			fscalc.laufzeit.innerHTML = fscalc.oldLaufzeit;				
			fscalc.durationSlider.setValue(fscalc.oldLaufzeit);
		}catch(e){}
	}, 
	
	execute : function (event){		
		var parameters = ""; 
		
		var paramByUserAmountStr = fscalc.endpreis.innerHTML;
		var paramDepositAmount = $('depositAmount').innerHTML;
		var paramSelectedDuration = fscalc.laufzeit.innerHTML;
		
		parameters += "&prices=" + paramByUserAmountStr;
		parameters += "&depositAmountStr=" + paramDepositAmount;
		parameters += "&selectedDuration=" + paramSelectedDuration;
		
		
		if (fscalc.getUrlParameter("dealerID") != "")	
			parameters += "&dealerID=" + fscalc.getUrlParameter("dealerID");
		if (fscalc.getUrlParameter("interestMod") != "")	
			parameters += "&interestMod=" + fscalc.getUrlParameter("interestMod");
		if (fscalc.getUrlParameter("selectedVehicleUsage") != "")	
			parameters += "&selectedVehicleUsage=" + fscalc.getUrlParameter("selectedVehicleUsage");
		if (fscalc.getUrlParameter("registrationDateStr") != "")	
			parameters += "&registrationDateStr=" + fscalc.getUrlParameter("registrationDateStr");
		if (fscalc.getUrlParameter("previousMileageStr") != "")	
			parameters += "&previousMileageStr=" + fscalc.getUrlParameter("previousMileageStr");
		
		
		JSCom.Request.send("fscalc", fscalc.nothing() ,fscalc.nothing(),{
			path : fscalc.url + "?" + parameters
		});
		
		return; 
	},
	
	nothing : function(){
	},
	addEvent : function (elem, evType, func, useCapture) {
		if (elem.addEventListener) {
			elem.addEventListener(evType, func, useCapture);
			return true;
		}
		else if (elem.attachEvent){
			var r = elem.attachEvent("on" + evType, func);
			return r;
		}
		else {
			var onEvt = "on" + evType;
			var elOldEvFuncs = elem;
			if ((typeof elem[onEvt]) == 'function') {
				elem[onEvt] = function() {
					elOldEvFuncs();
					func();
				}
			}
			else {
				elem[onEvt] = func;
			}
		}
	}
	
}

var receiveCalculations = function(result){
	
	//there is always only one calculation in this use case!
	var calculation = result.calculations[0];
	
	if (calculation.calcStatus.status == "ERROR"){ //error occured	
		fscalc.recoverParameters(); 
		fscalc.execute(); 
		return; 
	}
	
	document.getElementById("defaultCurrency").innerHTML = calculation.monthlyRateStr;
	document.getElementById("selectedCustomerInterestStr").innerHTML = calculation.selectedCustomerInterestStr; 
	
	//set PAngV output values
	document.getElementById("nominalInterest").innerHTML = calculation.nominalInterestStr;
	document.getElementById("fee").innerHTML = calculation.feeStr;
	document.getElementById("totalNetto").innerHTML = calculation.totalAmountNettoStr;
	document.getElementById("total").innerHTML = calculation.totalAmountStr;
	
	fscalc.endpreis.innerHTML = calculation.vehiclePriceEditableByUserAmountStr;
	$('depositAmount').innerHTML = calculation.depositAmountStr;
	fscalc.laufzeit.innerHTML = calculation.selectedDuration;
	
	fscalc.backupParameters();
}


var mmDefault = function(resultList){
	

}

var openLayer = function (){
	document.getElementById('infoLayer').style.display = 'block';
	return false;
};
var closeLayer = function (){
	document.getElementById('infoLayer').style.display = 'none';
	return false;
};
