AIRアプリで、iknowの問題を次から次へと表示します。

半透明ウィンドウでやりたいなぁ思ってて、
何がいいか悩んだのですが結果的にAIRで作りました。
このアプリを適当に起動してボーっと眺めてるだけで
少しは英語を覚えられたらいいなぁ思います。

package {
    import flash.events.*;
    import flash.display.*;
    import flash.text.*;
	import flash.net.*;
//	import flash.utils.*;
	import flash.filters.DropShadowFilter;
	import flash.media.Sound;
	import flash.geom.Matrix;
    public class iknowView extends Sprite {

		private var tf:TextField;
		private var tf2:TextField;
		private var username:String= "h_sakurai";
		private var txt_fmt:TextFormat = new TextFormat();
		private var txt_fmt2:TextFormat = new TextFormat();
		private var loader:Loader=new Loader();
		private function onMoveCommand(event:MouseEvent):void{
	        stage.nativeWindow.startMove();
	    }

        public function iknowView() {
			this.y = 10;
			var matrix:Matrix = new Matrix();
			matrix.createGradientBox(300, 50, 0, 0, 0);
			graphics.lineStyle(3, 0xff0000,0);


//			graphics.beginFill(0xff0000,0.3);
			graphics.beginGradientFill( GradientType.LINEAR, [0x115500, 0x115500], [0.6, 0], [0, 255], matrix);
			graphics.drawRoundRect(20, 2, 300, 48, 10);
			graphics.endFill();

			graphics.beginGradientFill( GradientType.LINEAR, [0xddff00, 0xddff00], [0.8, 0], [0, 255], matrix);
			graphics.drawRoundRect(18, 0, 300, 20, 10);
			graphics.endFill();

        	this.alpha = 0.95;
        	stage.nativeWindow.alwaysInFront=true;
			stage.nativeWindow.x = 0;
			stage.nativeWindow.y = 0;
			stage.addEventListener(MouseEvent.MOUSE_DOWN, onMoveCommand);
        	tf = new TextField();
        	tf.filters = [new DropShadowFilter(1, 45, 0x0, 1, 4, 4, 5, 1, false, false, false)];
        	tf.x = 20;
        	tf.y = 17;
        	tf.width = 800;
        	tf.height = 300;
        	tf.selectable = false;
//			txt_fmt.underline = true;
			txt_fmt.size = 30;
			txt_fmt.color = 0xffffff;

        	tf2 = new TextField();
        	tf2.x = 20;
        	tf2.filters = [new DropShadowFilter(1, 45, 0x446600, 1, 4, 4, 5, 1, false, false, false)];
        	tf2.width = 800;
        	tf2.height = 300;
        	tf2.selectable = false;
			txt_fmt2.underline = true;
			txt_fmt2.size = 12;
			txt_fmt2.color = 0xffffff;

			loader.x = 30;
        	loader.filters = [new DropShadowFilter(6, 45, 0x000000, 0.8, 16, 16, 1, 1, false, false, false)];
			loader.rotation = -5;
			loader.y = 50;
			loader.scaleX = 0.25;
			loader.scaleY = 0.25;
			addChild(loader);
        	addChild(tf);
        	addChild(tf2);
        	sita = 0;
        	addEventListener(Event.ENTER_FRAME, enterFrame);
			text("iknow view");
			f();
        }
		private function enterFrame(eventObj:Event):void {
		    // 処理
		    loader.alpha = (-Math.cos(sita)+8)/9;
		    sita += 0.05;
		    loader.scaleX = loader.scaleY = (-Math.cos(sita)+8)/9 *0.30;
		}
		private var sita:Number;
        private var pos:int;
        private var listPos:int;
        private var listXML:XML;
        private var listArray:Array;
        private var posArray:Array;
        
        private var xml:XML;
        private function text(s:String):void {
        	tf.text = s;
			tf.setTextFormat(txt_fmt);
        }
        private function text2(s:String):void {
        	tf2.text = s;
			tf2.setTextFormat(txt_fmt2);
        }
        private function img(s:String):void {
        	if(s==""){
        		loader.visible =false;
        		return;
        	}
        	sita = 0;
        	trace(s);
			loader.load(new URLRequest(s));
        	loader.visible = true;
        }
        private function play(s:String):void {
        	if(s=="") return;
			var sound:Sound = new Sound();
			sound.load(new URLRequest(s));
			sound.play();
        }
        private function f():void {
        	var tt:TextField = tf;
        	new Commands(
        		function(event:Object):void {
            		text(event.toString());
				}
			).load(
				"http://api.iknow.co.jp/lists.xml",
//	    		"http://api.iknow.co.jp/users/"+username+"/lists.xml?per_page=100",
	    		function(data:Object):void {
//	    			listPos = 0;
					listXML = XML(data);
	    			listArray = [];
	    		}
			).label(
				"start"
			).load(
	    		function():String{
	    			if(listArray.length == 0)
		    			for(var i:int=0;i<listXML.list.length();i++) {
		    				listArray.push(i);
		    			}
					var listP:int = int(Math.random() * listArray.length);
	    			var listPos:int = listArray[listP];
	    			listArray.splice(listP,1);
	  				var id:String = listXML.list[listPos].@id.toString();
					id = id.replace(/^[^0-9]+/,"");
					var item_count:String = listXML.list[listPos].@item_count.toString();
					text2(listXML.list[listPos].name[0].toString());
	    			return "http://api.iknow.co.jp/lists/"+id+"/items.xml?include_sentences=false&per_page="+item_count;},
	    		function(data:Object):void {
					xml = XML(data);
					posArray = [];
	    			for(var i:int=0;i<xml.items[0].item.length();i++) {
	    				posArray.push(i);
	    			}
	    		}
			).label(
				"loop"
			).run(
				function():String {
					var p:int = int(Math.random() * posArray.length);
	    			var pos:int = posArray[p];
					trace("pos="+pos+" len="+posArray.length);
	    			posArray.splice(p, 1);
					var item:XML = xml.items[0].item[pos];
					var english:String = item.cue[0].text[0].toString();
					var japanese:String = item.responses[0].response[0].text[0].toString();
					text(pos+". "+english + ":"+japanese);
					try {
						play(item.cue[0].sound.toString());
					} catch (o:Object) {
					
					}
					try {
						img(item.sentences.sentence.image[0].toString());
					} catch (o:Object){
		        		loader.visible =false;
						
					}
					return null;
				}
    		).sleep(
    			10000
    		).run(
				function():String {
					if(posArray.length == 0) {
						return "start";
					}
					return "loop";
				}
    		)
    		.exec();
		}
    }
}

import flash.net.*;
import flash.events.*;
import flash.utils.*;

class Commands {
	private var loader:URLLoader = new URLLoader();
	private var pos:int;
	private var labels:Object = {};
	private var timer:Timer;
	public function Commands(errorFunction:Function) {
		pos = 0;
		errFun = errorFunction;
		loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
		loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
		loader.addEventListener(Event.COMPLETE, completeHandler);
//		errFun("new commands");
	}
	private var array:Array = new Array();
	private var errFun:Function;
	public function load(url:Object, fun:Function):Commands {
		//errFun("load");
		array.push("load");
		array.push(url);
		array.push(fun);
		return this;
	}

	public function run(fun:Function):Commands {
		array.push("run");
		array.push(fun);
		return this;
	}
	public function sleep(time:int):Commands {
		array.push("sleep");
		array.push(time);
		return this;
	}
	public function label(name:String):Commands {
		array.push("label");
		array.push(name);
		return this;
	}
	public function exec():Commands {
		for(;pos<array.length;){
//			errFun("exec "+array[pos]);
			var cmd:String = array[pos++];
			switch(cmd) {
				case "load":{
					var obj:Object = array[pos++];
					var url:String;
					if(obj is String) url = String(obj);
					else {
						url = obj();
					}
					//errFun("url="+url);
			        var request:URLRequest = new URLRequest(url);
			        try {
						loader.load(request);
			        } catch (error:Error) {
			        	errFun(error);
			        }
			        break;
			    }
			    case "run": {
			    	//errFun("run:"+pos+":"+ array[pos]);
		    		var next:Object = array[pos++];
			    	//errFun("nextfun:"+next);
			    	var nexts:String = next();
			    	//errFun("next:"+nexts);
			    	
		    		if(nexts != null) {
		    			pos = labels[nexts];
		    			//errFun("jmp"+pos);
		    		}
//		    		errFun("run"+pos+" len="+array.length);
		    		continue;
		    	}
			    case "label": {
		    		var label:String = array[pos++];
		    		labels[label] = pos;
//		    		errFun("labels["+label+"]="+pos);
		    		continue;
		    		break;
		    	}
			    case "sleep": {
		    		var time:int = array[pos++];
//			    	errFun("sleep"+time);
					var timer:Timer = new Timer(time, 1);
					timer.addEventListener( TimerEvent.TIMER, onTick );
					timer.start();
					
		    		break;
		    	}
		    }
		    break;
		}
		return this;
	}
    private function completeHandler(event:Event):void {
    	var fun:Function = array[pos++];
    	fun(loader.data);
    	exec();
    }
    private function errorHandler(event:Event):void {
		errFun(event);
    }
	private function onTick(e:TimerEvent):void {
		//errFun("onTick "+pos);
		exec();
	}
}