var TarkkahakuSliders = {
	
	priceIntervals : [0, 50000, 100000, 125000, 150000, 200000, 250000, 350000, 500000, 1000000, 5000000],
	scaleIntervals : [10,20,50,100,200,500,1000,2000,5000,10000,20000,50000,100000,200000,500000,1000000,2000000,5000000],
	
	initialize : function() {
		this.initializePaSlider();
		this.initializeMyyntihintaSlider();
		this.initializeRentSlider();
		this.preventSubmitFormOnRangeInput();
	},
	
	initializePaSlider : function() {
		var this_ = this;
		$("#paSlider").slider({
			range: true,
			min: 0,
			max: 300,
			values: [0, 300],
			slide: function(event, ui) {
				var minValue = ui.values[0];
				var maxValue = ui.values[1];
				
				if (maxValue == 300) {
					maxValue = '300+';
				}
				
				$('.rangeInput.pintaala input').eq(0).val(minValue);
				$('.rangeInput.pintaala input').eq(1).val(maxValue);
				
				var minElement = $('.ui-slider-handle', this).eq(0);
				var maxElement = $('.ui-slider-handle', this).eq(1);
			}
		});
		
		$('.rangeInput.pintaala input').eq(1).bind('click', function(e) {
			if ($(this).val() == '300+') {
				$(this).val('300');
			}
		});
		
		$('.rangeInput.pintaala input').bind('blur', function(e) {
			var alaLowInput = $('.rangeInput.pintaala input').eq(0).val();
			var alaHighInput = $('.rangeInput.pintaala input').eq(1).val();
			
			var alaLow = this_.cleanInput(alaLowInput);
			var alaHigh = this_.cleanInput(alaHighInput);
			
			if (alaLow > alaHigh) {
				alaHigh = alaLow;
			}
			
			$('#paSlider').slider('values', 0, alaLow);
			$('#paSlider').slider('values', 1, alaHigh);
			
			if (alaHigh == 300) {
				alaHigh = '300+';
			} 
			
			$('.rangeInput.pintaala input').eq(0).val(alaLow);
			$('.rangeInput.pintaala input').eq(1).val(alaHigh);
		});
	},
	
	initializeRentSlider : function() {
		var this_ = this;
		$("#rentSlider").slider({
			range: true,
			min: 0,
			max: 1000,
			values: [0, 1000],
			slide: function(event, ui) {
				var minValue = ui.values[0];
				var maxValue = ui.values[1];
				
				if (maxValue == 1000) {
					maxValue = '1000+';
				}
				
				$('.rangeInput.rent input').eq(0).val(minValue);
				$('.rangeInput.rent input').eq(1).val(maxValue);
				
				var minElement = $('.ui-slider-handle', this).eq(0);
				var maxElement = $('.ui-slider-handle', this).eq(1);
			}
		});
		
		$('.rangeInput.rent input').eq(1).bind('click', function(e) {
			if ($(this).val() == '1000+') {
				$(this).val('1000');
			}
		});
		
		$('.rangeInput.rent input').bind('blur', function(e) {
			var rentLowInput = $('.rangeInput.rent input').eq(0).val();
			var rentHighInput = $('.rangeInput.rent input').eq(1).val();
			
			var rentLow = this_.cleanInput(rentLowInput);
			var rentHigh = this_.cleanInput(rentHighInput);
			
			if (rentLow > rentHigh) {
				rentHigh = rentLow;
			}
			
			$('#rentSlider').slider('values', 0, rentLow);
			$('#rentSlider').slider('values', 1, rentHigh);
			
			if (rentHigh == 1000) {
				rentHigh = '1000+';
			} 
			
			$('.rangeInput.rent input').eq(0).val(rentLow);
			$('.rangeInput.rent input').eq(1).val(rentHigh);
		});
	},
		
	cleanInput : function(value) {
		
		value = value.replace(',', '.', 'g');
		
		if (value > 1) {
			value = Math.round(value).toString();
		}
		
		value = parseInt(value.replace(/[^0-9]/, ''));
		if (isNaN(value)) {
			value = '';
		}
		
		return value;
	},
	
	initializeMyyntihintaSlider : function() {
		var this_ = this;
		$("#myyntihintaSlider").slider({
			range: true,
			min: 0,
			max: 1000,
			values: [0, 1000],
			slide: function(event, ui) {
				var containerWidth = $(this).css('width').replace(/(px|\%)/, '');
				var pixelsInInterval = Math.round(containerWidth / this_.scaleIntervals.length);
				
				function countValue(inputValue) {
					var value = null;
					var valuePosExact = (inputValue / 1000) * (this_.priceIntervals.length - 1);
					var valuePos = Math.floor(valuePosExact);
								
					if (valuePos < this_.priceIntervals.length - 1) {
						var fraction = valuePosExact - valuePos;
						var nextIntervalDifference = this_.priceIntervals[valuePos + 1] - this_.priceIntervals[valuePos];
						var i = 0;
						while(nextIntervalDifference / this_.scaleIntervals[i] > pixelsInInterval || i > 100) {
							i++;
						}
						value = Math.round((this_.priceIntervals[valuePos] + (fraction * nextIntervalDifference)) / this_.scaleIntervals[i]) * this_.scaleIntervals[i];
					} else {
						value = this_.priceIntervals[valuePos];
					}
					return value;			
				}
				
				var minValue = countValue(ui.values[0]);
				var maxValue = countValue(ui.values[1]);
				
				if (maxValue == 5000000) {
					maxValue = '5000000+';
				} 
		
				$('.rangeInput.myyntihinta input').eq(0).val(minValue);
				$('.rangeInput.myyntihinta input').eq(1).val(maxValue);
			}
		});
		
		$('.rangeInput.myyntihinta input').eq(1).bind('click', function(e) {
			if ($(this).val() == '5000000+') {
				$(this).val('5000000');
			}
		});
		
		$('.rangeInput.myyntihinta input').bind('blur', function(e) {
			var hintaLowInput = $('.rangeInput.myyntihinta input').eq(0).val();
			var hintaHighInput = $('.rangeInput.myyntihinta input').eq(1).val();
			
			var hintaLow = this_.cleanInput(hintaLowInput);
			var hintaHigh = this_.cleanInput(hintaHighInput);
			
			if (hintaLow > hintaHigh) {
				hintaHigh = hintaLow;
			}
			
			pricePointLow = this_.getPricePoint(hintaLow);
			pricePointHigh = this_.getPricePoint(hintaHigh);
			
			$('#myyntihintaSlider').slider('values', 0, pricePointLow);
			$('#myyntihintaSlider').slider('values', 1, pricePointHigh);
			
			if (hintaHigh == 5000000) {
				hintaHigh = '5000000+';
			} 
			
			$('.rangeInput.myyntihinta input').eq(0).val(hintaLow);
			$('.rangeInput.myyntihinta input').eq(1).val(hintaHigh);
		});
	},
	
	preventSubmitFormOnRangeInput : function() {
		$("form").bind("keypress", function(e) {
        	if (e.keyCode == 13) {
        		$('.rangeInput input').trigger('blur');
            	return false;
        	}
    	});
	},
	
	getPricePoint : function(value) {
		if (value >= 5000000) {
			return this.convertPriceIntervalPoint(this.priceIntervals.length);
		}
		
		var i = 0;
		var priceInterval = 0;
		while(this.priceIntervals[i] <= value) {
			priceInterval = i;
			i++;
		}
		
		var intervalDifference = this.priceIntervals[priceInterval + 1] - this.priceIntervals[priceInterval];
		var amountDifference = (value - this.priceIntervals[priceInterval]);
			
		if (amountDifference == 0) {
			return this.convertPriceIntervalPoint(priceInterval);
		}
		
		var positionInsideInterval = (value - this.priceIntervals[priceInterval]) / intervalDifference;
		
		return this.convertPriceIntervalPoint(priceInterval + positionInsideInterval);
	},
	
	convertPriceIntervalPoint : function(point) {
		return Math.round(point / (this.priceIntervals.length - 1) * 1000); 
	}
};