package com.zehfernando.utils {

	import flash.display.DisplayObjectContainer;
	import flash.display.LoaderInfo;
	import flash.display.Stage;
	import flash.display.StageDisplayState;
	import flash.system.Capabilities;
	import flash.ui.ContextMenu;

	/**
	 * @author Zeh Fernando - z at zeh.com.br
	 */
	public class AppUtils {

		protected static var stage:Stage;
		protected static var root:DisplayObjectContainer;
		protected static var hasDeterminedDebugStatus:Boolean;
		protected static var _isDebuggingSWF:Boolean;

		public function AppUtils() {
		}

		// ================================================================================================================
		// STATIC functions -----------------------------------------------------------------------------------------------

		public static function init(__stage:Stage, __root:DisplayObjectContainer): void {
			stage = __stage;
			root = __root;
		}
		
		public static function getStage(): Stage {
			return stage;
		}
		
		public static function getRoot():DisplayObjectContainer {
			return root;
		}

		public static function getStackTrace(): String {
			var stackTrace:String = "";
			try {
				throw new Error("Stack trace");
			} catch (e:Error) {
				stackTrace = e.getStackTrace();
			}
			
			return stackTrace;
		}

		
		public static function getFlashVar(__parameter:String): String {
			return LoaderInfo(root.loaderInfo).parameters[__parameter];
		}

		// localFileReadDisable
		// hasPrinting
		// avHardwareDisable
		// hasAudio
		// language - en, pt
		// manufacturer - "Adobe Windows"
		// os - "Windows XP"
		// version
		// screenResolutionX
		// playerType

		public static function isMac(): Boolean {
			return Capabilities.os == "MacOS" || Capabilities.os.substr(0, 6) == "Mac OS";
		}

		public static function isLinux(): Boolean {
			return Capabilities.os == "Linux";
		}
		
		public static function isWindows(): Boolean {
			//return Capabilities.os == "Windows" || Capabilities.os == "Windows 7" || Capabilities.os == "Windows XP" || Capabilities.os == "Windows 2000" || Capabilities.os == "Windows 98/ME" || Capabilities.os == "Windows 95" || Capabilities.os == "Windows CE"; 
			//return Capabilities.os == "Windows" || Capabilities.os == "Windows 7" || Capabilities.os == "Windows XP" || Capabilities.os == "Windows 2000" || Capabilities.os == "Windows 98/ME" || Capabilities.os == "Windows 95" || Capabilities.os == "Windows CE"; 
			return Capabilities.manufacturer == "Adobe Windows";
		}

		public static function isAndroid(): Boolean {
			return Capabilities.manufacturer == "Android Linux";
		}

		public static function isStandalone(): Boolean {
			return Capabilities.playerType == "Desktop";
		}

		/**
		 * Tells whether this is being tested (ran on the IDE Flash player), or not.
		 * @return	TRUE if this is a test execution, false if otherwise.
		 */
		public static function isTesting(): Boolean {
			return Capabilities.playerType == "External";
		}
		
		public static function isDebugSWF(): Boolean {
			// Whether the SWF is compiled for debugging or not
			// http://michaelvandaniker.com/blog/2008/11/25/how-to-check-debug-swf/
			
		    if (!hasDeterminedDebugStatus) {
                var stackTrace:String = new Error().getStackTrace();
                _isDebuggingSWF = stackTrace != null && stackTrace.indexOf("[") != -1;
                hasDeterminedDebugStatus = true;
            }
            return _isDebuggingSWF;
        }

		// Userlayer stuff
		public static function resetContextMenu(): void {
			// Clears the menu
			root.contextMenu = new ContextMenu();
			root.contextMenu.hideBuiltInItems();

			//var mi:ContextMenuItem = new ContextMenuItem("Toggle Fullscreen");
			//mi.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, toggleFullScreen);
			//root.contextMenu.customItems.push(mi);
		}
		
		public static function toggleFullScreen(): void {
			setFullScreen(stage.displayState == StageDisplayState.NORMAL);
		}
		
		public static function setFullScreen(__fullScreen:Boolean): void {
			stage.displayState = __fullScreen ? StageDisplayState.FULL_SCREEN : StageDisplayState.NORMAL;
		}

		public static function isFullScreen(): Boolean {
			return stage.displayState == StageDisplayState.FULL_SCREEN;
		}

		/*
		public static function addDebugBoxes(): void {
			// Creates debug items
			var di:DebugDisplayItem;
			di = new DebugDisplayItemFPS();
			stage.addChild(di);
			
			di = new DebugDisplayItemMemory();
			di.y = 29;
			stage.addChild(di);

			di = new DebugDisplayItemFPS();
			di.setUpdateRate(1);
			di.y = 59;
			stage.addChild(di);
		}
		*/
	}
}