(function() {
   var b=jQuery(document);
   jQuery.fn.monitorDistance=function(callback, options) {
      var min=options.min || -1;
      var max=options.max || -1;
      
      return this.each(function() {
         var target=jQuery(this);
         var aX, aY, bX, bY, cX, cY, dX, dY;
         var listener;
         var offset=target.offset();
         var width=target.outerWidth();
         var height=target.outerHeight();
         
         aX=offset.left;
         aY=offset.top;
         cX=aX+width;
         cY=aY+height;
         b.mousemove(listener=function(evt) {
            var mX=evt.pageX;
            var mY=evt.pageY;
            var sX, sY;
            
            var inX=mX>=aX && mX<=cX;
            var inY=mY>=aY && mY<=cY;
            var onLeft=mX<aX;
            var onTop=mY<aY;
            
            var dist;      
            if(inX) {
               if(inY)
                  dist=0;
               else
                  dist=onTop?aY-mY:mY-cY;
            } else if(inY) {
               if(inX)
                  dist=0;
               else
                  dist=onLeft?aX-mX:mX-cX;
            } else {
               sX=onLeft?aX-mX:mX-cX;
               sY=onTop?aY-mY:mY-cY;
               dist=Math.sqrt(Math.pow(sX, 2)+Math.pow(sY, 2));
            }
            if(!(min>-1 && dist<min || max>-1 && dist>max))
               if(false===callback.call(target, dist))
                  b.unbind('mousemove', listener);
         });         
      });
   }
})();
