package com.guru.component.screen
{
	import caurina.transitions.Tweener;
	import com.guru.call.FunctionCall;
	import com.guru.call.ICall;
	import com.guru.component.lang.LangModel;
	import com.guru.component.message.Message;
	import com.guru.component.panel.Panel;
	import com.guru.component.panel.StatusBar;
	import com.guru.utils.Delegate;
	import flash.display.MovieClip;
	import flash.display.Stage;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.geom.Point;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class ScreenManager
	{
		public static var DURATION:Number = 30;
		public static var USE_FRAME:Boolean = true;
		
		private static var sInstance:ScreenManager;
		
		public static function init(pStage:Stage):void
		{
			if(!sInstance)
				sInstance = new ScreenManager(pStage);
		}
		
		public static function getInstance():ScreenManager
		{
			return sInstance;
		}
		
		private var mStage:Stage;
		private var mResizeCall_array:Array;
		private var mId_num:Number;
		private var mStageDimension_array:Array = [760, 500];
		private var mStageMinimumDimension_array:Array = [640, 480];
		private var mDimensionWarning_bol:Boolean;
		
		public function ScreenManager(pStage:Stage)
		{
			mStage = pStage;
			mStage.align = StageAlign.TOP_LEFT;
			mResizeCall_array = new Array();
			mDimensionWarning_bol = false;
			mId_num = 0;
			mStage.addEventListener(Event.RESIZE, onResizeHandler);
		}
		
		public function getBorderWidthThickness():Number
		{
			return getScreenWidth() - getStageWidth();
		}
		
		public function getBorderHeightThickness():Number
		{
			return getScreenHeight() - getStageHeight();
		}
		
		public function getStageWidth():Number
		{
			return mStageDimension_array[0];
		}
		
		public function getStageHeight():Number
		{
			return mStageDimension_array[1];
		}
		
		public function getMinimumScreenWidth():Number
		{
			return mStageMinimumDimension_array[0];
		}
		
		public function getMinimumScreenHeight():Number
		{
			return mStageMinimumDimension_array[1];
		}
		
		public function getScreenWidth():Number
		{
			//return Math.max(mStageMinimumDimension_array[0], mStage.stageWidth);
			return mStage.stageWidth;
		}
		
		public function getScreenHeight():Number
		{
			//return Math.max(mStageMinimumDimension_array[1], mStage.stageHeight);
			return mStage.stageHeight;
		}
		
		public function removeResizeCall(pId_num:Number):void
		{
			delete mResizeCall_array["call" + pId_num];
		}
		
		public function tweenMcTo(pTarget_mc:MovieClip, pX_num:Number = NaN, pY_num:Number = NaN, pWidth_num:Number = NaN, pHeight_num:Number = NaN, pScaleX_num:Number = NaN, pScaleY_num:Number = NaN, pAlpha_num:Number = NaN, pTime_num:Number = NaN, pDoneCall:ICall = null):void
		{
			var tween_obj:Object = new Object();
			
			if (!isNaN(pX_num))
				tween_obj["x"] = pX_num;
				
			if (!isNaN(pY_num))
				tween_obj["y"] = pY_num;
				
			if (!isNaN(pWidth_num))
				tween_obj["width"] = pWidth_num;
				
			if (!isNaN(pHeight_num))
				tween_obj["height"] = pHeight_num;
				
			if (!isNaN(pScaleX_num))
				tween_obj["scaleX"] = pScaleX_num;
				
			if (!isNaN(pScaleY_num))
				tween_obj["scaleY"] = pScaleY_num;
			
			if (!isNaN(pAlpha_num))
				tween_obj["alpha"] = pAlpha_num;
				
			if (isNaN(pTime_num))
				pTime_num = DURATION
			
			tween_obj["time"] = pTime_num;
			tween_obj["useFrames"] = USE_FRAME;
			tween_obj["onComplete"] = new Delegate(this, onTweenMcComplete, pDoneCall).getFunction();
			
			Tweener.addTween(pTarget_mc,tween_obj);
		}
		
		private function onTweenMcComplete(e:*, pDoneCall:ICall = null):void
		{
			if (pDoneCall)
				pDoneCall.execute();
		}
		
		public function addResizeCall(pCall:ICall):Number
		{
			mResizeCall_array["call" + mId_num] = pCall;
			pCall.execute();
			return mId_num++;
		}
		
		private function onResizeHandler(e:Event):void
		{
			for (var i in mResizeCall_array)
			{
				mResizeCall_array[i].execute();
			}
		}
	}

}