(function($) {
	$.fn.wheel = function( fn ){
		return this[ fn ? "bind" : "trigger" ]( "wheel", fn );
	};
	$.event.special.wheel = {
		setup: function(){
			$.event.add( this, wheelEvents, wheelHandler, {} );
		},
		teardown: function(){
			$.event.remove( this, wheelEvents, wheelHandler );
		}
	};
	var wheelEvents = !$.browser.mozilla ? "mousewheel" : // IE, opera, safari
		"DOMMouseScroll"+( $.browser.version<"1.9" ? " mousemove" : "" ); // firefox
	function wheelHandler( event ) {
		switch ( event.type ){
			case "mousemove":
				return $.extend( event.data, { // store the correct properties
					clientX: event.clientX, clientY: event.clientY,
					pageX: event.pageX, pageY: event.pageY
				});
			// firefox
			case "DOMMouseScroll":
				$.extend( event, event.data ); // fix event properties in FF2
				event.delta = -event.detail / 3; // normalize delta
				break;
			// IE, opera, safari	
			case "mousewheel":
				event.delta = event.wheelDelta / 120;
				break;
		}
		event.type = "wheel"; // hijack the event
		return $.event.handle.call( this, event, event.delta );
	}
	var t = $.tools.scrollable;
	t.plugins = t.plugins || {};
	t.plugins.mousewheel = {
		version: '1.0.1',
		conf: {
			api: false,
			speed: 50
		}
	};
	$.fn.mousewheel = function(conf) {
		var globals = $.extend({}, t.plugins.mousewheel.conf), ret;
		if (typeof conf == 'number') { conf = {speed: conf}; }
		conf = $.extend(globals, conf);
		this.each(function() {
			var api = $(this).scrollable();
			if (api) { ret = api; }
			api.getRoot().wheel(function(e, delta) {
				api.move(delta < 0 ? 1 : -1, conf.speed || 50);
				return false;
			});
		});
		return conf.api ? ret : this;
	};
})(jQuery);
