package
{
    import com.adobe.kuler.KLibService;
    import com.adobe.kuler.events.GetResultEvent;
    
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.filters.BlurFilter;
    import flash.net.URLRequest;
    import flash.net.navigateToURL;
    import flash.text.AntiAliasType;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    
    import org.papervision3d.view.BasicView;

    [SWF(width="600", height="400", frameRate="25", backgroundColor="#FFFFFF")]
    public class Main extends BasicView
    {
        
        private var message:TextField;

        protected var openCube:OpenCube;

        public function Main():void
        {
            super(600, 400, true, true);

            // set message
            setMessage();
            
            // get Colors using kuler as3 library -- http://code.google.com/p/k-lib/
            getColor();
        }
        
        private function setImages():void {
            //Coconnut image
            var loader:Loader=new Loader();
            loader.load(new URLRequest("coconnut_200x50.png"));
            loader.addEventListener(MouseEvent.CLICK, onCoconnutClick);
            loader.x=400;
            addChild(loader);
            
            // kuler image
            var loader2:Loader=new Loader();
            loader2.load(new URLRequest("ku_18pxBugOnly.png"));
            loader2.addEventListener(MouseEvent.CLICK, onKulerClick);
            loader2.x=582;
            loader2.y=382;
            addChild(loader2);
        }
        
        private function onCoconnutClick(e:Event):void {
            navigateToURL(new URLRequest("http://www.coconnut.com/blog/"), "_blank");
        }
        
        private function onKulerClick(e:Event):void {
            navigateToURL(new URLRequest("http://kuler.adobe.com"), "_blank");
        }
        
        private function setMessage():void {
            var format1:TextFormat = new TextFormat();
            format1.font="Verdana";
            format1.size=10;
            format1.color = 0x000000;
            
            message = new TextField();
            message.y=0;
            message.text="loading colors...";
            message.embedFonts=false;
            
            message.autoSize=TextFieldAutoSize.LEFT;
            message.antiAliasType=AntiAliasType.ADVANCED;
            message.setTextFormat(format1);
            addChild(message);
        }
        
        private function getColor():void {
            // http://code.google.com/p/k-lib/
            var klib:KLibService=new KLibService("77EFFF8092F241D6FBEB7849EF34BC59"); 
            //Get an API key at http://kuler.adobe.com/api/
            klib.addEventListener(GetResultEvent.GET_RESULTS, onResults);

            klib.getRecent();
        }

        private function onResults(e:GetResultEvent):void
        {
            // set images
            setImages();
            
            // remove message
            removeChild(message);
            
            // init 3D
            init3D(e.results.swatches);
        }

        private function init3D(colors:Array):void
        {
            //Stats
            //addChild(new Stats());
            
            //3D Stats
            //addChild(new StatsView(this.renderer));
            
            //Set Camera
            this.camera.zoom=80;
            this.camera.yaw(5);

            //Create a plane using the colorMaterial
            openCube=new OpenCube(colors);
            scene.addChild(openCube);
            
            //Start the rendering
            startRendering();
        }

        private var posX:Number;
        private var posY:Number;
        
        private var factor:Number = 40;

        override protected function onRenderTick(event:Event=null):void
        {
            posX   = (mouseX / width) - 0.5;
            posY   = (mouseY / height) - 0.5;
            
            var blur:BlurFilter   = new BlurFilter();
            
            blur.blurX = Math.abs( factor * posX );
            blur.blurY = Math.abs( factor * posY );
            
            openCube.filters   = [blur];
            
            openCube.rotationX += factor * posY;
            openCube.rotationY += factor * posX;

            // render
            super.onRenderTick(event);
        }
    }
}