docs: function( event ){
                  // read the data before hijacking anything
                  var dd = event.data;
                  // handle various events
                  switch ( event.type ){
                      // mousemove, check distance, start dragging
                      case !dd.dragging && 'touchmove':
                          event.preventDefault();
                      case !dd.dragging && 'mousemove':
                          //  drag tolerance, x² + y² = distance²
                          if ( Math.pow(  event.pageX-dd.pageX, 2 ) + Math.pow(  event.pageY-dd.pageY, 2 ) < Math.pow( dd.distance, 2 ) )
                              break; // distance tolerance not reached
                          event.target = dd.target; // force target from "mousedown" event (fix distance issue)
                          drag.hijack( event, "dragstart", dd ); // trigger "dragstart"
                          if ( dd.propagates ) // "dragstart" not rejected
                              dd.dragging = true; // activate interaction
                          // mousemove, dragging
                      case 'touchmove':
                          event.preventDefault();
                      case 'mousemove':
                          if ( dd.dragging ){
                              // trigger "drag"
                              drag.hijack( event, "drag", dd );
                              if ( dd.propagates ){
                                  // manage drop events
                                  if ( dd.drop !== false && $special.drop )
                                      $special.drop.handler( event, dd ); // "dropstart", "dropend"
                                  break; // "drag" not rejected, stop
                              }
                              event.type = "mouseup"; // helps "drop" handler behave
                          }
                          // mouseup, stop dragging
                      case 'touchend':
                      case 'mouseup':
                      default:
                          if ( drag.touched )
                              $event.remove( drag.touched, "touchmove touchend", drag.handler ); // remove touch events
                          else
                              $event.remove( document, "mousemove mouseup", drag.handler ); // remove page events
                          if ( dd.dragging ){
                              if ( dd.drop !== false && $special.drop )
                                  $special.drop.handler( event, dd ); // "drop"
                              drag.hijack( event, "dragend", dd ); // trigger "dragend"
                          }
                          drag.textselect( true ); // enable text selection
                          // if suppressing click events...
                          if ( dd.click === false && dd.dragging )
                              $.data( dd.mousedown, "suppress.click", new Date().getTime() + 5 );
                          dd.dragging = drag.touched = false; // deactivate element
                          break;
                  }
              }