
/**************Price slider **************/
// new 2 slider js
// Creates dual slider for min and max price
var PriceSlider = Class.create();
PriceSlider.prototype = {
	// constructor
	initialize: function(val_min, val_max, onChange, onSlide) {
		this.select_min = $('price_min');
		this.select_max = $('price_max');
		
		this.min_price = val_min;
		this.max_price = val_max;
		
		this.allowEvents = false;
		this.min = 0;
		this.max = 100;
		this.factor = 1;
		this.precision = 0;
		
		this.caption = null; // Caption for dual slider
		this.output = null; // Div to output current slider value
		this.track = null; // backlground of slider
		this.handle_min = null; // Handle for slider Min
		this.handle_max = null; // Handle for slider Max
		this.slider = null; // Instance of Control.Slider
		
		this.onChange = onChange;
		this.onSlide = onSlide;
			
		this.createSliderMarkup();
		
		val_min = this.price_to_value(val_min, 0);
		val_max = this.price_to_value(val_max, 1);
		this.createSlider(val_min, val_max);
	},
	
	// creates the div necesary to display slider
	createSliderMarkup: function() {
		var div_track = Builder.node('div',{className:'slider_track price_track'}, '');
		this.track = div_track;
		
		var div_handle = Builder.node('div',{className:'slider_handle price_min_handle'}, '');
		div_track.appendChild(div_handle);
		this.handle_min = div_handle;
		
		div_handle = Builder.node('div',{className:'slider_handle price_max_handle'}, '');
		div_track.appendChild(div_handle);
		this.handle_max = div_handle;
    
	    var div_slider_value = Builder.node('div', {className:'slider_value price_value'}, ' ');
	    this.output = div_slider_value;
	    
	    var div_caption = Builder.node('div', {className:'slider_caption price_caption radius_unit_text_last'}, '0 \t\t 100');
	    this.caption = div_caption;
	    
	    // Insert stuff
	    var wrapper = $('price_select');
	    wrapper.parentNode.insertBefore(div_slider_value, wrapper.nextSibling);
	    wrapper.parentNode.insertBefore(div_track, wrapper.nextSibling);
	    
	    Element.hide(wrapper);
	},
	
	// Creates slider class;
	createSlider: function(val_min, val_max) {
	    // required, so only option elements remain!
		Element.cleanWhitespace(this.select_min);
		Element.cleanWhitespace(this.select_max);
			    
	    var value = 1;

		if (this.slider) {
			this.slider.dispose();
		}
		  	    
	    // slider is 1 based, 0 isn't accepted for some reasons...	  
	    var handles = [this.handle_min, this.handle_max];
	    var values = [this.min_price, this.max_price];
		this.slider = new Control.Slider(handles, this.track, {
	    	range:$R(this.min_price, this.max_price, true),
	    	step:1,
	    	restricted:true,
	    	sliderValue: values,
	    	onChange:this.onSliderChanged.bind(this),
	    	onSlide:this.onSliderSlides.bind(this)
	    });
	    this.displayValues();
	    this.onSliderChanged();	
	},
	
	// user finished moving slider handle: Update underlying select boxes
	onSliderChanged: function() {
		var priceMin = this.getPrice(0);
		this.setPriceOnSelect(this.select_min, priceMin, this.getDisplayPrice(priceMin, 0));
		var priceMax = this.getPrice(1);
		this.setPriceOnSelect(this.select_max, priceMax, this.getDisplayPrice(priceMax, 1));
		if (priceMin != 'none' || priceMax != 'none' )
		{	
			if(priceMin == 'none') priceMin = this.min_price;
			if(priceMax == 'none') priceMax = this.max_price;
			var price_val = priceMin +"__"+priceMax;
			price = price_val;
			getdata();
			doSlideSearch(price_val,'0');
		}
		// Inform client about change
		if (this.allowEvents && this.onChange) {
			this.onChange(priceMin, priceMax);
		}
	},

	// Update select accordingly
	setPriceOnSelect: function(select, key, value) {
		var opt = select.getElementsByTagName('option')[0];
		if (opt) {
			opt.value = key;
			opt.selected = 'selected';
			Element.update(opt, value);
		}
	},

	// User moves slider handle: update display
	onSliderSlides: function(value) {
		this.displayValues();
		// Inform client about change
		if (this.allowEvents && this.onSlide) {
			this.onSlide(this.getPrice(0), this.getPrice(1));
		}
	},
	
	// Shows current value as text
	displayValues: function() {
		var min = this.getDisplayPrice(this.getPrice(0), 0);
		var max = this.getDisplayPrice(this.getPrice(1), 1);
		var disp = min + " - " + max;
		Element.update(this.output, disp);
	},
	
	// Gets Price displayed by slider [index], where 0 = min, 1 = max
	getPrice: function(index) {
		var valSlider = this.slider.values[index];
		if (index == 0 && valSlider == 0) {
			return 'none';
		}
		else if (index == 1 && valSlider == this.slider.maximum) {
			return 'none';
		}
		return valSlider.toFixed(this.precision);
		//return (valSlider * valSlider / 10).toFixed(this.precision);
	},
	
	// Turns price into a slider value. [index]: 0 = min, 1 = max
	price_to_value: function(price, index) {
		var val = Number(price);
		if (isNaN(val)) {
			if (index == 0) {
				return val_min;
			}
			else {
				return val_max;
			}
		}
		
		return Math.sqrt(10 * val);
	},
	
	// Returns the price to display. [val]: Price. [index]: 0 = min, 1 = max
	getDisplayPrice: function(val, index) {
		if (val == 'none') {
			return (index == 0) ? '$ '+this.min_price : '$ '+this.max_price;
		}
		else {
			return '$ '+val;
		}
	}
	
};


/***********************************************************************/

