package {
    
    import flash.display.Stage;
    import flash.display.StageScaleMode;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
    //import flash.display.GradientType;
    //import flash.display.SpreadMethod;
    import flash.display.Sprite;
    import flash.filters.BitmapFilter;
    import flash.filters.DisplacementMapFilter;
    import flash.filters.DisplacementMapFilterMode;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    
    import flash.filters.GlowFilter; 
    import flash.filters.BlurFilter;
    import flash.geom.Rectangle;
    import flash.events.Event;
    import net.sakri.component.HorizontalBitmapScroller;
    import net.sakri.graphics.WaveGraphic;
    import net.sakri.component.Reflection;
    
    import com.adobe.viewsource.ViewSource;
    
       [SWF(width="800", height="600", backgroundColor="#000000")]
    public class DisplacementMapFilterTest extends Sprite{
        
        /* STATIC VARIABLES */
        public static const APP_WIDTH:uint=800;
        public static const APP_HEIGHT:uint=600;

        /* EMBEDDED ASSETS */    
        [Embed(source="assets/ArialBlackFont.swf", fontName="Arial Black")]
        public static var ArialBlack:Class;    

        /* VARIABLES */
        private var _holder:Sprite;
        private var label_text:String = "Look Mommie,\n I can displacementMapFilter!!11";
        
        private var _reflection:Reflection;      

        private var bitmap_scroller:HorizontalBitmapScroller;

        /* CONSTRUCTOR */
        public function DisplacementMapFilterTest(){
            ViewSource.addMenuItem(this, "srcview/index.html");
            stage.scaleMode=StageScaleMode.NO_SCALE;
            stage.frameRate=31;
            init();
        }
        
        /* METHODS */
        private function init():void{
            _holder=new Sprite();
            addChild(_holder);
            bitmap_scroller=createWaveBDScroller();
            bitmap_scroller.scroll_speed=10;
            //addChild(bitmap_scroller);
            var label:TextField=createLabel();
            _holder.addChild(label);
            createReflection();
            addEventListener(Event.ENTER_FRAME,moveWave);
        }
        
        public function moveWave(e:Event=null):void{
            bitmap_scroller.scroll();
           _holder.filters =[getBitmapFilter()];
            _reflection.render(null,APP_WIDTH,APP_HEIGHT/2);
        }
        
        
        private function getBitmapFilter():BitmapFilter {
            var mapBitmap:BitmapData = new BitmapData(APP_WIDTH,APP_HEIGHT/2);
            mapBitmap.draw(bitmap_scroller,null,null,null,null,true);
            var mapPoint:Point       = new Point(0, 0);
            var channels:uint        = BitmapDataChannel.RED;
            var componentX:uint      = channels;
            var componentY:uint      = channels;
            var scaleX:Number        = 1;
            var scaleY:Number        = -30;
            var mode:String          = DisplacementMapFilterMode.CLAMP;
            var color:uint           = 0;
            var alpha:Number         = 0;
            return new DisplacementMapFilter(mapBitmap,
                                             mapPoint,
                                             componentX,
                                             componentY,
                                             scaleX,
                                             scaleY,
                                             mode,
                                             color,
                                             alpha);
        }

        private function createWaveBDScroller():HorizontalBitmapScroller{
            var _wave_graphic:WaveGraphic=new WaveGraphic();
            _wave_graphic.wave_peaks=4;    
            _wave_graphic.wave_center_height=.3;        
            _wave_graphic.top_color=0xFF0000;
            _wave_graphic.bottom_color=0x0000FF;
            _wave_graphic.init(APP_WIDTH,APP_HEIGHT/2);
            var blur:BlurFilter=new BlurFilter(0,100);
            _wave_graphic.filters=[blur];
            var _wave_bd:BitmapData=new BitmapData(APP_WIDTH,APP_HEIGHT/2);
            _wave_bd.draw(_wave_graphic, new Matrix());
            
            return new HorizontalBitmapScroller(_wave_bd);
            //var bitmap:Bitmap = new Bitmap(bd);
            //addChild(_wave_graphic);
        }
        
        private function createLabel():TextField{
            var tf:TextField = new TextField();
            tf.multiline=true;
            var tformat:TextFormat=new TextFormat();
            tf.selectable=false;
            tf.embedFonts=true;
            tformat.font="Arial Black";
            tformat.color=0xD3E2B7;
            tformat.bold=true;
            tformat.size="46";
            tformat.bold=true;
            tformat.align=TextFormatAlign.CENTER;
            tf.text = label_text;
            tf.setTextFormat(tformat);
            tf.y = 100;
            tf.width = APP_WIDTH;
            tf.height=200;
            tf.filters=[new GlowFilter(0xA4BE05,.8,10,10,2)];
            return tf;
        }
        
        private function createReflection():void{
            _reflection=new Reflection();
            _reflection.init(_holder);
            _reflection.y=APP_HEIGHT/2-240;
            addChild(_reflection);
            //addEventListener(Event.ENTER_FRAME,_reflection.render);
        }
    }
}