package {
    import com.adobe.viewsource.ViewSource;
    import com.cb.DistortImage;
    import com.cb.DistortVO;
    
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.MouseEvent;
    
    import gs.TweenLite;
    import gs.easing.Cubic;
    
    import mx.core.BitmapAsset;

    [SWF(pageTitle="Image Distortion", backgroundColor="#BBBBBB", frameRate="30", width="350", height="300")]
    public class ImageDistortion extends Sprite
    {
        [Embed(source="/assets/glacier.jpg")]
        private var Background: Class;
        private var _background:BitmapAsset = new Background();        
        
        private var _image:Sprite;
        private var _d:DistortImage;
        private var _dVO:DistortVO;
        private var _tl:Sprite;
        private var _tr:Sprite;
        private var _bl:Sprite;
        private var _br:Sprite;

        public function ImageDistortion()
        {
            ViewSource.addMenuItem(this, "srcview/index.html");  // Used to allow ViewSource
            
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;    
            
            _image = new Sprite();
            _image.addChild(_background);
            this.addChild(_image);

            _d = new DistortImage( _image, 2, 2 );
            _image.removeChild(_background);

            _dVO = new DistortVO();
            _dVO.data = _image;

            _tl = buildMarker();
            _tl.x = _image.x + 25;
            _tl.y = _image.y + 50;
            this.addChild(_tl);
            
            _tr = buildMarker();
            _tr.x = _image.x + _image.width + 25;
            _tr.y = _image.y + 50;
            this.addChild(_tr);
            
            _bl = buildMarker();
            _bl.x = _image.x + _image.width + 25;
            _bl.y = _image.y + _image.height + 50;
            this.addChild(_bl);

            _br = buildMarker();
            _br.x = _image.x + 25;
            _br.y = _image.y + _image.height + 50;
            this.addChild(_br);
            
            clickHandler();
            
        }
        
        private function buildMarker():Sprite
        {
            var result:Sprite = new Sprite();
            result.graphics.beginFill(0xFF0000, 0.7);
            result.graphics.drawRect(-5,-5,10,10);
            result.buttonMode = true;
            result.useHandCursor = true;
            result.addEventListener(MouseEvent.MOUSE_DOWN, downHandler, false, 0, true);
            result.addEventListener(MouseEvent.MOUSE_UP, upHandler, false, 0, true);
            result.addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true);
            return result;
        }
        
        private function downHandler(event:MouseEvent):void
        {
            (event.currentTarget as Sprite).startDrag();
        }

        private function upHandler(event:MouseEvent):void
        {
            (event.currentTarget as Sprite).stopDrag();
        }
        
        private function clickHandler(event:MouseEvent = null):void
        {
            TweenLite.to(_dVO, 0.5, {x0:_tl.x, y0:_tl.y, x1:_tr.x, y1:_tr.y, x2:_bl.x, y2:_bl.y, x3:_br.x, y3:_br.y, onUpdate:applyMatrix, onUpdateParams:[_dVO], ease:Cubic.easeOut});            
        }
        
        private function applyMatrix($dVO:DistortVO):void 
        {
           _d.setTransform($dVO.x0, $dVO.y0, $dVO.x1, $dVO.y1, $dVO.x2, $dVO.y2 ,$dVO.x3, $dVO.y3);    
        }
    }
}