package {
    import classes.FireParticle;
    import classes.SmokeParticle;
    
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
    import flash.display.GradientType;
    import flash.display.Loader;
    import flash.display.SpreadMethod;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.filters.BlurFilter;
    import flash.filters.DisplacementMapFilter;
    import flash.filters.DisplacementMapFilterMode;
    import flash.geom.Matrix;
    import flash.geom.Point; 
    import flash.net.URLRequest;

[SWF(backgroundColor = 0x000000, frameRate='30', width='180', height='400')]

    public class particlefire extends Sprite
    {
        
        private var mainSprite:Sprite;
        private var fireSprite:Sprite
        private var smokeSprite:Sprite;
        
        private var waterDisplaceFilter:DisplacementMapFilter;
        private var waterOffset:Array = new Array();
        private var waterBitmapData:BitmapData;
        
        
        private var waterSprite:Sprite;
        
        public function particlefire()
        {
            //we make mainSprite that will consist sprites
            mainSprite = new Sprite();
            mainSprite.graphics.beginFill(0x000000);
            mainSprite.graphics.drawRect(0, 0, 180, 200);
            mainSprite.graphics.endFill();
            this.addChild(mainSprite);

            //fire sprite
            fireSprite = new Sprite();
            fireSprite.graphics.beginFill(0x000000);
            fireSprite.graphics.drawRect(0, 0, 180, 200);
            fireSprite.graphics.endFill();
            mainSprite.addChild(fireSprite);
            
            //smokeSprite for smoke effect
            smokeSprite = new Sprite();
            smokeSprite.graphics.beginFill(0xFFFFFF, 0);
            smokeSprite.graphics.drawRect(0, 0, 220, 250);
            smokeSprite.graphics.endFill();
            smokeSprite.x = -20;
            smokeSprite.y = -25;
            mainSprite.addChild(smokeSprite);
            var smoke:SmokeParticle = new SmokeParticle();
            smokeSprite.addChild(smoke);
            
            //make text
            var plainSprite:Sprite = new Sprite();
            var fillType:String = GradientType.LINEAR;
            var colors:Array = [0xaaccaa, 0xFFFFFF];
            var alphas:Array = [0.6, 0];
            var ratios:Array = [0, 255];
            var matr:Matrix = new Matrix();
            matr.createGradientBox(100, 100, 0, 0, 0);            
            plainSprite.graphics.beginGradientFill(fillType, colors, alphas, ratios, matr, SpreadMethod.REFLECT);
            plainSprite.graphics.lineStyle(1, 0xFFFFFF);
            plainSprite.graphics.drawRoundRect(0, 0, 100, 100, 20, 20);
            plainSprite.graphics.endFill();
            plainSprite.x = 40;
            plainSprite.y = 50;
            this.addChild(plainSprite);
            //make fire
            startFire()
            
            //make water effect 
            waterSprite = new Sprite();
            waterSprite.graphics.beginFill(0x000000);
            waterSprite.graphics.drawRect(0, 0, 180, 200);
            waterSprite.graphics.endFill();
            waterSprite.y = 200;
            this.addChild(waterSprite);            
            var waterLoader:Loader = new Loader();
            var waterUrl:URLRequest = new URLRequest("images/water3.jpg");
            waterLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
            waterLoader.load(waterUrl);
        }
        
        private function startFire():void
        {
            var part:FireParticle = new FireParticle(); 
            part.x = 10;
            part.y = 10;
            fireSprite.addChild(part);
        }
         
        private function loadComplete(event:Event):void
        {
            waterSprite.addChild(event.currentTarget.content);
            waterSprite.addEventListener(Event.ENTER_FRAME, waterEffectStart);
            waterBitmapData = new BitmapData(180, 200, false, 0xFFFFFF);
            waterBitmapData.draw(waterSprite);    
            //create a DisplacementMapFilter
            waterDisplaceFilter = new DisplacementMapFilter(waterBitmapData, new Point(0, 0), BitmapDataChannel.BLUE, BitmapDataChannel.BLUE, 10, 5, DisplacementMapFilterMode.CLAMP)
            waterOffset[0] = new Point();        
            waterSprite.filters = [waterDisplaceFilter]    
        }
        
        private function waterEffectStart(event:Event):void
        {
            var channels:uint = BitmapDataChannel.BLUE | BitmapDataChannel.ALPHA
            waterOffset[0].x +=2;
            waterOffset[0].y -=2
            waterBitmapData.perlinNoise(20, 40, 3, 100, true, true, channels, false, waterOffset);
            waterSprite.filters = [waterDisplaceFilter];                 
        }
        
    }
}