BestInClass.SliderData = Class.create();
BestInClass.SliderData.prototype =
{
  tag: null,
  desc: null,
  suffix: "",
  
  initialize: function(tag)
  {
    this.tag = tag;
  },
  
  range: function()
  {
    return $R(0, this.values.length - 1);
  },
  
	value_index: function(value)
	{
    var res = this.default_index;
    this.values.detect(function(aval, index) {
      if (aval == value)
      {
        res = index;
        return true;
      }
      return false;
    });
    return res;
	},
	
	tag_value: function(index, prefix)
  {
    var val = this.values[index].toString();
    if (val == "0" || val == "-1")
      return "";
    return (prefix ? prefix : "") + this.tag + "+" + val;
  },
  
  readable_value: function(index)
  {
    if (this.desc != null)
      return this.desc[index]
    else
      return this.values[index] + this.suffix;
  }
  
};


BestInClass.MinMaxSliderData = Class.create(BestInClass.SliderData, {

  default_index: function(is_min)
  {
    return is_min ? this.default_min_index : this.default_max_index;
  },
  
  unrestricted: function(index)
  {
    var val = this.values[index];
    return val == 0 || val == -1;
  },
  
  readable_value: function(index)
  {
    return this.unrestricted(index) ? "Any" : this.values[index] + this.suffix;
  }

});


BestInClass.PriceSliderData = Class.create(BestInClass.SliderData, {
  default_index: 7,
  values: [
    100,150,200,250,300,350,400,450,
    500,600,700,800,900,1000,1100,1200,
    1300,1400,1500,2000,2500,3000,0
  ],
  
  readable_value: function(index)
  {
    var val = this.values[index];
    return val == 0 ? "Not Important" : "Under $" + val;
  }
});


BestInClass.ReleasedSliderData = Class.create(BestInClass.SliderData, {
  default_index: 1,
  values: [3,6,12,24],
  desc: ["3 months", "6 months", "1 year", "2 years"]
});


BestInClass.SliderData.from_type = function(stype, tag)
{
  fn = function(match) { return match[1].capitalize(); };
  var cname = stype.gsub(/_(\w)/, fn);
  cname = cname.sub(/(\w)/, fn);
  return eval("new BestInClass." + cname + "SliderData(tag);")
};


BestInClass.GoalSlider = Class.create();
BestInClass.GoalSlider.sliders = [];
BestInClass.GoalSlider.prototype =
{
	elem: null,
	input_elem: null,
	value_elem: null,
	control: null,
	data: null,
	auto_submit: null,
	submit_elem: null,
	
	initialize: function(elem)
	{
		this.elem = elem;
		this.input_elem = elem.down('input');
		this.value_elem = elem.down('.slval');
		this.auto_submit = elem.down('.autosub') != null;
		this.data = BestInClass.SliderData.from_type(this.slider_type(), this.tag_name());
		BestInClass.GoalSlider.sliders.push(this);
	},
	
	slider_type: function()
	{
	  return this.elem.readAttribute('id').gsub(/_slider_type$/, '');
	},
	
	tag_name: function()
	{
	  return this.input_elem.readAttribute('id').gsub(/_input$/, '');
	},
	
	show: function()
	{
	  this.submit_elem = null;
    this.control.setDisplayMetrics();
	  this.control.setValue(this.data.default_index);
	},
	
	clear: function()
	{
	  this.input_elem.writeAttribute("value", "");
	},
	
	on_slide: function(index)
	{
    document.body.style.cursor = "pointer";
    this.value_elem.update(this.data.readable_value(index));
  },

	on_change: function(index)
	{
    this.on_slide(index);
    this.input_elem.writeAttribute("value", this.data.tag_value(index));
    document.body.style.cursor = "default";
    reveal_submit(this.elem);
    if (this.submit_elem && this.auto_submit)
      $(this.submit_elem).submit();
	},

	create: function()
	{
	  var slider_obj = this;
    var input_val = this.input_elem.readAttribute('value');
    input_val = input_val == null ? '' : input_val
    var val = input_val.gsub(/^.*\+/, '');
    var i = this.data.value_index(val);
    this.value_elem.update(this.data.readable_value(i));
    this.control = new Control.Slider(this.elem.down('.handle'), this.elem.down('.slider'), {
      range: this.data.range(),
      sliderValue: i,
      values: $A(this.data.range()),
      onSlide: function(index) { slider_obj.on_slide(index); },
      onChange: function(index) { slider_obj.on_change(index); }
    });
	}
};


BestInClass.MinMaxGoalSlider = Class.create();
BestInClass.MinMaxGoalSlider.prototype =
{
	elem: null,
	input_elem_min: null,
	input_elem_max: null,
	value_elem_min: null,
	value_elem_max: null,
	control: null,
	data: null,
	auto_submit: null,
	submit_elem: null,
	
	initialize: function(elem)
	{
		this.elem = elem;
		this.input_elem_min = elem.down('input.min');
		this.input_elem_max = elem.down('input.max');
		this.value_elem = elem.down('.slval');
		this.auto_submit = elem.down('.autosub') != null;
		this.data = BestInClass.SliderData.from_type(this.slider_type(), this.tag_name());
		BestInClass.GoalSlider.sliders.push(this);
	},
	
	slider_type: function()
	{
	  return this.elem.readAttribute('id').gsub(/_slider_type$/, '');
	},
	
	tag_name: function()
	{
	  return this.value_elem.readAttribute('id').gsub(/_value$/, '');
	},
	
	show: function()
	{
	  this.submit_elem = null;
    this.control.setDisplayMetrics();
	  this.control.setValue(this.data.default_min_index, 0);
	  this.control.setValue(this.data.default_max_index, 1);
	},
	
	clear: function()
	{
	  this.input_elem_min.writeAttribute("value", "");
	  this.input_elem_max.writeAttribute("value", "");
	},
	
	update_value: function(min_i, max_i)
	{
	  var min_any = this.data.unrestricted(min_i);
	  var max_any = this.data.unrestricted(max_i);
	  var str = "";
	  if (min_any && max_any)
	    str = "Any";
	  else if (min_any)
	    str = "Up to " + this.data.readable_value(max_i);
	  else if (max_any)
	    str = "At least " + this.data.readable_value(min_i);
	  else if (min_i == max_i)
      str = this.data.readable_value(min_i);
	  else
	    str = "From " + this.data.readable_value(min_i) + " to " +this.data.readable_value(max_i);
    this.value_elem.update(str);
	},
	
	on_slide: function(arr)
	{
    document.body.style.cursor = "pointer";
    this.update_value(arr[0], arr[1]);
  },

	on_change: function(arr)
	{
    this.on_slide(arr);
    this.input_elem_min.writeAttribute("value", this.data.tag_value(arr[0], "min_"));
    this.input_elem_max.writeAttribute("value", this.data.tag_value(arr[1], "max_"));
    document.body.style.cursor = "default";
    reveal_submit(this.elem);
    if (this.submit_elem && this.auto_submit)
      $(this.submit_elem).submit();
	},
	
	init_value: function(input_elem, is_min)
	{
    var input_val = input_elem.readAttribute('value');
    input_val = input_val == null ? '' : input_val
    var val = input_val.gsub(/^.*\+/, '');
    if (val == '')
      return this.data.default_index(is_min);
    else
      return this.data.value_index(val) || this.data.default_index(is_min);
	},

	create: function()
	{
	  var slider_obj = this;
	  var min_i = this.init_value(this.input_elem_min, true);
	  var max_i = this.init_value(this.input_elem_max, false);
	  this.update_value(min_i, max_i);
    this.control = new Control.Slider(
      [this.elem.down('.handle.min'), this.elem.down('.handle.max')], this.elem.down('.slider'), {
        range: this.data.range(),
        sliderValue: [min_i, max_i],
        values: $A(this.data.range()),
        onSlide: function(arr) { slider_obj.on_slide(arr); },
        onChange: function(arr) { slider_obj.on_change(arr); },
        restricted: true
    });
	}
};


BestInClass.GoalSlider.from_elem = function(elem)
{
  var res = null;
  var id = elem.identify();
  BestInClass.GoalSlider.sliders.detect(function(val) {
    if (val.elem.identify() == id)
    {
      res = val;
      throw $break;
    }
  });
  return res;
}


BestInClass.GoalSlider.init = function()
{
  $$('.slider_goal.one').each(function(e) {
    new BestInClass.GoalSlider(e).create();
  });
  $$('.slider_goal.two').each(function(e) {
    new BestInClass.MinMaxGoalSlider(e).create();
  });
}

