Adding MobileAlert component to quetwo's whiteboard for the Flex Incubator project.

git-svn-id: https://svn.apache.org/repos/asf/incubator/flex/whiteboard@1301332 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/quetwo/MobileAlert/README.txt b/quetwo/MobileAlert/README.txt
new file mode 100644
index 0000000..8207fe6
--- /dev/null
+++ b/quetwo/MobileAlert/README.txt
@@ -0,0 +1,37 @@
+////////////////////////////////////////////////////////////////////////////////

+//

+//  Licensed to the Apache Software Foundation (ASF) under one or more

+//  contributor license agreements.  See the NOTICE file distributed with

+//  this work for additional information regarding copyright ownership.

+//  The ASF licenses this file to You under the Apache License, Version 2.0

+//  (the "License"); you may not use this file except in compliance with

+//  the License.  You may obtain a copy of the License at

+//

+//      http://www.apache.org/licenses/LICENSE-2.0

+//

+//  Unless required by applicable law or agreed to in writing, software

+//  distributed under the License is distributed on an "AS IS" BASIS,

+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+//  See the License for the specific language governing permissions and

+//  limitations under the License.

+//

+////////////////////////////////////////////////////////////////////////////////

+

+Component contributed by Nick Kwiatkowski (quetwo@apache.org)

+

+Mobile Spark Alert Dialog Box (org.apache.skark.components.Alert)

+

+Usage of this component is very similar to the mx.controls.Alert, in that you use the static

+MobileAlert.show() method to launch a new alert dialog box.  The usage of the show method is

+identical to the mx component, with the following exception :

+  - The final parameter of the mx component (moduleFactory:IFlexModuleFactory) is not available.

+  - The new final parameter of this component is the replacement skin that you wish to use.  

+  

+If you use this in other locales other than en_US, you will need to add the proper resource bundles.

+

+3/15/2012 Notes :

+  - iOS Skin was not included.  It will be during a later push

+  - Android Skin needs some touching in order to make it look right on all dpi's

+  - Need to add a buttonSkin for the OK/Cancel/YES/NO buttons.  Some properties are hard-coded right now.

+  

+   
\ No newline at end of file
diff --git a/quetwo/MobileAlert/locale/en_US/MobileAlert.properties b/quetwo/MobileAlert/locale/en_US/MobileAlert.properties
new file mode 100644
index 0000000..d63d821
--- /dev/null
+++ b/quetwo/MobileAlert/locale/en_US/MobileAlert.properties
@@ -0,0 +1,4 @@
+OkLabel = Ok

+CancelLabel = Cancel

+YesLabel = Yes

+NoLabel =  No
\ No newline at end of file
diff --git a/quetwo/MobileAlert/src/org/apache/spark/components/MobileAlert.as b/quetwo/MobileAlert/src/org/apache/spark/components/MobileAlert.as
new file mode 100644
index 0000000..9ffbaba
--- /dev/null
+++ b/quetwo/MobileAlert/src/org/apache/spark/components/MobileAlert.as
@@ -0,0 +1,602 @@
+////////////////////////////////////////////////////////////////////////////////

+//

+//  Licensed to the Apache Software Foundation (ASF) under one or more

+//  contributor license agreements.  See the NOTICE file distributed with

+//  this work for additional information regarding copyright ownership.

+//  The ASF licenses this file to You under the Apache License, Version 2.0

+//  (the "License"); you may not use this file except in compliance with

+//  the License.  You may obtain a copy of the License at

+//

+//      http://www.apache.org/licenses/LICENSE-2.0

+//

+//  Unless required by applicable law or agreed to in writing, software

+//  distributed under the License is distributed on an "AS IS" BASIS,

+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+//  See the License for the specific language governing permissions and

+//  limitations under the License.

+//

+////////////////////////////////////////////////////////////////////////////////

+

+package org.apache.spark.components

+{

+	import flash.display.Sprite;

+	import flash.events.KeyboardEvent;

+	import flash.events.MouseEvent;

+	import flash.system.Capabilities;

+	import flash.ui.Keyboard;

+	

+	import mx.core.FlexGlobals;

+	import mx.events.CloseEvent;

+	import mx.managers.ISystemManager;

+	import mx.resources.ResourceManager;

+	

+	import org.apache.spark.components.skins.AndroidAlertSkin;

+	

+	import spark.components.Button;

+	import spark.components.Group;

+	import spark.components.Image;

+	import spark.components.SkinnablePopUpContainer;

+	import spark.core.IDisplayText;

+	

+	

+	//-------------------------------------------

+	// Metadata Required for the Resource Bundle

+	//-------------------------------------------

+	[ResourceBundle("MobileAlert")]

+	

+	

+	//-------------------------------------------

+	// Metadata required for the skinning

+	//-------------------------------------------

+	[SkinState("normal")]

+	[SkinState("disabled")]

+		

+	

+	/**

+	 *  The MobileAlert control is a pop-up dialog box that can contain a message,

+	 *  a title, buttons (any combination of OK, Cancel, Yes, and No) and an icon.

+	 *  The Alert control is usually modal, which means it will retain focus until

+	 *  the user closes it.  This control is specific to Mobile, but it should work

+	 *  on Desktop implementations.  If the user does not specify their own skin, it

+	 *  will auto-sence between Android (default) and iOS skins.

+	 *

+	 *  <p>Import the org.apache.spark.components.MobileAlert class into your application,

+	 *  and then call the static <code>show()</code> method in ActionScript to display

+	 *  an Alert control. You cannot create an Alert control in MXML.</p>

+	 *

+	 *  <p>The Alert control closes when you select a button in the control,

+	 *  or press the Escape key.</p>

+	 *	 

+	 *	 

+	 *

+	 *  @langversion 3.0

+	 *  @playerversion Flash 11.0

+	 *  @playerversion AIR 3.0

+	 *  @productversion Flex 4.6

+	 */

+	public class MobileAlert extends SkinnablePopUpContainer

+	{

+

+		//----------------------------------------------------

+		// SkinParts as required by any of the attached skins

+		//----------------------------------------------------

+		[SkinPart(required="true")] public var titleDisplay:IDisplayText;

+		[SkinPart(required="true")] public var messageDisplay:IDisplayText;

+		[SkinPart(required="true")] public var icon:Image;

+		[SkinPart] public var buttonBarGroup:Group;

+		

+		//-----------------------------------------------

+		// Static Properties

+		//-----------------------------------------------

+		

+		/**

+		 *  Value that enables a Yes button on the Alert control when passed

+		 *  as the <code>flags</code> parameter of the <code>show()</code> method.

+		 *  You can use the | operator to combine this bitflag

+		 *  with the <code>OK</code>, <code>CANCEL</code>,

+		 *  <code>NO</code>.

+		 * 

+		 *  @langversion 3.0

+	 	 *  @playerversion Flash 11.0

+	 	 *  @playerversion AIR 3.0

+	 	 *  @productversion Flex 4.6

+		 */

+		public static const YES:uint = 0x0001;

+		/**

+		 *  Value that enables a No button on the Alert control when passed

+		 *  as the <code>flags</code> parameter of the <code>show()</code> method.

+		 *  You can use the | operator to combine this bitflag

+		 *  with the <code>OK</code>, <code>CANCEL</code>,

+		 *  <code>YES</code>.

+		 * 

+		 *  @langversion 3.0

+	 	 *  @playerversion Flash 11.0

+	 	 *  @playerversion AIR 3.0

+	 	 *  @productversion Flex 4.6

+		 */

+		public static const NO:uint = 0x0002;

+		/**

+		 *  Value that enables an OK button on the Alert control when passed

+		 *  as the <code>flags</code> parameter of the <code>show()</code> method.

+		 *  You can use the | operator to combine this bitflag

+		 *  with the <code>CANCEL</code>, <code>YES</code>,

+		 *  <code>NO</code>.

+		 * 

+		 *  @langversion 3.0

+	 	 *  @playerversion Flash 11.0

+	 	 *  @playerversion AIR 3.0

+	 	 *  @productversion Flex 4.6

+		 */

+		public static const OK:uint = 0x0004;

+		/**

+		 *  Value that enables a Cancel button on the Alert control when passed

+		 *  as the <code>flags</code> parameter of the <code>show()</code> method.

+		 *  You can use the | operator to combine this bitflag

+		 *  with the <code>OK</code>, <code>YES</code>,

+		 *  <code>NO</code>.

+		 * 

+		 *  @langversion 3.0

+	 	 *  @playerversion Flash 11.0

+	 	 *  @playerversion AIR 3.0

+	 	 *  @productversion Flex 4.6

+		 */

+		public static const CANCEL:uint = 0x0008;

+		

+		/**

+		 *  Built-in Waring Icon.  Use the iconClass property of the show() method

+		 *  to set a different icon.

+		 * 

+		 *  @langversion 3.0

+		 *  @playerversion Flash 11.0

+		 *  @playerversion AIR 3.0

+		 *  @productversion Flex 4.6

+		 */

+		[Embed(source="org/apache/spark/components/assets/WarningIcon.png")]

+		protected var defaultAlertIconClass:Class

+		

+		//--------------------------------------------------------------------------

+		//

+		//  Constructor

+		//

+		//--------------------------------------------------------------------------

+		

+		/**

+		 *  Constructor.

+		 *

+		 *  @langversion 3.0

+		 *  @playerversion Flash 11.0

+		 *  @playerversion AIR 3.0

+		 *  @productversion Flex 4.6

+		 */

+		public function MobileAlert()

+		{

+			super();

+		}

+

+		

+		//--------------------------------------------------------------------------

+		//

+		//  Class methods

+		//

+		//--------------------------------------------------------------------------

+		

+		/**

+		 *  Static method that pops up the MobileAlert control. The MobileAlert control

+		 *  closes when you select a button in the control, or press the Escape key.

+		 *

+		 *  @param message Text string that appears in the MobileAlert control.

+		 *  This text is the main text within the alert dialog box.

+		 *

+		 *  @param title Text string that appears in the title bar.

+		 *  This text is in the title area of the alert dialog box

+		 *

+		 *  @param flags Which buttons to place in the MobileAlert control.

+		 *  Valid values are <code>MobileAlert.OK</code>, <code>MobileAlert.CANCEL</code>,

+		 *  <code>MobileAlert.YES</code>, and <code>MobileAlert.NO</code>.

+		 *  The default value is <code>MobileAlert.OK</code>.

+		 *  Use the bitwise OR operator to display more than one button.

+		 *  For example, passing <code>(MobileAlert.YES | MobileAlert.NO)</code>

+		 *  displays Yes and No buttons (localized).

+		 *

+		 *  @param parent Object upon which the MobileAlert control centers itself.

+		 *

+		 *  @param closeHandler Event handler that is called when any button

+		 *  on the MobileAlert control is pressed.

+		 *  The event object passed to this handler is an instance of CloseEvent;

+		 *  the <code>detail</code> property of this object contains the value

+		 *  <code>MobileAlert.OK</code>, <code>MobileAlert.CANCEL</code>,

+		 *  <code>MobileAlert.YES</code>, or <code>MobileAlert.NO</code>.

+		 *

+		 *  @param iconClass Class of the icon that is placed to the left

+		 *  of the text in the MobileAlert control.

+		 *

+		 *  @param defaultButtonFlag A bitflag that specifies the default button.

+		 *  You can specify one and only one of

+		 *  <code>MobileAlert.OK</code>, <code>MobileAlert.CANCEL</code>,

+		 *  <code>MobileAlert.YES</code>, or <code>MobileAlert.NO</code>.

+		 *  The default value is <code>MobileAlert.OK</code>.

+		 *  Pressing the Enter key triggers the default button

+		 *  just as if you clicked it. Pressing Escape triggers the Cancel

+		 *  or No button just as if you selected it.

+		 *

+		 *  @param forcedSkin The Spark skin class that you wish to use to override

+		 *  the built-in skins to this control.  The skins must include a titleDisplay,

+		 *  a messageDisplay, an icon and a button area (buttonBarGroup)

+		 *

+		 *  @return A reference to the MobileAlert control.

+		 *

+		 *  @see mx.events.CloseEvent

+		 *

+		 *  @langversion 3.0

+		 *  @playerversion Flash 11.0

+		 *  @playerversion AIR 3.0

+		 *  @productversion Flex 4.6

+		 */

+		public static function show(message:String,

+									title:String,

+									flags:uint = OK,

+									parent:Sprite = null,

+									closeHandler:Function = null,

+									iconClass:Class = null,

+									defaultButtonIndex:uint = 0,

+									modal:Boolean = true,

+									forcedSkin:Class = null):MobileAlert

+		{

+			var mobileAlert:MobileAlert = new MobileAlert();

+			mobileAlert.title = title;

+			mobileAlert.message = message;

+			mobileAlert.flags = flags;

+			mobileAlert.defaultButtonIndex = defaultButtonIndex;

+						

+			if (!parent)

+			{

+				var systemManager:ISystemManager = ISystemManager(FlexGlobals.topLevelApplication.systemManager);

+				parent = Sprite(FlexGlobals.topLevelApplication);

+			}

+			

+			if (iconClass != null)

+			{

+				mobileAlert.iconClass = iconClass;	

+			}

+			else

+			{

+				mobileAlert.iconClass = mobileAlert.defaultAlertIconClass;

+			}

+			

+			if (closeHandler != null)

+			{

+				mobileAlert.addEventListener(CloseEvent.CLOSE, closeHandler);

+			}

+			

+			if (forcedSkin == null)

+			{

+				var os:String = Capabilities.os.toLowerCase();

+				if(os.indexOf('iphone') !=-1 || os.indexOf('ipad') !=-1 || os.indexOf('ipod') !=-1)

+				{

+					// we are on an iOS device

+

+				}

+				else

+				{

+					// we are assumed to be on an android device.

+					forcedSkin = AndroidAlertSkin;

+				}

+			}

+			

+			//open and center the alert

+			mobileAlert.setStyle("skinClass", forcedSkin);

+			mobileAlert.open(parent, modal);

+			

+			mobileAlert.x = (parent.width / 2) - (mobileAlert.width / 2);

+			mobileAlert.y = (parent.height / 2) - (mobileAlert.height / 2); 

+

+			return mobileAlert;

+		}

+

+		//--------------------------------------------------------------------------

+		//

+		//  Overridden properties

+		//

+		//--------------------------------------------------------------------------

+		/**

+		 * Class that returns the current skin state.  Changes to 'closed' when the MobileAlert is closed.

+		 *  

+		 * @return current skin state

+		 * 

+		 */		

+		override protected function getCurrentSkinState():String

+		{

+			if (!isOpen)

+			{

+				return "closed";

+			}

+			else

+			{

+				return "normal";

+			}

+		} 

+		

+		/**

+		 * Required class to hook into the Spark skinning archetiture.

+		 *  

+		 * @param partName Part Name being processed.

+		 * @param instance Current Skin Part being processed.

+		 * 

+		 */

+		override protected function partAdded(partName:String, instance:Object) : void

+		{

+			super.partAdded(partName, instance);

+			

+			if (instance == titleDisplay)

+			{

+				titleDisplay.text = title;

+			}

+			

+			if (instance == messageDisplay)

+			{

+				messageDisplay.text = message;

+			}

+			

+			if (instance == icon)

+			{

+				icon.source = _iconClass;

+			}

+			

+			if (instance == buttonBarGroup)

+			{

+				createButtons();

+			}

+			

+		}

+		

+		/**

+		 * Required class to hook into the Spark skinning archetiture.

+		 *  

+		 * @param partName Part Name being processed.

+		 * @param instance Current Skin Part being processed.

+		 * 

+		 */

+		override protected function partRemoved(partName:String, instance:Object) : void

+		{

+			super.partRemoved(partName, instance);

+			

+			if (instance == buttonBarGroup)

+			{

+				destroyButtons();

+			}

+			

+		}

+		

+		//-------------------------------------------------

+		// Properties and getters and setters

+		//-------------------------------------------------

+		

+		private var _iconClass:Class;

+		private var _flags:uint;

+		private var _defaultButtonIndex:uint;

+		private var _buttons:Vector.<Button>;

+		private var _title:String = "";

+		private var _message:String = "";

+		

+		/**

+		 *  The title to display in this alert dialog box.

+		 *

+		 *  @default ""

+		 *

+		 *  @langversion 3.0

+		 *  @playerversion Flash 9

+		 *  @playerversion AIR 1.1

+		 *  @productversion Flex 3

+		 */

+		public function get title():String 

+		{

+			return _title;

+		}

+		public function set title(value:String):void 

+		{

+			_title = value;

+			

+			if (titleDisplay)

+				titleDisplay.text = value;

+		}

+

+		/**

+		 *  The text to display in this alert dialog box.

+		 *

+		 *  @default ""

+		 *

+		 *  @langversion 3.0

+		 *  @playerversion Flash 9

+		 *  @playerversion AIR 1.1

+		 *  @productversion Flex 3

+		 */

+		public function get message():String

+		{

+			return _message;

+		}

+		public function set message(value:String):void

+		{

+			_message = value;

+			if (messageDisplay)

+				messageDisplay.text = value;

+		}

+		

+		/**

+		 *  A bitmask that contains <code>MobileAlert.OK</code>, <code>MobileAlert.CANCEL</code>,

+		 *  <code>MobileAlert.YES</code>, and/or <code>MobileAlert.NO</code> indicating

+		 *  the buttons available in the MobileAlert control.

+		 *

+		 *  @default Alert.OK

+		 *

+		 *  @langversion 3.0

+		 *  @playerversion Flash 10.1

+		 *  @playerversion AIR 2.5

+		 *  @productversion Flex 4.5

+		 */

+		public function get flags():uint

+		{

+			return _flags;

+		}

+		public function set flags(value:uint):void

+		{

+			_flags = value;

+		}

+		

+		/**

+		 *  A bitflag that contains either <code>MobileAlert.OK</code>,

+		 *  <code>MobileAlert.CANCEL</code>, <code>MobileAlert.YES</code>,

+		 *  or <code>MobileAlert.NO</code> to specify the default button.

+		 *

+		 *  @default Alert.OK

+		 *

+		 *  @langversion 3.0

+		 *  @playerversion Flash 9

+		 *  @playerversion AIR 1.1

+		 *  @productversion Flex 3

+		 */

+		public function get defaultButtonIndex():uint

+		{

+			return _defaultButtonIndex;

+		}

+		public function set defaultButtonIndex(value:uint):void

+		{

+			_defaultButtonIndex = value;

+		}

+		

+		/**

+		 *  The class of the icon to display.

+		 *  You typically embed an asset, such as a JPEG or GIF file,

+		 *  and then use the variable associated with the embedded asset

+		 *  to specify the value of this property.  If this is set to null,

+		 *  it will use the default of an exclaimination box.

+		 *

+		 *  @default null

+		 *

+		 *  @langversion 3.0

+		 *  @playerversion Flash 9

+		 *  @playerversion AIR 1.1

+		 *  @productversion Flex 3

+		 */

+		public function get iconClass():Class

+		{

+			return _iconClass;

+		}

+		public function set iconClass(value:Class):void

+		{

+			_iconClass = value;

+			invalidateSkinState();

+		}

+		

+		//-----------------------------------------------------

+		// Private functions used by other functions within this component

+		//-----------------------------------------------------

+		

+		/**

+		 *  @private

+		 */

+		private function createButtons():void

+		{

+			if(!buttonBarGroup || !flags)   return;

+			_buttons = new Vector.<Button>();

+			var curButton:Button;

+			if (Boolean(flags & YES))

+			{

+				curButton = new Button();

+				curButton.label = ResourceManager.getInstance().getString('MobileAlert','YesLabel');

+				_buttons.push(curButton);

+			}

+			if (Boolean(flags & NO))

+			{

+				curButton = new Button();

+				curButton.label = ResourceManager.getInstance().getString('MobileAlert','NoLabel');

+				_buttons.push(curButton);

+			}

+			if (Boolean(flags & OK))

+			{

+				curButton = new Button();

+				curButton.label = ResourceManager.getInstance().getString('MobileAlert','OkLabel');

+				_buttons.push(curButton);

+			}

+			if (Boolean(flags & CANCEL))

+			{

+				curButton = new Button();

+				curButton.label = ResourceManager.getInstance().getString('MobileAlert','CancelLabel');

+				_buttons.push(curButton);

+			}

+			

+			addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

+			

+			if (_buttons.length == 0) return;

+			

+			for (var i:int = 0; i < _buttons.length ; i++)

+			{

+				_buttons[i].buttonMode = true;

+				_buttons[i].height = buttonBarGroup.height - 7;

+				_buttons[i].percentWidth = 50;

+				_buttons[i].setStyle("fontSize",12); // I should not be doing this.  Will need to create a buttonSkin to contain some of these properties.

+				_buttons[i].addEventListener(MouseEvent.CLICK, onButtonTouch, false, 0, true);

+				buttonBarGroup.addElement(_buttons[i]);

+			}

+		

+			_buttons[_defaultButtonIndex].setFocus();

+			

+		}

+		

+		/**

+		 *  @private

+		 */

+		private function destroyButtons():void

+		{

+			for (var i:int = 0; i < _buttons.length ; i++)

+			{

+				_buttons[i].removeEventListener(MouseEvent.CLICK, onButtonTouch);

+				buttonBarGroup.removeElement(_buttons[i]);

+			}

+			

+			_buttons = null;

+

+			removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

+		}

+		

+		/**

+		 *  @private

+		 */

+		private function onButtonTouch(event:MouseEvent):void

+		{

+			var e:CloseEvent = new CloseEvent( CloseEvent.CLOSE, false, false, Number.MAX_VALUE);

+			switch(event.target.label)

+			{

+				case ResourceManager.getInstance().getString('MobileAlert','YesLabel'):

+					e.detail = OK;

+					break;

+				case ResourceManager.getInstance().getString('MobileAlert','NoLabel'):

+					e.detail = NO;

+					break;

+				case ResourceManager.getInstance().getString('MobileAlert','OkLabel'):

+					e.detail = OK;

+					break;

+				case ResourceManager.getInstance().getString('MobileAlert','CancelLabel'):

+					e.detail = CANCEL;

+					break;

+			}

+			

+			dispatchEvent(e);

+						

+			this.close();

+		}

+		

+		/**

+		 *  @private

+		 */

+		private function onKeyDown(event:KeyboardEvent):void

+		{

+			if (event.charCode == Keyboard.ESCAPE)

+			{

+				var e:CloseEvent = new CloseEvent( CloseEvent.CLOSE, false, false, Number.MAX_VALUE);

+				dispatchEvent(e);

+				this.close();

+			}

+		}

+

+	}

+}
\ No newline at end of file
diff --git a/quetwo/MobileAlert/src/org/apache/spark/components/assets/WarningIcon.png b/quetwo/MobileAlert/src/org/apache/spark/components/assets/WarningIcon.png
new file mode 100644
index 0000000..7f1b52e
--- /dev/null
+++ b/quetwo/MobileAlert/src/org/apache/spark/components/assets/WarningIcon.png
Binary files differ
diff --git a/quetwo/MobileAlert/src/org/apache/spark/components/skins/AndroidAlertSkin.mxml b/quetwo/MobileAlert/src/org/apache/spark/components/skins/AndroidAlertSkin.mxml
new file mode 100644
index 0000000..c98c134
--- /dev/null
+++ b/quetwo/MobileAlert/src/org/apache/spark/components/skins/AndroidAlertSkin.mxml
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8"?>

+

+<!--

+

+Licensed to the Apache Software Foundation (ASF) under one or more

+contributor license agreements.  See the NOTICE file distributed with

+this work for additional information regarding copyright ownership.

+The ASF licenses this file to You under the Apache License, Version 2.0

+(the "License"); you may not use this file except in compliance with

+the License.  You may obtain a copy of the License at

+

+http://www.apache.org/licenses/LICENSE-2.0

+

+Unless required by applicable law or agreed to in writing, software

+distributed under the License is distributed on an "AS IS" BASIS,

+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+See the License for the specific language governing permissions and

+limitations under the License.

+

+-->

+

+<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 

+        xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabled="0.5">

+    

+    <fx:Metadata>

+    <![CDATA[ 

+        [HostComponent("org.apache.spark.components.MobileAlert")]

+    ]]>

+    </fx:Metadata> 

+    

+    <fx:Script fb:purpose="styling">

+        <![CDATA[         

+

+			override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void

+            {

+                super.updateDisplayList(unscaledWidth, unscaledHeight);

+            }

+        ]]>        

+    </fx:Script>

+    

+    <s:states>

+        <s:State name="normal"/>

+        <s:State name="disabled"/>

+		<s:State name="closed" />

+    </s:states>

+    

+    <!-- Transitions for open and close -->

+    <s:transitions>

+        <s:Transition fromState="closed" toState="normal" autoReverse="true">

+            <s:Fade duration="150" target="{chrome}"/>

+        </s:Transition>

+

+        <s:Transition fromState="disabledAndClosed" toState="disabled" autoReverse="true">

+            <s:Fade duration="150" target="{chrome}"/>

+        </s:Transition>

+        

+        <s:Transition fromState="normal" toState="closed" autoReverse="true">

+            <s:Fade duration="150" target="{chrome}"/>

+        </s:Transition>

+

+        <s:Transition fromState="disabled" toState="disabledAndClosed" autoReverse="true">

+            <s:Fade duration="150" target="{chrome}"/>

+        </s:Transition>

+    </s:transitions>

+        

+    <!--- Defines the background and content group used by this skin. -->

+    <s:Group id="chrome" left="0" right="0" top="0" bottom="0">

+		

+		<s:Rect id="shadow" left="0" right="0" top="0" bottom="0" radiusX="3">

+			<s:filters>

+				<s:DropShadowFilter blurX="20" blurY="20" alpha="0.4" distance="5" angle="90" knockout="true" />

+			</s:filters>

+			<s:fill>

+				<!--- @private -->

+				<s:SolidColor color="#424542"/>

+			</s:fill>

+		</s:Rect>

+		

+        <!--- Defines the appearance of the SkinnablePopUpContainer class's background. -->

+        <s:Rect id="background" left="0" right="0" top="0" bottom="0" radiusX="3">

+            <s:fill>

+                <!--- @private -->

+                <s:SolidColor id="bgFill" color="#424542"/>

+            </s:fill>

+			<s:stroke>

+				<s:SolidColorStroke color="#ffffff" weight="1" />

+			</s:stroke>

+        </s:Rect>

+

+		<s:Line left="5" right="5" y="40" >

+			<s:stroke>

+				<s:LinearGradientStroke weight="1" caps="square">

+					<s:GradientEntry color="#424542" ratio="0"/>

+					<s:GradientEntry color="#ffffff" ratio=".5"/>

+					<s:GradientEntry color="#424542" ratio="1"/>

+				</s:LinearGradientStroke>

+			</s:stroke>

+		</s:Line>

+				

+    </s:Group>

+	

+	<s:Group id="contents" top="0" left="0" right="0" bottom="0">

+		

+		<s:layout>

+			<s:VerticalLayout gap="0" horizontalAlign="justify" />

+		</s:layout>

+		

+		<s:Group id="informationDisplay" width="100%" height="100%" minWidth="0" minHeight="0">	

+		

+			<s:Label id="titleDisplay" maxDisplayedLines="1"

+					 left="46" right="5" top="8" minHeight="30"

+					 verticalAlign="middle" textAlign="start" fontWeight="bold" color="#ffffff" />

+			

+			<s:Label id="messageDisplay" left="10" right="10" top="45" minHeight="30" color="#ffffff" paddingBottom="5"

+					 textAlign="start" verticalAlign="middle" fontSize="14" maxWidth="{Math.max(titleDisplay.width + 46,200)}" />

+			

+			<s:Image id="icon" left="5" top="5" width="36" height="36" />

+			

+		</s:Group>

+		

+		<s:Group id="buttonBar" minWidth="0" minHeight="0" bottom="0" left="0" right="0" height="36">

+			

+			<s:Rect id="buttonArea" left="0" right="0" bottom="0" height="33" radiusX="3">

+				<s:fill>

+					<s:SolidColor id="buttonBarFill" color="#bdbebd" />

+				</s:fill>

+				<s:stroke>

+					<s:SolidColorStroke color="#ffffff" weight="1" />

+				</s:stroke>

+			</s:Rect>

+			

+			<s:Rect left="1" right="1" bottom="18" height="18">

+				<s:fill>

+					<s:SolidColor color="#bdbebd" />

+				</s:fill>

+			</s:Rect>

+			

+			<s:Group id="buttonBarGroup" left="0" right="0" top="1" height="36" minHeight="36">

+				<s:layout>

+					<s:HorizontalLayout gap="4"  paddingLeft="4" paddingRight="4" paddingTop="2"

+										horizontalAlign="center" verticalAlign="top"/>

+				</s:layout>

+			</s:Group>

+			

+		</s:Group>

+	</s:Group>

+    

+</s:Skin>