         addEventListener(MouseEvent.CLICK, mouseEventHandler);
     }
     
+    /**
+     *  @private
+     *  This method adds the mouseEventHandler as an event listener to
+     *  the stage and the systemManager so that it gets called even if mouse events
+     *  are dispatched outside of the button. This is needed for example when the
+     *  user presses the button, drags out and releases the button.
+     */
     private function addSystemMouseHandlers():void
     {
         systemManager.addEventListener(MouseEvent.MOUSE_UP, mouseEventHandler, true /*useCapture*/);
         systemManager.stage.addEventListener(Event.MOUSE_LEAVE, mouseEventHandler);             
     }
 
+    /**
+     *  @private
+     *  This method removes the mouseEventHandler as an event listener from
+     *  the stage and the systemManager.
+     */
     private function removeSystemMouseHandlers():void
     {
         systemManager.removeEventListener(MouseEvent.MOUSE_UP, mouseEventHandler, true /*useCapture*/);
         systemManager.stage.removeEventListener(Event.MOUSE_LEAVE, mouseEventHandler);
     }
     
-    
-    /**
-     *  @private
+    /**
+     *  This method handles the mouse events, calls the <code>onClick</code> method 
+     *  where appropriate and updates the <code>hoveredOver</code> and
+     *  <code>mouseCaptured</code> properties.
+     *  <p>This method gets called to handle MouseEvent.ROLL_OVER, MouseEvent.ROLL_OUT,
+     *  MouseEvent.MOUSE_DOWN, MouseEvent.MOUSE_UP, MouseEvent.CLICK and Event.MOUSE_LEAVE.</p>
+     *  <p>For MouseEvent.MOUSE_UP and Event.MOUSE_LEAVE, the event target can be other than the
+     *  FxButton - for example when the user presses the FxButton, we listen for MOUSE_UP
+     *  on the stage to handle cases where the user drags outside the FxButton and releases
+     *  the mouse.</p>
      */
     protected function mouseEventHandler(event:Event):void
     {

     */
    override protected function keyDownHandler(event:KeyboardEvent):void
    {
        if( event.keyCode != Keyboard.SPACE )
            return;
        setKeyboardPressed(true);
        event.updateAfterEvent();
    }


        checkAutoRepeatTimerConditions( isDown() );
    }

    /**
     *  @private
     */
    private function checkAutoRepeatTimerConditions(buttonDown:Boolean):void
    {
        var needsTimer:Boolean = autoRepeat && buttonDown;
        var hasTimer:Boolean = autoRepeatTimer != null;
        
        if (needsTimer == hasTimer)
