docs: function draggable(element, onmove, onstart, onstop) {
          onmove = onmove || function () { };
          onstart = onstart || function () { };
          onstop = onstop || function () { };
          var doc = element.ownerDocument || document;
          var dragging = false;
          var offset = {};
          var maxHeight = 0;
          var maxWidth = 0;
          var IE = $.browser.msie;
          var hasTouch = ('ontouchstart' in window);
  
          var duringDragEvents = {};
          duringDragEvents["selectstart"] = prevent;
          duringDragEvents["dragstart"] = prevent;
          duringDragEvents[(hasTouch ? "touchmove" : "mousemove")] = move;
          duringDragEvents[(hasTouch ? "touchend" : "mouseup")] = stop;
  
          function prevent(e) {
              if (e.stopPropagation) {
                  e.stopPropagation();
              }
              if (e.preventDefault) {
                  e.preventDefault();
              }
              e.returnValue = false;
          }
  
          function move(e) {
              if (dragging) {
                  // Mouseup happened outside of window
                  if (IE && !(document.documentMode >= 9) && !e.button) {
                      return stop();
                  }
  
                  var touches = e.originalEvent.touches;
                  var pageX = touches ? touches[0].pageX : e.pageX;
                  var pageY = touches ? touches[0].pageY : e.pageY;
  
                  var dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth));
                  var dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight));
  
                  if (hasTouch) {
                      // Stop scrolling in iOS
                      prevent(e);
                  }
  
                  onmove.apply(element, [dragX, dragY]);
              }
          }
          function start(e) {
              var rightclick = (e.which) ? (e.which == 3) : (e.button == 2);
              var touches = e.originalEvent.touches;
  
              if (!rightclick && !dragging) {
                  if (onstart.apply(element, arguments) !== false) {
                      dragging = true;
                      maxHeight = $(element).height();
                      maxWidth = $(element).width();
                      offset = $(element).offset();
  
                      $(doc).bind(duringDragEvents);
                      $(doc.body).addClass("sp-dragging");
  
                      if (!hasTouch) {
                          move(e);
                      }
                      
                      prevent(e);
                  }
              }
          }
          function stop() {
              if (dragging) {
                  $(doc).unbind(duringDragEvents);
                  $(doc.body).removeClass("sp-dragging");
                  onstop.apply(element, arguments);
              }
              dragging = false;
          }
  
          $(element).bind(hasTouch ? "touchstart" : "mousedown", start);
      }