Qype.Slider = Class.create({

  initialize: function(slider_bg, slider_thumb, slider_width, slider_step) {
    this.slider = YAHOO.widget.Slider.getHorizSlider(slider_bg, slider_thumb, 0, slider_width, slider_step);
    this.slider_step = slider_step;

    this.setListeners();

    var position = this.getActivePosition();
    if (position) {
      this.slider.setValue(position * this.slider_step, false);
    }
  },

  setListeners: function() {
    this.slider.subscribe("change", function(new_value) {
      this.activateClass(new_value);
    }.bind(this));

    this.slider.subscribe("slideEnd", function() {
      var element = this.getSelectedElement(this.slider.getValue());
      if (element) {
        var radius = YAHOO.util.Dom.getAttribute(element, 'rel');
        var link = YAHOO.util.Dom.getFirstChild(element);
        if (link) {
          var url = YAHOO.util.Dom.getAttribute(link, 'href');
          YAHOO.spinner.wait.show();
          window.location = url;
        }
      }
    }.bind(this));
  },

  activateClass: function(new_value) {
    var class_to_activate = new_value / this.slider_step;

    var elements = YAHOO.util.Selector.query('ul#SliderLinks li.SliderStop');
    YAHOO.util.Dom.batch(elements, function(li) {
      if (YAHOO.util.Dom.hasClass(li, 'Position_' + class_to_activate)) {
        YAHOO.util.Dom.removeClass(li, 'Inactive');
        YAHOO.util.Dom.addClass(li, 'Active');
      }
      else {
        YAHOO.util.Dom.removeClass(li, 'Active');
        YAHOO.util.Dom.addClass(li, 'Inactive');
      }
    });
  },

  getSelectedElement: function(slider_value) {
    var position = slider_value / this.slider_step;
    return YAHOO.util.Selector.query('ul#SliderLinks li.Position_' + position)[0];
  },

  getActivePosition: function() {
    var element = YAHOO.util.Selector.query('ul#SliderLinks li.Active')[0];
    if (element) {
      for (var index = 0, len = 10; index < len; ++index) {
        if (YAHOO.util.Dom.hasClass(element, 'Position_' + index)) {
          return index;
        }
      }
    }
    return 0;
  }

});
