package {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.DisplayObject;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.geom.Rectangle;
    
    [SWF( width="400", height="400", backgroundColor="0xEEEEEE" ) ]
    public class Bible_638_getColorBoundsRect2 extends Sprite {
        private var w:int = 400;
        private var h:int = 400;
        private var colorPalette:Array = [ 0x000066, 0x006600, 0x660000, 0x666600, 0x006666, 0x660066, 0x666666 ];
        
        private var bmpData:BitmapData;
        private var outline:Shape;
        private var shapeStage:Sprite;
        
        public function Bible_638_getColorBoundsRect2() {
            super();
    
            shapeStage = new Sprite();
            addChild( shapeStage );
            
            makeRndShapes( 12, shapeStage );
            bmpData = new BitmapData( w, h );
            bmpData.draw( shapeStage );
                    
            addEventListener( MouseEvent.CLICK, clickHandler );
            buttonMode = true;
            
            var bmp:Bitmap = new Bitmap( bmpData );
            var container:Sprite = new Sprite();
            addChild( container );
            container.addChild( bmp );
            
            outline = new Shape();
            addChild( outline );
        }
        
        private function makeRndShapes( n:int, sprite:Sprite ):void {
            
            for( var i:int = 0; i < n; i++ ) {
                sprite.graphics.lineStyle( 0, 0x000000, 0.0 );
                sprite.graphics.beginFill( getRndEle( colorPalette ) as uint, 0.5 );
                
                var radius:int = rndRangeInt( 20, 100 );
                if( rndRangeInt( 0, 1 ) ) {
                    
                    sprite.graphics.drawCircle( rndRangeInt( radius, w - radius ),
                                                rndRangeInt( radius, h - radius ),
                                                radius );
                } else {
                    sprite.graphics.drawEllipse(rndRangeInt( radius, w - radius ),
                                                rndRangeInt( radius, h - radius ), 
                                                rndRangeInt( 20, 100 ),
                                                rndRangeInt( 20, 100 ) );
                }
                
            }
        }

        private function clickHandler( e:MouseEvent ):void {
            var color:uint = bmpData.getPixel32( mouseX, mouseY );
            var rect:Rectangle = bmpData.getColorBoundsRect( 0xFFFFFFFF, color );
            outline.graphics.clear();
            outline.graphics.lineStyle( 1, 0x000000, 1 );
            outline.graphics.drawRect( rect.x, rect.y, rect.width, rect.height );
        }
        
        private function getRndEle( a:Array ):Object {
            return a[ Math.floor( Math.random() * a.length ) ];
        }
        
        private function rndRangeInt( low:int, high:int ):int {
            var dif:int = high - low + 1;
            var rnd:int = Math.floor( Math.random() * dif ) + low;
            return rnd;
        }        
    }
}