<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()" viewSourceURL="srcview/index.html">
    <mx:Script>
        <![CDATA[
            import Sedna.Ui.Containers.Container;
            
            import mx.events.ListEvent;
            import mx.containers.HBox;
            import mx.events.CloseEvent;
            import mx.controls.Label;
            import mx.containers.TitleWindow
            import mx.events.ColorPickerEvent;
            
            import com.adobe.images.PNGEncoder
            
            private var seccp:ColorPicker
            
            private var i:icn
            
            private var path:String
            
            private var exp:Boolean
            
            private function init():void
            {
                i = new icn("Qi",0x0099FF,0x000099,0x000066)
                i.TextSize = 100
                c1.selectedColor = 0x0099FF
                c2.selectedColor = 0x000099
                tc.selectedColor = 0x000066
                da.addChild(i)
                seccp = c1
                c1.addEventListener(ColorPickerEvent.CHANGE , c1Change)
                c2.addEventListener(ColorPickerEvent.CHANGE , c2Change)
                pn.addEventListener(Event.CHANGE , pnChange)
                tx.addEventListener(Event.CHANGE , txChange)
                fs.addEventListener(Event.CHANGE , fsChange)
                tc.addEventListener(Event.CHANGE , tcChange)
                efa.addEventListener(MouseEvent.CLICK , ex)
                savebt.addEventListener(MouseEvent.CLICK , sClick)
                ec.addEventListener(MouseEvent.CLICK , ecClick)
            }
            
            ///Event Listeners
            private function c1Change(e:ColorPickerEvent):void
            {
                i.C1 = e.color
            }
            private function c2Change(e:ColorPickerEvent):void
            {
                i.C2 = e.color
            }
            private function pnChange(e:Event):void
            {
                var arr:Array = pn.text.split(" ")
                if(arr.length == 1)
                {
                    var s:String = pn.text.charAt(0).toUpperCase() + pn.text.charAt(1).toLowerCase()
                    tx.text = s
                }else
                {
                    var chars:Array = new Array()
                    for (var o:uint;o<arr.length;o++)
                    {
                        chars.push(arr[o].charAt(0).toLowerCase())
                    }
                    var s2:String = chars[0] as String
                    s2 = s2.toUpperCase()
                    chars = chars.splice(1,3)
                    s2 += chars.join("")
                    tx.text = s2
                }
                txChange(null)
            }
            private function txChange(e:Event):void
            {
                i.Text = tx.text
            }
            private function fsChange(e:Event):void
            {
                i.TextSize = fs.value
            }
            private function tcChange(e:ColorPickerEvent):void
            {
                i.TextColor = e.color
            }
            private function ex (e:MouseEvent):void
            {
                var f:File = File.documentsDirectory
                f.browseForDirectory("Select A directory to save")
                f.addEventListener(Event.SELECT , sel)
                exp = true
            }
            private function sClick (e:MouseEvent):void
            {
                var f:File = File.documentsDirectory
                f.browseForDirectory("Select A directory to save")
                f.addEventListener(Event.SELECT , sel)
            }
            private function sel(e:Event):void
            {
                path = e.target.nativePath
                createSave()
            }
            private function ecClick(e:MouseEvent):void
            {
                var cols:Object = generateColors(acc.selectedColor)
                c1.selectedColor = cols.c1
                i.C1 = cols.c1
                
                c2.selectedColor = cols.c2
                i.C2 = cols.c2
                
                tc.selectedColor = cols.ct
                i.TextColor = cols.ct
            }
            //Save Dialogs
            private function createSave():void
            {
                var sw:TitleWindow = new TitleWindow()
                sw.showCloseButton = true
                addChild(sw)
                sw.addEventListener(MouseEvent.MOUSE_DOWN , function(e:Event):void{sw.startDrag()})
                sw.addEventListener(MouseEvent.MOUSE_UP , function(e:Event):void{sw.stopDrag()})
                sw.addEventListener(CloseEvent.CLOSE , function(e:Event):void{removeChild(sw)})
                sw.title = "Enter a file name"
                var t:Label = new Label()
                t.text = "File name(without the extension):"
                var ti:TextInput = new TextInput()
                ti.width = 200
                var cont:HBox = new HBox()
                var ok:Button = new Button()
                ok.label = "ok"
                ok.addEventListener(MouseEvent.CLICK , okClick)
                sw.addChild(t)
                sw.addChild(ti)
                sw.addChild(cont)
                cont.addChild(ok)
                function okClick (e:Event):void
                {
                    var fn:String = ti.text
                    var im:Array = new Array()
                    if(!exp)
                    {
                        im.push(new Container(new Bitmap(preview(265))))
                    }else
                    {
                        im.push(new Container(new Bitmap(preview(128))))
                        im.push(new Container(new Bitmap(preview(48))))
                        im.push(new Container(new Bitmap(preview(32))))
                        im.push(new Container(new Bitmap(preview(16))))
                    };
                    createPreview(im,fn)
                    removeChild(sw);
                }
                var cancel:Button = new Button()
                cancel.label = "cancel"
                cancel.addEventListener(MouseEvent.CLICK , cancelClick)
                cont.addChild(cancel)
                function cancelClick(e:Event):void
                {
                    removeChild(sw);
                }
            }
            private function createPreview(images:Array,outName:String):void
            {
                //window
                var sw:TitleWindow = new TitleWindow()
                sw.showCloseButton = true
                addChild(sw)
                sw.addEventListener(MouseEvent.MOUSE_DOWN , function(e:Event):void{sw.startDrag()})
                sw.addEventListener(MouseEvent.MOUSE_UP , function(e:Event):void{sw.stopDrag()})
                sw.addEventListener(CloseEvent.CLOSE , function(e:Event):void{removeChild(sw)})
                sw.title = "Preview"
                //container
                var cont:HBox = new HBox()
                sw.addChild(cont)
                //images
                for (var o:uint;o<images.length;o++)
                {
                    cont.addChild(images[o])
                }
                var bcont:HBox = new HBox()
                sw.addChild(bcont)
                //agree button
                var ok:Button = new Button()
                ok.label = "ok"
                ok.addEventListener(MouseEvent.CLICK , okClick)
                bcont.addChild(ok)
                function okClick(e:Event):void
                {
                    write(outName)
                    removeChild(sw);
                }
                var cancel:Button = new Button()
                cancel.label = "cancel"
                cancel.addEventListener(MouseEvent.CLICK , cancelClick)
                bcont.addChild(cancel)
                function cancelClick(e:Event):void
                {
                    removeChild(sw);
                }
            }
            private function save(name:String,size:uint):void
            {
                var f:File = new File(path + "/" + name)
                var fs:FileStream = new FileStream()
                fs.addEventListener(IOErrorEvent.IO_ERROR , error)
                fs.open(f , FileMode.WRITE)
                var tma:Matrix = new Matrix()
                tma.createBox(2,2)
                var tbd:BitmapData = new BitmapData(256,256)
                tbd.draw(i,tma,null,null,null,true)
                var bmp:Bitmap = new Bitmap(tbd,"auto",true)
                bmp.scaleX = size/256
                bmp.scaleY = size/256
                var ma:Matrix = new Matrix()
                ma.createBox(size/256,size/256)
                var bd:BitmapData = new BitmapData(size,size)
                bd.draw(bmp,ma,null,null,null,true)
                var ba:ByteArray = PNGEncoder.encode(bd)
                fs.writeBytes(ba)
                fs.close()
            }
            private function error(e:IOErrorEvent):void
            {
                //window
                var sw:TitleWindow = new TitleWindow()
                sw.showCloseButton = true
                addChild(sw)
                sw.addEventListener(MouseEvent.MOUSE_DOWN , function(e:Event):void{sw.startDrag()})
                sw.addEventListener(MouseEvent.MOUSE_UP , function(e:Event):void{sw.stopDrag()})
                sw.addEventListener(CloseEvent.CLOSE , function(e:Event):void{removeChild(sw)})
                sw.title = "Error"
                //Error Message
                var l:Text = new Text()
                l.text = "Error on writing the file , you might not have permision to write this file.\nError ID:" + e.errorID + "\nDescription:" + e.text
                sw.addChild(l)
                //container
                var cont:HBox = new HBox()
                sw.addChild(cont)
                //agree button
                var ok:Button = new Button()
                ok.label = "ok"
                ok.addEventListener(MouseEvent.CLICK , okClick)
                cont.addChild(ok)
                function okClick(e:Event):void
                {
                    removeChild(sw);
                }
            }
            private function preview(size:uint):BitmapData
            {
                var tma:Matrix = new Matrix()
                tma.createBox(2,2)
                var tbd:BitmapData = new BitmapData(256,256)
                tbd.draw(i,tma,null,null,null,true)
                var bmp:Bitmap = new Bitmap(tbd,"auto",true)
                bmp.scaleX = size/256
                bmp.scaleY = size/256
                var ma:Matrix = new Matrix()
                ma.createBox(size/256,size/256)
                var bd:BitmapData = new BitmapData(size,size)
                bd.draw(bmp,ma,null,null,null,true)
                return bd
            }
            private function write(fn:String):void
            {
                if(!exp)
                {
                    save(fn+".png",265)
                }else
                {
                    save(fn+"-128x128.png",128)
                    save(fn+"-48x48.png",48)
                    save(fn+"-32x32.png",32)
                    save(fn+"-16x16.png",16)
                    exp = false
                }
            }
            private function generateColors(rgb:uint):Object
            {
                var prop:Object = new Object()
                
                var cols:Object = hex24torgb(rgb)
                var hsbs:Object = rgbtohsb(cols.red,cols.green,cols.blue)
                
                var c1rgb:Object = hsbtorgb(hsbs.hue,hsbs.saturation,hsbs.brightness*1.45)
                var c1:uint = rgbtohex24(c1rgb.red,c1rgb.green,c1rgb.blue)
                
                var c2rgb:Object = hsbtorgb(hsbs.hue,hsbs.saturation,hsbs.brightness*.55)
                var c2:uint = rgbtohex24(c2rgb.red,c2rgb.green,c2rgb.blue)

                var ctrgb:Object = hsbtorgb(hsbs.hue,hsbs.saturation,hsbs.brightness-hsbs.brightness*.55)
                var ct:uint = rgbtohex24(ctrgb.red,ctrgb.green,ctrgb.blue)
                
                prop = {
                    c1:c1
                    ,c2:c2
                    ,ct:ct
                }
                return prop
            }
            public static function rgbtohsb(red:Number,green:Number,blue:Number):Object
    {
        var min:Number=Math.min(Math.min(red,green),blue)
        var brightness:Number=Math.max(Math.max(red,green),blue)
        var delta:Number=brightness-min
        var saturation:Number=(brightness == 0) ? 0 : delta/brightness
        var hue:Number
        if(saturation == 0)
        {
            hue=0
        }
        else
        {
            if(red == brightness)
            {
                hue=(60*(green-blue))/delta
            }
            else if(green == brightness)
            {
                hue=120+(60*(blue-red))/delta
            }
            else
            {
                hue=240+(60*(red-green))/delta
            }
            if(hue<0) hue+=360
        }
        saturation*=100
        brightness=(brightness/255)*100
        return {hue:hue,saturation:saturation,brightness:brightness}
    }
        public static function hsbtorgb(hue:Number,saturation:Number,brightness:Number):Object
    {
        
        if(hue > 360)
        {
            hue -=360
        }
        if(saturation > 100)
        {
            saturation = 100
        }
        if(brightness > 100)
        {
            brightness = 100
        }
        var red:Number, green:Number, blue:Number
        hue%=360;
        if(brightness==0)
        {
            return {red:0, green:0, blue:0}
        }
        saturation/=100;
        brightness/=100;
        hue/=60;
        var o:Number = Math.floor(hue);
        var f:Number = hue-o;
        var p:Number = brightness*(1-saturation);
        var q:Number = brightness*(1-(saturation*f));
        var t:Number = brightness*(1-(saturation*(1-f)));
        switch(o)
        {
            case 0:
            
                red=brightness; green=t; blue=p;
                break;
            
            case 1:
            
                red=q; green=brightness; blue=p;
                break;
                
            case 2:
            
                red=p; green=brightness; blue=t;
                break;
                
            case 3:
            
                red=p; green=q; blue=brightness;
                break;
                
            case 4:
            
                red=t; green=p; blue=brightness;
                break;
                
            case 5:
            
                red=brightness; green=p; blue=q;
                break;
        }
        red=Math.round(red*255)
        green=Math.round(green*255)
        blue=Math.round(blue*255)
        return {red:red, green:green, blue:blue}
    }
    public static function hex24torgb(color:Number):Object
    {
        var r:Number=color >> 16 & 0xff
        var g:Number=color >> 8 & 0xFF
        var b:Number=color & 0xFF
        return {red:r,green:g,blue:b}
    }
    public static function rgbtohex24(red:Number,green:Number,blue:Number):Number
    {
        return (red<<16 | green<<8 | blue)
    }
        ]]>
    </mx:Script>
    <mx:Grid width="100%" height="100%">
        <mx:GridRow width="100%" height="100%">
            <mx:GridItem width="100%" height="100%">
                <mx:VBox width="100%" height="100%">
                    <mx:Label text="Properties" styleName="MainTitle" color="#00809C"/>
                    <mx:Label text="Background Gradient" styleName="MiddleTile"/>
                    <mx:HBox width="100%" height="28">
                        <mx:Label text="First Color:"/>
                        <mx:ColorPicker id="c1"/>
                    </mx:HBox>
                    <mx:HBox width="100%" height="28">
                        <mx:Label text="Second Color:"/>
                        <mx:ColorPicker id="c2"/>
                    </mx:HBox>
                    <mx:HRule width="100%"/>
                    <mx:Label text="Text" color="#046377"/>
                    <mx:HBox width="100%">
                        <mx:Label text="Text Color:"/>
                        <mx:ColorPicker id="tc"/>
                    </mx:HBox>
                    <mx:HBox width="100%">
                        <mx:Label text="Program Name:"/>
                        <mx:TextInput id="pn" width="100%" text="Quick Icon"/>
                    </mx:HBox>
                    <mx:HBox width="100%">
                        <mx:Label text="Text(4 chars max):"/>
                        <mx:TextInput id="tx" maxChars="4" width="100%" text="Qi"/>
                    </mx:HBox>
                    <mx:HBox width="100%">
                        <mx:Label text="Font Size:"/>
                        <mx:HSlider id="fs" width="100%" minimum="60" maximum="120" enabled="true" liveDragging="true" allowTrackClick="true" value="100"/>
                    </mx:HBox>
                    <mx:HRule width="100%"/>
                    <mx:HBox width="100%" horizontalGap="8" verticalAlign="middle" horizontalAlign="left">
                        <mx:Label text="Auto colorization color:"/>
                        <mx:ColorPicker id="acc"/>
                    </mx:HBox>
                    <mx:HBox width="100%">
                        <mx:Button label="Auto colorize" labelPlacement="left" id="ec" enabled="true"/>
                    </mx:HBox>
                </mx:VBox>
            </mx:GridItem>
            <mx:GridItem>
                <mx:VBox width="100%" height="100%">
                <mx:Panel layout="absolute" title="Preview" color="#00809C" fontSize="14" fontWeight="bold" fontFamily="Arial">
                    <mx:Canvas width="256" height="256" id="da">
                    </mx:Canvas>
                </mx:Panel>
                <mx:HBox width="100%" height="100%">
                    <mx:Text id="ab" width="100%">
                        <mx:text>Developed By Toki Zeus Ralad.Free for download, edit and redistribute.By editing or redistributing maintain Credits. I'm not responsable by any resoults of you creations.Respect Adobe registered Logos.Bugs/sugestions : tokizr@gmail.com</mx:text>
                    </mx:Text>
                </mx:HBox>
                <mx:HBox width="100%" horizontalGap="6" horizontalAlign="right" verticalAlign="middle">
                    <mx:Button label="Save" labelPlacement="left" id="savebt" enabled="true"/>
                    <mx:Button label="Export For AIR" labelPlacement="left" id="efa" enabled="true"/>
                </mx:HBox>
                </mx:VBox>
            </mx:GridItem>
        </mx:GridRow>
    </mx:Grid>
    <mx:Style source="MainTitle.css"/>
    <mx:Style source="MiddleTitle.css"/>
</mx:WindowedApplication>