//Utility classes and methods (refer to corresponding URLs for copyright information)

Object.extend(Event, {
  

  wheel: function(event){
    var delta=0;
    if (!event){
      event = window.event
    };
    if (event.wheelDelta) {
      delta = event.wheelDelta/120
    }
    else if (event.detail) {
      delta=-event.detail/3
    }
    return Math.round(delta)
  }
})

Element.addMethods({
  
  makeUnselectable: function(element, cursor) {
    cursor = cursor || 'default';
    element.onselectstart = function(){ return false };
    element.unselectable = "on";
    element.style.MozUserSelect = "none";
    element.style.cursor = cursor;
    return element;
  },
  
  // set element's dimensions to completely fill body
	fillBody: function(element) {
		var dim = $(document.body).getDimensions();
		return $(element).setStyle({
			width: dim.width + 'px',
			height: dim.height + 'px'
		})
	},
	
	_extend: function(element, hash) {
		return Object.extend($(element), hash);
	},
	
	flash: function(element, content, status) {
		element = $(element);
		if (!element.visible()) {
			if (content) {
				element.update(content);
			}
			if (status) {
				element.removeClassName(status == 'failure' ? 'success' : 'failure').addClassName(status || '');
			}
			new Effect.Appear(element, {
				duration: PROTO.FLASH_APPEAR_DURATION, 
				queue: { position: 'end', scope: 'error', limit: 1 },
				afterFinish: function() {
					new Effect.Appear(element, {
						duration: PROTO.FLASH_APPEAR_DURATION,
						from: 1,
						to: 0,
						delay: PROTO.FLASH_DELAY,
						afterFinish: function(){ element.hide() }
					})
				}
			})
		}
	},
	
	center: function(element, options) {
		var element = $(element), 
			elDim = element.getDimensions(),
			docDim = document.viewport.getDimensions(),
			options = Object.extend({width: true, height: true}, options);

		if (options.width) {
			element.setStyle({left: (docDim.width - elDim.width) / 2 + 'px'})
		}
		if (options.height) {
			element.setStyle({top: (docDim.height - elDim.height) / 2 + 'px'})
		}
		return element;
	},
	
	// TODO:
	// rework this method to handle textareas and buttons properly
	isEmpty: function(element) {
	  return $(element).getInputs().all(function(el){ return !$F(el).empty() })
	}
})

Object.extend(Control.Slider.prototype, {
  moveTo: function(position) {
    this.setValue(position == "start"
      ? this.range.start
      : (position == "end" ? this.range.end : position)
    )
    if (this.initialized && this.options.onSlide) {
      this.options.onSlide(this.values.length > 1 ? this.values : this.value, this);
    }
  }
})