package {
    import com.adobe.viewsource.ViewSource;
    import com.bit101.components.CheckBox;
    import com.bit101.components.HUISlider;
    import com.bit101.components.Label;
    import com.bit101.components.PushButton;
    import com.quasimondo.filters.MedianFilter_RGB;
    
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.utils.getTimer;
    
    [SWF('700',height='400',frameRate='32',backgroundColor='0x000000')]
    public class Median extends Sprite
    {
        [Embed("assets/bang.jpg", mimeType="image/png")]
           protected var SourceImage:Class;
        
        private var radiusSlider:HUISlider;
        private var applyButton:PushButton;
        private var asyncChk:CheckBox;
        private var img_in:BitmapData;
        private var img_out:BitmapData;
        private var lbl:Label;
        
        private var t:int;
        private var filter:MedianFilter_RGB;
           
        public function Median()
        {
            stage.scaleMode = "noScale";
            stage.align = "TL";
            
            ViewSource.addMenuItem(this, "srcview/index.html"); 
            
            run();
        }
        
        private function run():void
        {
            
            radiusSlider = new HUISlider(this,5,5,"Radius" );
            radiusSlider.minimum = 1;
            radiusSlider.maximum = 100;
            radiusSlider.value = 1;
            
            applyButton = new PushButton(this,310,4,"Apply Median", applyFilter );
            
            asyncChk = new CheckBox( this,190,9,"Asynchronous");
            
            lbl = new Label(this,460,4,"Render Time:");
        
            img_in = Bitmap( new SourceImage() ).bitmapData;
            //img_in.noise( 442123,0,255,1,true);
            //img_in.perlinNoise(48,48,3, 442123,false,true,1,true);
            img_out = img_in.clone();

            var bm1:Bitmap =  new Bitmap(img_in);
            var bm2:Bitmap =  new Bitmap(img_out);
            bm1.y = bm2.y = 32;
            bm2.x = img_in.width;
            
            addChild( bm1 );
            addChild( bm2 );
        
            filter = new MedianFilter_RGB();
            filter.addEventListener( Event.COMPLETE, onMedianComplete );
        }
            
        private function applyFilter( event:MouseEvent ):void
        {
            img_out.copyPixels( img_in, img_in.rect, img_in.rect.topLeft );
            t = getTimer();
            filter.applyFilter( img_out, radiusSlider.value, asyncChk.selected);
            if ( !asyncChk.selected ) {
                lbl.text = "Render Time: "+( getTimer() - t  )+" ms";
            } else {
                lbl.text = "Render Time: ...";
            }
        }
        
        private function onMedianComplete( event:Event ):void
        {
            lbl.text = "Render Time: "+( getTimer() - t  )+" ms";
        }
    }
}