package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.*;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	import flash.geom.Rectangle;
	import flash.media.Camera;
	import flash.media.Video;	
	
	import org.flashdevelop.utils.FlashConnect;
	
	/**
	 * ...
	 * @author James (Creative Nucleus / www.creativenucleus.com)
	 */
	public class Main extends Sprite {
		
		private var mVideo:Video = null;
		private var mDisplayBitmap:Bitmap = null;
		private var mTicker:Number = 0.0;
		
		public function Main():void {
			if( stage ) {
				init();
			} else {
				addEventListener( Event.ADDED_TO_STAGE, init );
			}
		}
		
		
		private function init( e:Event = null ):void {
			removeEventListener( Event.ADDED_TO_STAGE, init );

			var camera:Camera = Camera.getCamera();
			camera.setMode( 512, 512, 15 );		// ...should choose a decent capture resolution / framerate

			if( camera != null ) {
				mVideo = new Video( camera.width, camera.height );
				mVideo.attachCamera( camera );
			} else {
				FlashConnect.trace("You need a camera.");
			}
			
			mDisplayBitmap = new Bitmap();
			mDisplayBitmap.scaleX = stage.stageWidth / camera.width;
			mDisplayBitmap.scaleY = stage.stageHeight / camera.height;
			addChild( mDisplayBitmap );
			
			addEventListener( Event.ENTER_FRAME, enterFrame );
		}
		
		
		private function enterFrame( pEvent:Event ):void {
			mTicker += 0.03;
			
			var bitmapData:BitmapData = new BitmapData( mVideo.width, mVideo.height, false );
			
		// Copy displayed bitmap onto our new bitmapdata, with some zoom and shift
			var matrixTransform:Matrix = new Matrix();
			var tx:Number = Math.cos( mTicker * 1.1 ) * -0.5 - 1.5;
			var ty:Number = Math.sin( mTicker * 1.7 ) * -0.5 - 2.0;
			var zoom:Number = 1.005;
			matrixTransform.createBox( zoom, zoom, 0, tx, ty );
			bitmapData.draw( mDisplayBitmap, matrixTransform );
			
		// Overlay the current video stream on our new bitmapdata with a colour transform
			var colourTransform:ColorTransform = new ColorTransform();
			colourTransform.alphaMultiplier = 0.04;
			colourTransform.redMultiplier = Math.cos( mTicker * 1.2 ) * 0.2 + 0.8;
			colourTransform.greenMultiplier = Math.sin( mTicker * 1.3 ) * 0.2 + 0.8;
			colourTransform.blueMultiplier = Math.cos( mTicker * 1.4 ) * 0.2 + 0.8;
			bitmapData.draw( mVideo, null, colourTransform );

		// Assign our new bitmapdata onto the display bitmap
			mDisplayBitmap.bitmapData = bitmapData;
		}
	}	
}