(function(){
	
	var special = jQuery.event.special,
		uid1 = 'D' + (+new Date()),
		uid2 = 'D' + (+new Date() + 1);
		
	special.scrollstart = {
		setup: function() {
			
			var timer,
				handler =  function(evt) {
					
					var _self = this,
						_args = arguments;
					
					if (timer) {
						clearTimeout(timer);
					} else {
						evt.type = 'scrollstart';
						jQuery.event.handle.apply(_self, _args);
					}
					
					timer = setTimeout( function(){
						timer = null;
					}, special.scrollstop.latency);
					
				};
			
			jQuery(this).bind('scroll', handler).data(uid1, handler);
			
		},
		teardown: function(){
			jQuery(this).unbind( 'scroll', jQuery(this).data(uid1) );
		}
	};
	
	special.scrollstop = {
		latency: 300,
		setup: function() {
			
			var timer,
					handler = function(evt) {
					
					var _self = this,
						_args = arguments;
					
					if (timer) {
						clearTimeout(timer);
					}
					
					timer = setTimeout( function(){
						
						timer = null;
						evt.type = 'scrollstop';
						jQuery.event.handle.apply(_self, _args);
						
					}, special.scrollstop.latency);
					
				};
			
			jQuery(this).bind('scroll', handler).data(uid2, handler);
			
		},
		teardown: function() {
			jQuery(this).unbind( 'scroll', jQuery(this).data(uid2) );
		}
	};
	
})();

