var BySlider = new Class({
	Implements: Options,
	
	options: {
		minValue: 0,
		maxValue: 100,
		knobOffset: 0,
		set: 'value'
	},
	
	changeBound: function(min, max)
	{
		this.options.minValue = min;
		this.options.maxValue = max;
		this.steps = max - min;
		this.draggedLeft();
		this.draggedRight();
	},
	
	updateSliderLeft: function()
	{
		var value_left = this.value_left.get(this.options.set).toInt().limit(this.options.minValue, this.value_right.get(this.options.set).toInt());
		var Q = 8.85;
		var S = ((value_left.toInt() - this.options.minValue) / (this.options.maxValue - this.options.minValue));
		var knob_left_width = this.container_inside_width * (1 + Math.log(2/(2 - S) -1) / (2*Q)) + this.knob_width;
		
		this.slider_left.setStyle('width', knob_left_width.toInt());
		this.completed(this.slider_left);
	},
	
	updateSliderRight: function()
	{
		var value_right = this.value_right.get(this.options.set).toInt().limit(this.value_left.get(this.options.set).toInt(), this.options.maxValue);
		
		var Q = 8.85;
		var S = ((this.options.maxValue - value_right.toInt()) / (this.options.maxValue - this.options.minValue));
		
		S = 1 - S;
		
		S = (1 + Math.log(2/(2 - S) -1) / (2*Q));
		
		S = 1 - S;
		
		var knob_right_width = this.container_inside_width * S + this.knob_width;
		
	
		this.slider_right.setStyle('width', knob_right_width.toInt());
		this.completed(this.slider_right);
	},
	
	correctValues: function()
	{
		var value_left = this.value_left.get(this.options.set).toInt().limit(this.options.minValue, this.value_right.get(this.options.set).toInt());
		this.value_left.set(this.options.set, value_left);
		var value_right = this.value_right.get(this.options.set).toInt().limit(this.value_left.get(this.options.set).toInt(), this.options.maxValue);
		this.value_right.set(this.options.set, value_right);
	},
	
	initialize: function(slider_id, options){

		this.setOptions(options);
		
		var slider_id = $pick(slider_id, 'byslider');
		
		this.container = $(slider_id);
		this.container_width = this.container.getStyle('width').toInt();

		this.slider_left = this.container.getFirst('.left');
		this.knob_left = this.slider_left.getFirst('.knob').setStyle('float', 'none');
		this.knob_width = this.knob_left.getStyle('width').toInt() - this.options.knobOffset;

		this.slider_right = this.container.getFirst('.right');
		this.knob_right = this.slider_right.getFirst('.knob');
		
		this.slider_left.setStyle('width', this.knob_width);
		this.slider_right.setStyle('width', this.knob_width);
		
		this.value_left = $(slider_id + '_min');
		this.value_right = $(slider_id + '_max');
		
		var start_value_left = this.value_left.get(this.options.set) || this.options.minValue;
		var start_value_right = this.value_right.get(this.options.set) || this.options.maxValue;
		
		this.value_left.set(this.options.set, start_value_left)
			.addEvent('keyup', function(){
				this.updateSliderLeft();
			}.bind(this))
			.addEvent('change', function(){
				this.correctValues();
			}.bind(this));

		this.value_right.set(this.options.set, start_value_right)
			.addEvent('keyup', function(){
				this.updateSliderRight();
			}.bind(this))
			.addEvent('change', function(){
				this.correctValues();
			}.bind(this));

		var knob_modifiers = { x: 'width', y: false };
		var knob_limits = {
			x: [this.knob_width, (this.container_width - this.knob_width)],
			y: false
		};
		this.steps = this.options.maxValue - this.options.minValue;
		
		this.container_inside_width = this.container_width - (2 * this.knob_width);

		this.drag_left = this.slider_left.makeResizable({
			handle: this.knob_left,
			modifiers: knob_modifiers,
			snap: 0,
			limit: knob_limits,
			onComplete: function(el){
				this.completed(el);
			}.bind(this),
			onDrag: function(knob){
				var Q = 8.85;
				var K = ((knob.getWidth() - this.knob_width) / this.container_inside_width);
				var L = Math.exp(-Q + (K*Q));
				var M = Math.exp(Q - (K*Q));
				var R =  1 + (L-M)/(L+M);
				
				var value_left = this.options.minValue + R * this.steps;
				this.value_left.set(this.options.set, value_left.toInt());
			}.bind(this),
			onStart: function(){
				$clear(this.timer);
			}.bind(this)
		});
		
		this.drag_right = this.slider_right.makeResizable({
			handle: this.knob_right,
			modifiers: knob_modifiers,
			snap: 0,
			limit: knob_limits,
			invert: true,
			onComplete: function(el){
				this.completed(el);
			}.bind(this),
			onDrag: function(knob){
				var Q = 8.85;
				var K = ((knob.getWidth() - this.knob_width) / this.container_inside_width);
				var L = Math.exp((K*Q));
				var M = Math.exp(- (K*Q));
				var R =  (L-M)/(L+M);
				
				var value_right = this.options.maxValue - R * this.steps;
				this.value_right.set(this.options.set, value_right.toInt());
			}.bind(this),
			onStart: function(){
				$clear(this.timer);
			}.bind(this)
		});
		
		this.updateSliderLeft();
		this.updateSliderRight();
	},
	
	completed: function(slider){
		var xLimit = this.container_width - slider.getWidth();
		
		if(slider == this.slider_left)
			this.drag_right.options.limit.x[1] = xLimit;
		else
			this.drag_left.options.limit.x[1] = xLimit;

		this.timer = this.refresh.delay(2000);
	},
	
	draggedLeft: function(knob){
		var value_left = (((this.slider_left.getWidth() - this.knob_width) / this.container_inside_width) * this.steps) + this.options.minValue;
		this.value_left.set(this.options.set, value_left.toInt());
	},
	
	draggedRight: function(knob){
		var value_right = this.options.maxValue - (((this.slider_right.getWidth() - this.knob_width) / this.container_inside_width) * this.steps);
		this.value_right.set(this.options.set, value_right.toInt());
	},
	
	refresh: function(){
		
	}
});
