docs: function mxRubberband(graph)
  {
  	if (graph != null)
  	{
  		this.graph = graph;
  		this.graph.addMouseListener(this);
  
  		// Handles force rubberband event
  		this.forceRubberbandHandler = mxUtils.bind(this, function(sender, evt)
  		{
  			var evtName = evt.getProperty('eventName');
  			var me = evt.getProperty('event');
  			
  			if (evtName == mxEvent.MOUSE_DOWN && this.isForceRubberbandEvent(me))
  			{
  				var offset = mxUtils.getOffset(this.graph.container);
  				var origin = mxUtils.getScrollOrigin(this.graph.container);
  				origin.x -= offset.x;
  				origin.y -= offset.y;
  				this.start(me.getX() + origin.x, me.getY() + origin.y);
  				me.consume(false);
  			}
  		});
  		
  		this.graph.addListener(mxEvent.FIRE_MOUSE_EVENT, this.forceRubberbandHandler);
  		
  		// Repaints the marquee after autoscroll
  		this.panHandler = mxUtils.bind(this, function()
  		{
  			this.repaint();
  		});
  		
  		this.graph.addListener(mxEvent.PAN, this.panHandler);
  		
  		// Does not show menu if any touch gestures take place after the trigger
  		this.gestureHandler = mxUtils.bind(this, function(sender, eo)
  		{
  			if (this.first != null)
  			{
  				this.reset();
  			}
  		});
  		
  		this.graph.addListener(mxEvent.GESTURE, this.gestureHandler);
  		
  		// Automatic deallocation of memory
  		if (mxClient.IS_IE)
  		{
  			mxEvent.addListener(window, 'unload',
  				mxUtils.bind(this, function()
  				{
  					this.destroy();
  				})
  			);
  		}
  	}
  }