function productBrowser(elem) {
  var scrollable = elem;
  var list       = undefined;
  var slider     = undefined;
  var labels     = undefined;
  var clickInc   = undefined;
  
  var options = Object.extend({
    clickInc:     0.05,
	  handle:       'handle',
	  track:        'track',
	  prev:         'prev',
	  next:         'next',
	  popupClass:   'popup',
	  closeClass:   'close',
	  labels:       {},
	  fadeDuration: 0.15,
	  fadeOpacity:  0.98
	}, arguments[1] || {});
	
  function setup() {
    scrollable = $(scrollable);
    list       = scrollable.down('ul');
    slider     = new Control.Slider(options.handle, options.track, {
      onSlide:  scrollHorizontal,
      onChange: scrollHorizontal
    });
  
    watchArrows();
    watchLabels();
    watchBoxshots();
  }
  
  function watchArrows() {
    clickInc = slider.maximum * options.clickInc;

    $(options.prev).observe('click', function() {
      var new_value = slider.value - clickInc;
      moveTo((new_value < 0) ? 0 : new_value);
    });

    $(options.next).observe('click', function() {
      var new_value = slider.value + clickInc;
      moveTo((new_value > 1) ? 1 : new_value);
    });
  }
  
  function watchLabels() {
    labels = $H(options.labels);
    labels.each(function(pair) {
      $(pair.key).observe('click', moveTo.curry(pair.value));
      $(pair.key).observe('mousedown', function(event) {
        event.stop();
        slider.eventMouseDown(event);
      });
    });
  }
  
  function watchBoxshots() {
    scrollable.select('li').invoke('observe', 'click', function(event) {
      var elem = event.findElement('li');
      if (elem != event.element())
        return;

      var popup_elem = elem.identify() + '_popup';
      popup_elem = $(popup_elem);

      if (!popup_elem)
        return;

      new Effect.Appear(popup_elem, { to: options.fadeOpacity, duration: options.fadeDuration });
      slider.setDisabled();
    });

    // Hide a popup when the close button is pressed
    $$('.' + options.popupClass + ' .' + options.closeClass).invoke('observe', 'click', function(event) {
      var elem = event.findElement('.' + options.popupClass);
      if (!elem)
        return;

      new Effect.Fade(elem, { duration: options.fadeDuration });
      slider.setEnabled();
    });
    
    // Radios
    $$('.popup .radios').each(function(elem) {
      var price_elem = elem.up('.popup').down('h6 span');
      elem.select('input[type=radio]').invoke('observe', 'click', function(event) {
        price_elem.update($F(event.element()));
      });
    });
  }

  function moveTo(value) {
    if (slider.disabled)
      return;

    scrollHorizontal(value);
    slider.setValue(value);
  }

  function scrollHorizontal(value) {
    var pos = Math.round(value/slider.maximum*(list.getWidth() - 730) * -1);
    list.setStyle({ left: pos + "px" });
  }

  // Wait until the DOM is loaded
  if (document.loaded)
    setup();
  else
    document.observe('dom:loaded', setup);
}