<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" viewSourceURL="srcview/index.html">
    
    <mx:Script>
        <![CDATA[
        
            //ALL THIS CRAP ASS PROTOTYPE CODE BY SAKRI.NET ENJOY!
        
            import mx.events.ItemClickEvent;
            import mx.controls.Alert;
            import flash.text.TextField;
            import flash.text.TextFormat;
            import flash.geom.Rectangle;
            
            public static var COMMENT_NONE:String="comment_none";
            public static var COMMENT_BLOCK:String="comment_block";
            public static var COMMENT_LINE:String="comment_line";
            
            private var _generated_text_field:TextField;
            private var _comment_style:String="comment_none";
            
            
            //THE MONSTER FUNCTION!!!!! REFACTOR IT YOURSELF BIATCH ;)
            private function renderText():void{                
                var scale_multiplier:Number=Math.round(font_size_slider.value);

                //CREATE SAMPLE TEXT FIELD, TAKE A SNAPSHOT OF IT
                _generated_text_field=createSampleTextField();
                temp_uic.addChild(_generated_text_field);
                var bounds:Rectangle=temp_uic.getBounds(_generated_text_field);
                
                //FAILSAFE THAT BITMAP ISN'T TOO BIG...
                if(bounds.width*scale_multiplier>2880 || bounds.height*scale_multiplier>2880){
                    mx.controls.Alert.show("You ask too much... \npoor flashplayer can only handle images smaller than 2880*2880\n either shorten your comment text, or shrink the size slider, \nor call the flashplayer team and beg them to increase this limitation :)");
                    temp_uic.removeChild(_generated_text_field);
                    return;
                }
                var bmd:BitmapData=new BitmapData(bounds.width*scale_multiplier,bounds.height*scale_multiplier,true,0);
                var scale_matrix:Matrix=new Matrix();
                scale_matrix.scale(scale_multiplier,scale_multiplier);
                bmd.draw(temp_uic,scale_matrix);
                
                /*
                var preview:Bitmap=new Bitmap(bmd);
                preview.alpha=.5;
                temp_uic.addChild(preview);
                */
                var i:uint=0;
                var lines:Array=new Array();
                var line_ys:Array=new Array();
                huge_text.text="";
                
                var output_text:TextField=createRenderTextField(bmd.width+100,bmd.height+100);//100 is arbitrary failsafe
                output_text.text="W";//just a random character
                
                var mono_char_width:Number=output_text.getCharBoundaries(0).width;
                var mono_char_height:Number=output_text.getCharBoundaries(0).height;
                
                //CREATE ARRAYS OF STRINGS AND MEASURE LINE HEIGHTS
                output_text.text=String(output_text.getCharBoundaries(0).y);
                while(output_text.getCharBoundaries(output_text.text.length-1).y < bmd.height){
                    lines[i]="";
                    line_ys[i]=output_text.getCharBoundaries(output_text.text.length-1).y;
                    output_text.appendText("\nW");
                    if(i==100)break;
                    i++;
                }
                
                //LOOP THROUGH CHARACTER POSITIONS IN SAMPLE TEXT FIELD, TEST POSITIONS AGAINST PIXELS IN SNAPSHOT
                var xindex:uint=0;
                var j:uint=0;
                var add_char:String;
                while(xindex<bmd.width){
                    for(j=0;j<lines.length;j++){
                        if(bmd.getPixel32(xindex,line_ys[j])==0x00000000){
                            //trace(xindex*scale_multiplier+","+line_ys[j]*scale_multiplier);
                            bmd.setPixel32(xindex,line_ys[j],0xFFFF0000);
                            lines[j]+=" ";//empty space
                        }else{
                            //trace("booh");
                            add_char=_generated_text_field.text.charAt(_generated_text_field.getCharIndexAtPoint(xindex/scale_multiplier,5));//the y is arbitrary
                            if(add_char==" ")add_char="*";//should probably grab adjacent character
                            lines[j]+=add_char;
                        }
                    }
                    
                    xindex+=mono_char_width;
                }
                lines=removeWhiteSpaceLines(lines);
                lines=addCommentStyle(lines);
                huge_text.text=lines.join("\n");
                temp_uic.removeChild(_generated_text_field);                
            }
            
            private function removeWhiteSpaceLines(lines:Array):Array{
                var fixed:Array=new Array();
                var i:uint,j:uint;
                for(i=0;i<lines.length;i++){
                    inner: for(j=0;j<lines[i].length;j++){
                        if(String(lines[i]).charAt(j)!=" "){
                            fixed.push(lines[i]);
                            break inner;
                        }
                    }
                }
                return fixed;
            }
            
            private function createSampleTextField():TextField{
                var tf:TextField=new TextField();
                tf.autoSize="left";
                tf.text=text_to_create.text;
                tf.selectable=false;
                var tformat:TextFormat=new TextFormat();
                tformat.bold=true;
                //tformat.size=font_size_slider.value;
                tformat.size=12;
                tformat.font=fonts_list.selectedLabel;
                tf.setTextFormat(tformat);
                return tf;
            }
            
            private function createRenderTextField(w:uint,h:uint):TextField{
                var tf:TextField=new TextField();
                tf.multiline=true;
                tf.width=w;
                tf.height=h;
                var tformat:TextFormat=new TextFormat();
                tformat.size=12;
                tformat.color=0xBBBBBB;
                tformat.font="Courier";
                tf.setTextFormat(tformat);
                return tf;
            }
            
            private function addCommentStyle(lines:Array):Array{
                switch(_comment_style){
                    case COMMENT_NONE:
                        break;
                    case COMMENT_LINE:
                        for(var i:uint=0;i<lines.length;i++){
                            lines[i]="//"+lines[i];
                        }
                        break;
                    case COMMENT_BLOCK:
                        lines.unshift("/*");
                        lines.push("*/");
                        break;
                }
                return lines.slice();
            }
            
            private function handleCommentStyle(e:ItemClickEvent):void{
                switch(e.index){
                    case 0:
                        this._comment_style=COMMENT_NONE;
                        break;
                    case 1:
                        this._comment_style=COMMENT_LINE;
                        break;
                    case 2:
                        this._comment_style=COMMENT_BLOCK;
                        break;
                }
            }
            
        ]]>
    </mx:Script>


    <mx:Style>

/*
    Yes, I even spent 5 minutes using the sytle explorer to enhance your experience!?
*/
        
Application {
   backgroundColor: #000000;
   backgroundGradientColors: #666666, #000000;
   themeColor: #cc0000;
}    
        
    </mx:Style>
    
    <mx:Panel width="90%" height="90%" horizontalCenter="0" title="the huge text generator"  y="50">
        <mx:HBox horizontalAlign="center" paddingTop="20">

            <mx:ComboBox id="fonts_list" dataProvider="{flash.text.Font.enumerateFonts(true)}" labelField="fontName" />

            <mx:Label text="size:" fontSize="14" fontWeight="bold" />            
            <mx:HSlider id="font_size_slider" minimum="12" maximum="100" value="18" />
            
            <mx:TextInput id="text_to_create" text="ROCK ON!?@#" width="200" fontSize="14" fontWeight="bold" />
            <mx:Button label="Render it baby!" click="renderText();" />
            
        <mx:ButtonBar itemClick="handleCommentStyle(event);">
            <mx:dataProvider>
                <mx:Array>
                    <mx:String>None</mx:String>
                    <mx:String>//</mx:String>
                    <mx:String>/*  */</mx:String>
                </mx:Array>
            </mx:dataProvider>
        </mx:ButtonBar>

        </mx:HBox>
        <mx:Canvas width="100%" height="100%" >
            <mx:UIComponent id="temp_uic" />
            <mx:TextArea width="100%" height="100%" id="huge_text" fontSize="12" fontFamily="Courier" backgroundAlpha="0"  wordWrap="false" />            
        </mx:Canvas>
    </mx:Panel>
    
</mx:Application>