docs: function handler ( event ){
  	var elem = this, returned, data = event.data || {};
  	// mousemove or mouseup
  	if ( data.elem ){
  		// update event properties...
  		elem = event.dragTarget = data.elem; // drag source element
  		event.dragProxy = drag.proxy || elem; // proxy element or source
  		event.cursorOffsetX = data.pageX - data.left; // mousedown offset
  		event.cursorOffsetY = data.pageY - data.top; // mousedown offset
  		event.offsetX = event.pageX - event.cursorOffsetX; // element offset
  		event.offsetY = event.pageY - event.cursorOffsetY; // element offset
  		}
  	// mousedown, check some initial props to avoid the switch statement
  	else if ( drag.dragging || ( data.which>0 && event.which!=data.which ) ||
  		$( event.target ).is( data.not ) ) return;
  	// handle various events
  	switch ( event.type ){
  		// mousedown, left click, event.target is not restricted, init dragging
  		case 'mousedown':
  			$.extend( data, $( elem ).offset(), {
  				elem: elem, target: event.target,
  				pageX: event.pageX, pageY: event.pageY
  				}); // store some initial attributes
  			$event.add( document, "mousemove mouseup", handler, data );
  			selectable( elem, false ); // disable text selection
  			drag.dragging = null; // pending state
  			break; // prevents text selection in safari
  		// mousemove, check distance, start dragging
  		case !drag.dragging && 'mousemove':
  			if ( squared( event.pageX-data.pageX )
  				+ squared( event.pageY-data.pageY ) //  x² + y² = distance²
  				< data.distance ) break; // distance tolerance not reached
  			event.target = data.target; // force target from "mousedown" event (fix distance issue)
  			returned = hijack( event, "dragstart", elem ); // trigger "dragstart", return proxy element
  			if ( returned !== false ){ // "dragstart" not rejected
  				drag.dragging = elem; // activate element
  				drag.proxy = event.dragProxy = $( returned || elem )[0]; // set proxy
  				}
  		// mousemove, dragging
  		case 'mousemove':
  			if ( drag.dragging ){
  				returned = hijack( event, "drag", elem ); // trigger "drag"
  				if ( data.drop && $special.drop ){ // manage drop events
  					$special.drop.allowed = ( returned !== false ); // prevent drop
  					$special.drop.handler( event ); // "dropstart", "dropend"
  					}
  				if ( returned !== false ) break; // "drag" not rejected, stop
  				event.type = "mouseup"; // helps "drop" handler behave
  				}
  		// mouseup, stop dragging
  		case 'mouseup':
  			$event.remove( document, "mousemove mouseup", handler ); // remove page events
  			if ( drag.dragging ){
  				if ( data.drop && $special.drop ) $special.drop.handler( event ); // "drop"
  				hijack( event, "dragend", elem ); // trigger "dragend"
  				}
  			selectable( elem, true ); // enable text selection
  			drag.dragging = drag.proxy = data.elem = false; // deactivate element
  			break;
  		}
  	}