
/* Double Knob Slider */

var DoubleSlider = new Class({

	Implements: [Options, Events],

	options: {
		onChange: Class.empty,
		onComplete: Class.empty,
		onTick: function(pos){
			this.moveKnob.setStyle(this.p, pos);
		},

		start: 0,
		end: 100,

		offset: 0,

		knobheight: 29,
		knobwidth: 2,

		mode: 'horizontal',

		clip_w: 0,
		clip_l: 0,

		isinit: true,
		snap: false,
		range: false,
		numsteps: null

	},

	clipTop: 0,
	clipHeight: 20,

  initialize: function(upper, options, bigI) {
  	var bgg, mod, offset, lim;

		this.setOptions(options);
		this.bigI = bigI;

		this.upper = $(upper);
		this.element = this.upper.getElement('div.crsrch_slider_gutter');

		this.elementInputMin = this.upper.getElement('input.crsrch_slider_input_min');
		this.elementInputMax = this.upper.getElement('input.crsrch_slider_input_max');

		this.elementInfoMin = this.upper.getElement('div.crsrch_slider_info_min');
		this.elementInfoMax = this.upper.getElement('div.crsrch_slider_info_max');

		this.knob = this.upper.getElement('div.crsrch_slider_knob_min').addEvents({'mouseenter':function(){this.addClass('hoverKnob');},'mouseleave':function(){this.removeClass('hoverKnob');}});
		this.maxknob = this.upper.getElement('div.crsrch_slider_knob_max').addEvents({'mouseenter':function(){this.addClass('hoverKnob');},'mouseleave':function(){this.removeClass('hoverKnob');}});

		this.bkg = this.upper.getElement('div.crsrch_slider_bg');
		bgg = this.bkg.getStyle("backgroundImage");
		this.bkg.dispose();
		bgg = bgg.replace("url","").replace(/[\(|\)|"|']/g,"");
		this.bkg = new Element("img",{'src': bgg, 'class': 'crsrch_slider_bg'}).inject(this.knob,'before');

		this.previousChange = this.previousEnd = this.step = -1;

		if(!this.options.steps){
			this.options.steps = this.options.end - this.options.start;
		}

		switch(this.options.mode){
			case 'horizontal':
				this.z = 'x';
				this.p = 'left';
				mod = {'x': 'left', 'y': false};
				offset = 'offsetWidth';
				break;
			case 'vertical':
				this.z = 'y';
				this.p = 'top';
				mod = {'x': false, 'y': 'top'};
				offset = 'offsetHeight';
		}

		this.min = $chk(this.options.range[0]) ? this.options.range[0] : 0;
		this.max = this.element[offset] - this.knob[offset] + (this.options.offset * 2);

		this.half = this.knob[offset]/2;
		this.full = this.max;
		this.range = this.max - this.min;

		this.getPos = this.element['get' + this.p.capitalize()].bind(this.element);

		this.knob.setStyle('position', 'relative').setStyle(this.p, - this.options.offset);

		this.steps = this.options.steps || this.full;
		this.stepSize = Math.abs(this.range) / this.steps;
		this.stepWidth = this.stepSize * this.full / Math.abs(this.range) ;

		if(this.maxknob) {
			this.maxPreviousChange = -1;
			this.maxPreviousEnd = -1;
			this.maxstep = this.options.end;
			this.maxknob.setStyle('position', 'relative').setStyle(this.p, + this.max - this.options.offset).setStyle('bottom', this.options.knobheight);
		}

		lim = {};
		lim[this.z] = [- this.options.offset, this.max - this.options.offset];

		this.drag = new Drag(this.knob, {
			limit: lim,
			modifiers: mod,
			snap: 0,
			onStart: function(){
					this.draggedKnob();
			}.bind(this),
			onDrag: function(){
					this.draggedKnob();
			}.bind(this),
			onComplete: function(){
					this.draggedKnob();
					this.end();
			}.bind(this)
		});

		if(this.maxknob) {
			this.maxdrag = new Drag(this.maxknob, {
				limit: lim,
				modifiers: mod,
				snap: 0,
				onStart: function(){
					this.draggedKnob(1);
				}.bind(this),
				onDrag: function(){
					this.draggedKnob(1);
				}.bind(this),
				onComplete: function(){
					this.draggedKnob(1);
					this.end();
				}.bind(this)
			});
		}

		if (this.options.snap) {
			this.drag.options.grid = Math.ceil((this.full) / this.options.numsteps);
			this.drag.options.limit[this.z][1] = this.full;
			if(this.maxknob) {
				this.maxdrag.options.grid = Math.ceil((this.full) / this.options.numsteps);
				this.maxdrag.options.limit[this.z][1] = this.full;
			}
		}

		if (this.options.initialize) {
			this.options.initialize.call(this);
		}

	},

	isMin: function(t) {
		if (t) {
			this.upper.removeClass('hasMin');
			this.elementInputMin.setProperty('disabled','disabled');
		}
		else {
			this.upper.addClass('hasMin');
			this.elementInputMin.erase('disabled');
		}
		return this;
	},

	isMax: function(t) {
		if (t) {
			this.upper.removeClass('hasMax');
			this.elementInputMax.setProperty('disabled','disabled');
		}
		else {
			this.upper.addClass('hasMax');
			this.elementInputMax.erase('disabled');
		}
		return this;
	},

	checkMinMax: function(){
		if (this.step == this.options.start && this.maxstep == this.options.end) {
			this.setClipTop(0).upper.removeClass('worked');
		}
		else {
			this.setClipTop(37).upper.addClass('worked');
		}
	},

	setClipTop: function(v){
		var w;

		this.clipTop = v;
		w = Math.abs(parseInt(this.knob.getStyle('left'),10) - parseInt(this.maxknob.getStyle('left'),10));
		this.bkg.style.clip = "rect(" + this.clipTop + "px " + parseInt(this.clip_l + w,10) + "px " + (this.clipTop + this.clipHeight) + "px " + this.clip_l + "px)";
		return this;
	},

	setMin: function(stepMin){
		this.step = stepMin.limit(this.options.start, this.options.end);
		this.checkStep();
		this.end();
		this.moveKnob = this.knob;
		this.bkg.style.clip = "rect(" + this.clipTop + "px " + (parseInt(this.toPosition(this.step),10) + this.options.knobwidth) + "px " + (this.clipHeight + this.clipTop) + "px 0px)";
		this.fireEvent('onTick', this.toPosition(this.step));
		return this;
	},

	setMax: function(stepMax){
		var w, r, mi, mx, lim = {};

		this.maxstep = stepMax.limit(this.options.start, this.options.end);
		this.checkStep(1);
		this.end();
		this.moveKnob = this.maxknob;
		w = Math.abs(this.toPosition(this.step) - this.toPosition(this.maxstep)) + this.options.knobwidth;
		r = parseInt(this.clip_l + w,10);
		this.bkg.style.clip = "rect(" + this.clipTop + "px "+  r + "px " + (this.clipTop + this.clipHeight) + "px "+ this.clip_l + "px)";
		this.fireEvent('onTick', this.toPosition(this.maxstep));

		// For Init Only
		if(this.options.isinit){
			mi = - this.options.offset;
			mx = parseInt(this.maxknob.getStyle('left'),10) - this.options.offset - this.options.knobwidth;
			lim[this.z] = [mi, mx];
			this.drag.options.limit = lim;
			this.options.isinit = false;
		}
		return this;
	},

	draggedKnob: function(isMax){
		if(isMax == 1) {
			this.maxstep = this.toStep(this.maxdrag.value.now[this.z]);
			this.checkStep(1);
		}else {
			this.step = this.toStep(this.drag.value.now[this.z]);
			this.checkStep();
		}
	},

	checkStep: function(isMax){
		var lim = {}, mi, mx, limm = {}, w;

		if(isMax == 1) {
			if (this.maxPreviousChange != this.maxstep) {
				this.maxPreviousChange = this.maxstep;
			}
		}
		else {
			if (this.previousChange != this.step) {
				this.previousChange = this.step;
			}
		}

		mi = - this.options.offset;
		mx = parseInt(this.maxknob.getStyle('left'),10) - this.options.offset - (this.options.knobwidth);

		lim[this.z] = [mi, mx];
		this.drag.options.limit = lim;

		mi = parseInt(this.knob.getStyle('left'),10) - this.options.offset + this.options.knobwidth;

		mx = this.max - this.options.offset + 0.1;
		limm[this.z] = [mi, mx];
		this.maxdrag.options.limit = limm;

		if(this.step < this.maxstep) {
			this.fireEvent('onChange', {
				minpos: this.step, maxpos: this.maxstep,
				step: this.step, maxstep: this.maxstep,
				inputMin: this.elementInputMin, inputMax: this.elementInputMax,
				infoMin: this.elementInfoMin, infoMax: this.elementInfoMax,
				bigI: this.bigI
			},this);
		}
		else {
			this.fireEvent('onChange', {
				minpos: this.maxstep, maxpos: this.step,
				step: this.step, maxstep: this.maxstep,
				inputMin: this.elementInputMin, inputMax: this.elementInputMax,
				infoMin: this.elementInfoMin, infoMax: this.elementInfoMax,
				bigI: this.bigI
			}, this);
		}

		this.clip_l = parseInt(this.knob.getStyle('left'),10) + this.options.knobwidth;
		w = Math.abs(parseInt(this.knob.getStyle('left'),10) - parseInt(this.maxknob.getStyle('left'),10));

		this.bkg.style.clip = "rect(" + this.clipTop + "px " + parseInt(this.clip_l + w,10) + "px " + (this.clipTop + this.clipHeight) + "px " + this.clip_l + "px)";

	},

	end: function(){
		if (this.previousEnd !== this.step || (this.maxknob && this.maxPreviousEnd != this.maxstep)) {
			this.previousEnd = this.step;
			this.maxPreviousEnd = this.maxstep;
			if(this.step < this.maxstep) {
				this.fireEvent('onComplete', { minpos: this.step, maxpos: this.maxstep, step: this.step, maxstep: this.maxstep, inputMin: this.elementInputMin, inputMax: this.elementInputMax, infoMin: this.elementInfoMin, infoMax: this.elementInfoMax, bigI: this.bigI });
			}
			else {
				this.fireEvent('onComplete', { minpos: this.maxstep, maxpos: this.step, step: this.step, maxstep: this.maxstep, inputMin: this.elementInputMin, inputMax: this.elementInputMax, infoMin: this.elementInfoMin, infoMax: this.elementInfoMax, bigI: this.bigI });
			}
		}
	},

	toStep: function(position){
		return Math.round((position + this.options.offset) / this.max * this.options.steps) + this.options.start;
	},

	toPosition: function(step){
		return (this.max * step / this.options.steps) - (this.max * this.options.start / this.options.steps) - this.options.offset;
	}

});

function crsrchRunKmRecount(x,inverse){
    if (inverse)
        return Math.round((110*(x/(x+8*3750))));
    x = (3750*(8/((220-(2*x))/220)-8)).round(-3);
    if (x >= 10000) x = Math.round(x.round(-4));
    return x;
}



function setAdvancedSlider(p,isPrice,doFormat,infoAddon){
  var xx = p.step, yy = p.maxstep;

  if (isPrice) {
      xx = isPrice(xx);
      yy = isPrice(yy);
  }
  p.inputMin.setProperty('value', xx);
  p.inputMax.setProperty('value', yy);
  if (doFormat) {
      xx = FormatNumberBy3(xx, ".", " ");
      yy = FormatNumberBy3(yy, ".", " ");
  }
  if (infoAddon) {
      xx += infoAddon;
      yy += infoAddon;
  }
  p.infoMin.innerHTML = xx;
  p.infoMax.innerHTML = yy;
}

function setOtherSlider (p){
  var xx = p.step, yy = p.maxstep;

  p.inputMin.setProperty('value', xx);
  p.inputMax.setProperty('value', yy);
  p.infoMin.innerHTML = xx;
  p.infoMax.innerHTML = yy;
}

function initIndexSliders(){
   var slider_years = new DoubleSlider($('crsrch_years'), {
      range: [Setting.YearEnhMin,Setting.YearEnhMax],
      start: Setting.YearEnhMin,
      end: Setting.YearEnhMax,
      snap: false,
      offset: 0,
       onChange: function(p){
          setOtherSlider(p);
          slider_years.isMin(p.step == Setting.YearEnhMin);
          slider_years.isMax(p.maxstep == Setting.YearEnhMax);
          slider_years.checkMinMax();
      },
      onComplete: getMultiCount
   }, 0);
   slider_years.setMin(Setting.YearEnhMin);
   slider_years.setMax(Setting.YearEnhMax);

   var slider_price = new DoubleSlider($('crsrch_price'), {
      range: [0,100], start: 0, end: 100, snap: false, offset: 0,
       onChange: function(p){
          setAdvancedSlider(p,crsrchPriceRecount,true,',-');
          slider_price.isMin(p.step == 0);
          slider_price.isMax(p.maxstep == 100);
          slider_price.checkMinMax();
      },
      onComplete: getMultiCount
   }, 0);
   slider_price.setMin(Setting.PriceEnhMin);
   slider_price.setMax(Setting.PriceEnhMax);

   var slider_km = new DoubleSlider($('crsrch_km'), {
      range: [0,100], start: 0, end: 100, snap: false, offset: 0,
       onChange: function(p){
          setAdvancedSlider(p,crsrchRunKmRecount,true,' km');
          slider_km.isMin(p.step == 0);
          slider_km.isMax(p.maxstep == 100);
          slider_km.checkMinMax();
      },
      onComplete: getMultiCount
   }, 0);
   slider_km.setMin(0);
   slider_km.setMax(100);
}

