You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2014/08/28 23:05:09 UTC

[1/4] add mx and spark versions of FlexStore

Repository: flex-examples
Updated Branches:
  refs/heads/develop a3a903137 -> c652cfba6


http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/ProductCatalogPanelSkin.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/ProductCatalogPanelSkin.mxml b/FlexStore/spark/src/productsView/ProductCatalogPanelSkin.mxml
new file mode 100644
index 0000000..d7f4aea
--- /dev/null
+++ b/FlexStore/spark/src/productsView/ProductCatalogPanelSkin.mxml
@@ -0,0 +1,286 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+
+ADOBE SYSTEMS INCORPORATED
+Copyright 2008 Adobe Systems Incorporated
+All Rights Reserved.
+
+NOTICE: Adobe permits you to use, modify, and distribute this file
+in accordance with the terms of the license agreement accompanying it.
+
+-->
+
+<!--- The default skin class for a Spark Panel container.  
+
+    @see spark.components.Panel
+
+    @langversion 3.0
+    @playerversion Flash 10
+    @playerversion AIR 1.5
+    @productversion Flex 4
+-->
+<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
+    xmlns:fb="http://ns.adobe.com/flashbuilder/2009" blendMode="normal" mouseEnabled="false" 
+    minWidth="131" minHeight="127" alpha.disabled="0.5" alpha.disabledWithControlBar="0.5" xmlns:productsView="productsView.*">
+    <fx:Metadata>[HostComponent("productsView.ProductCatalogPanel")]</fx:Metadata>
+    
+    <fx:Script fb:purpose="styling">
+        <![CDATA[
+		import mx.core.FlexVersion;
+		
+		/* Define the skin elements that should not be colorized. 
+        For panel, border and title background are skinned, but the content area, background, border, and title text are not. */
+        static private const exclusions:Array = ["background", "titleDisplay", "contentGroup", "controlBarGroup", "border"];
+			
+		/* exclusions before Flex 4.5 for backwards-compatibility purposes */
+		static private const exclusions_4_0:Array = ["background", "titleDisplay", "contentGroup", "controlBarGroup"];
+		
+		/**
+		 * @private
+		 */
+		override public function get colorizeExclusions():Array 
+		{
+			// Since border is styleable via borderColor, no need to allow chromeColor to affect
+			// the border.  This is wrapped in a compatibility flag since this change was added  
+			// in Flex 4.5
+			if (FlexVersion.compatibilityVersion < FlexVersion.VERSION_4_5)
+			{
+				return exclusions_4_0;
+			}
+			
+			return exclusions;
+		}
+        
+        /**
+         * @private
+         */
+        override protected function initializationComplete():void
+        {
+            useChromeColor = true;
+            super.initializationComplete();
+        }
+        
+        /**
+         * @private
+         */
+        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
+        {
+            if (getStyle("borderVisible") == true)
+            {
+                border.visible = true;
+                background.left = background.top = background.right = background.bottom = 1;
+                contents.left = contents.top = contents.right = contents.bottom = 1;
+            }
+            else
+            {
+                border.visible = false;
+                background.left = background.top = background.right = background.bottom = 0;
+                contents.left = contents.top = contents.right = contents.bottom = 0;
+            }
+            
+            dropShadow.visible = getStyle("dropShadowVisible");
+            
+            var cr:Number = getStyle("cornerRadius");
+            var withControls:Boolean = 
+                (currentState == "disabledWithControlBar" || 
+                 currentState == "normalWithControlBar");
+            
+            if (cornerRadius != cr)
+            {
+                cornerRadius = cr;
+                
+                dropShadow.tlRadius = cornerRadius;
+                dropShadow.trRadius = cornerRadius;
+                dropShadow.blRadius = withControls ? cornerRadius : 0;
+                dropShadow.brRadius = withControls ? cornerRadius : 0;
+                
+                setPartCornerRadii(topMaskRect, withControls); 
+                setPartCornerRadii(border, withControls); 
+                setPartCornerRadii(background, withControls);                
+            }
+            
+            if (bottomMaskRect) setPartCornerRadii(bottomMaskRect, withControls); 
+            
+            borderStroke.color = getStyle("borderColor");
+            borderStroke.alpha = getStyle("borderAlpha");
+            backgroundFill.color = getStyle("backgroundColor");
+            backgroundFill.alpha = getStyle("backgroundAlpha");
+            
+            super.updateDisplayList(unscaledWidth, unscaledHeight);
+        }
+        
+        /**
+         * @private
+         */  
+        private function setPartCornerRadii(target:Rect, includeBottom:Boolean):void
+        {            
+            target.topLeftRadiusX = cornerRadius;
+            target.topRightRadiusX = cornerRadius;
+            target.bottomLeftRadiusX = includeBottom ? cornerRadius : 0;
+            target.bottomRightRadiusX = includeBottom ? cornerRadius : 0;
+        }
+        
+        private var cornerRadius:Number;
+		]]>
+    </fx:Script>
+    
+    <s:states>
+        <s:State name="normal" />
+        <s:State name="disabled" />
+        <s:State name="normalWithControlBar" stateGroups="withControls" />
+        <s:State name="disabledWithControlBar" stateGroups="withControls" />
+    </s:states>
+    
+    <!-- drop shadow can't be hittable so it stays sibling of other graphics -->
+    <!--- @private -->
+    <s:RectangularDropShadow id="dropShadow" blurX="20" blurY="20" alpha="0.32" distance="11" 
+                             angle="90" color="#000000" left="0" top="0" right="0" bottom="0"/>
+    
+    <!-- drop shadow can't be hittable so all other graphics go in this group -->
+    <s:Group left="0" right="0" top="0" bottom="0">
+        
+        <!-- top group mask -->
+        <!--- @private -->
+        <s:Group left="1" top="1" right="1" bottom="1" id="topGroupMask" >
+            <!--- @private -->
+            <s:Rect id="topMaskRect" left="0" top="0" right="0" bottom="0">
+                <s:fill>
+                    <s:SolidColor alpha="0"/>
+                </s:fill>
+            </s:Rect>
+        </s:Group>
+        
+        <!-- bottom group mask -->
+        <!--- @private -->
+        <s:Group left="1" top="1" right="1" bottom="1" id="bottomGroupMask" 
+                 includeIn="normalWithControlBar, disabledWithControlBar">
+            <!--- @private -->
+            <s:Rect id="bottomMaskRect" left="0" top="0" right="0" bottom="0">
+                <s:fill>
+                    <s:SolidColor alpha="0"/>
+                </s:fill>
+            </s:Rect>
+        </s:Group>
+        
+        <!-- layer 1: border -->
+        <!--- @private -->
+        <s:Rect id="border" left="0" right="0" top="0" bottom="0" >
+            <s:stroke>
+                <!--- @private -->
+                <s:SolidColorStroke id="borderStroke" weight="1" />
+            </s:stroke>
+        </s:Rect>
+        
+        <!-- layer 2: background fill -->
+        <!--- Defines the appearance of the PanelSkin class's background. -->
+        <s:Rect id="background" left="1" top="1" right="1" bottom="1">
+            <s:fill>
+                <!--- @private
+                      Defines the  PanelSkin class's background fill. The default color is 0xFFFFFF. -->
+                <s:SolidColor id="backgroundFill" color="#FFFFFF"/>
+            </s:fill>
+        </s:Rect>
+        
+        <!-- layer 3: contents -->
+        <!--- Contains the vertical stack of titlebar content and controlbar. -->
+        <s:Group left="1" right="1" top="1" bottom="1" id="contents">
+            <s:layout>
+                <s:VerticalLayout gap="0" horizontalAlign="justify" />
+            </s:layout>
+            
+            <!--- @private -->
+            <s:Group id="topGroup" mask="{topGroupMask}">
+                
+                <!-- layer 0: title bar fill -->
+                <!--- @private -->
+                <s:Rect id="tbFill" left="0" right="0" top="0" bottom="1">
+                    <s:fill>
+                        <s:LinearGradient rotation="90">
+                            <s:GradientEntry color="0xE2E2E2" />
+                            <s:GradientEntry color="0xD9D9D9" />
+                        </s:LinearGradient>
+                    </s:fill>
+                </s:Rect>
+                
+                <!-- layer 1: title bar highlight -->
+                <!--- @private -->
+                <s:Rect id="tbHilite" left="0" right="0" top="0" bottom="0">
+                    <s:stroke>
+                        <s:LinearGradientStroke rotation="90" weight="1">
+                            <s:GradientEntry color="0xEAEAEA" />
+                            <s:GradientEntry color="0xD9D9D9" />
+                        </s:LinearGradientStroke>
+                    </s:stroke>
+                </s:Rect>
+                
+                <!-- layer 2: title bar divider -->
+                <!--- @private -->
+                <s:Rect id="tbDiv" left="0" right="0" height="1" bottom="0">
+                    <s:fill>
+                        <s:SolidColor color="0xC0C0C0" />
+                    </s:fill>
+                </s:Rect>
+                
+                <!-- layer 3: text -->
+                <!--- @copy spark.components.Panel#titleDisplay -->
+                <s:Label id="titleDisplay" maxDisplayedLines="1"
+                         left="9" right="3" top="1" bottom="0" minHeight="30"
+                         verticalAlign="middle" textAlign="start" fontWeight="bold">
+                </s:Label>
+                <productsView:CatalogTitleButtons id="titleButtons" width="50%" right="0" top="6" />
+            </s:Group>
+            
+            <!--
+                Note: setting the minimum size to 0 here so that changes to the host component's
+                size will not be thwarted by this skin part's minimum size.   This is a compromise,
+                more about it here: http://bugs.adobe.com/jira/browse/SDK-21143
+            -->
+            <!--- @copy spark.components.SkinnableContainer#contentGroup -->
+            <s:Group id="contentGroup" width="100%" height="100%" minWidth="0" minHeight="0">
+            </s:Group>
+            
+            <!--- @private -->
+            <s:Group id="bottomGroup" minWidth="0" minHeight="0"
+                     includeIn="normalWithControlBar, disabledWithControlBar" >
+                
+                <s:Group left="0" right="0" top="0" bottom="0" mask="{bottomGroupMask}">
+
+                    <!-- layer 0: control bar divider line -->
+                    <s:Rect left="0" right="0" top="0" height="1" alpha="0.22">
+                        <s:fill>
+                            <s:SolidColor color="0x000000" />
+                        </s:fill>
+                    </s:Rect>
+                    
+                    <!-- layer 1: control bar highlight -->
+                    <s:Rect left="0" right="0" top="1" bottom="0">
+                        <s:stroke>
+                            <s:LinearGradientStroke rotation="90" weight="1">
+                                <s:GradientEntry color="0xE5E5E5" />
+                                <s:GradientEntry color="0xD8D8D8" />
+                            </s:LinearGradientStroke>
+                        </s:stroke>
+                    </s:Rect>
+                    
+                    <!-- layer 2: control bar fill -->
+                    <s:Rect left="1" right="1" top="2" bottom="1">
+                        <s:fill>
+                            <s:LinearGradient rotation="90">
+                                <s:GradientEntry color="0xDADADA" />
+                                <s:GradientEntry color="0xC5C5C5" />
+                            </s:LinearGradient>
+                        </s:fill>
+                    </s:Rect>
+                </s:Group>
+                <!-- layer 3: control bar -->
+                <!--- @copy spark.components.Panel#controlBarGroup -->
+                <s:Group id="controlBarGroup" left="0" right="0" top="1" bottom="1" minWidth="0" minHeight="0">
+                    <s:layout>
+                        <s:HorizontalLayout paddingLeft="10" paddingRight="10" paddingTop="7" paddingBottom="7" gap="10" />
+                    </s:layout>
+                </s:Group>
+            </s:Group>
+        </s:Group>
+    </s:Group>
+</s:SparkSkin>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/ProductCatalogThumbnail.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/ProductCatalogThumbnail.mxml b/FlexStore/spark/src/productsView/ProductCatalogThumbnail.mxml
new file mode 100644
index 0000000..60c5821
--- /dev/null
+++ b/FlexStore/spark/src/productsView/ProductCatalogThumbnail.mxml
@@ -0,0 +1,195 @@
+<?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:BorderContainer xmlns:fx="http://ns.adobe.com/mxml/2009"
+           xmlns:s="library://ns.adobe.com/flex/spark"
+    width="{COL_WIDTH_4}" height="{COL_HEIGHT_4}" height.compare="502"
+    width.x4cols="{COL_WIDTH_4}" height.x4cols="{COL_HEIGHT_4}"
+    width.x3cols="{COL_WIDTH_3}" height.x3cols="{COL_HEIGHT_3}"
+    width.x2cols="{COL_WIDTH_2}" height.x2cols="{COL_HEIGHT_2}"
+    
+    borderStyle="solid"
+    borderColor="#FFFFFF"
+    rollOver="rollOverHandler(event)"
+    rollOut="rollOutHandler(event)"
+    mouseDown="mouseDownHandler(event)"
+    mouseMove="mouseMoveHandler(event)"
+    mouseUp="mouseUpHandler(event)"
+    click="clickHandler(event)"
+    currentState="x4cols"
+    automationName="{product.name}"
+    >
+
+    <fx:Metadata>
+        [Event(name="purchase", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="compare", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="details", type="samples.flexstore.ProductThumbEvent")]
+    </fx:Metadata>
+
+    <fx:Script>
+        <![CDATA[
+
+		import mx.events.*;
+        import mx.core.*;
+        
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductThumbEvent;
+        
+        public static const COL_WIDTH_4:int = 162;
+        public static const COL_HEIGHT_4:int = 122;
+        public static const COL_WIDTH_3:int = 217;
+        public static const COL_HEIGHT_3:int = 165;
+        public static const COL_WIDTH_2:int = 327;
+        public static const COL_HEIGHT_2:int = 250;
+        public static const COMPARE_WIDTH:int = 162;
+        public static const HORIZONTAL_GAP:int = 2;
+        public static const VERTICAL_GAP:int = 3;
+
+        [Bindable]
+        public var product:Product;
+
+        private function rollOverHandler(event:MouseEvent):void
+		{
+            setStyle("borderColor", "#CCCCCC");
+            setStyle("dropShadowEnabled", true);
+            buttons.visible = true;
+        }
+
+        private function rollOutHandler(event:MouseEvent):void
+		{
+            setStyle("borderColor", "#FFFFFF");
+            setStyle("dropShadowEnabled", false);
+			buttons.visible = false;
+        }
+
+        private var dragStartPoint:Point;
+
+        public function mouseDownHandler(event:MouseEvent):void
+        {
+            if (event.target != purchase &&
+                event.target != compare &&
+                event.target != details)
+            {
+                dragStartPoint = new Point(event.stageX, event.stageY);
+                dragStartPoint = globalToLocal(dragStartPoint);
+
+            }
+        }
+
+        public function mouseMoveHandler(event:MouseEvent):void
+        {
+            if (dragStartPoint != null)
+            {
+                var dragEvent:DragEvent = new DragEvent(DragEvent.DRAG_START, true);
+                dragEvent.localX = dragStartPoint.x;
+                dragEvent.localY = dragStartPoint.y;
+                dragEvent.buttonDown = true;
+                dispatchEvent(dragEvent);
+
+                rollOutHandler(event);
+
+                dragStartPoint = null;
+            }
+        }
+
+        public function mouseUpHandler(event:MouseEvent):void
+        {
+            if (dragStartPoint != null)
+            {
+                dragStartPoint = null;
+            }
+        }
+
+        public function clickHandler(event:MouseEvent):void
+        {
+            if (event.target != purchase &&
+                event.target != compare &&
+                event.target != details)
+            {
+                dispatchEvent(new ProductThumbEvent(ProductThumbEvent.DETAILS, product));
+            }
+        }
+
+	]]>
+    </fx:Script>
+
+    <fx:Declarations>
+        <s:CurrencyFormatter currencySymbol="$" id="cf" fractionalDigits="2"/>        
+    </fx:Declarations>
+
+    <s:VGroup id="vb" width="100%" height="100%"
+        paddingLeft="6" paddingTop="4" paddingRight="8" paddingBottom="4"
+        gap="0">
+
+        <s:Label text="{product.name}" fontWeight="bold"/>
+
+        <s:HGroup width="100%" paddingTop="0" gap="4">
+
+            <s:Image id="img" height="90" width="45" 
+                     width.x3cols="60" height.x3cols="120"
+                     width.x2cols="60" height.x2cols="120"
+                     source="{product.image}" />
+
+            <s:VGroup id="descr" width="100%" height="100%" gap="0" paddingTop="0">
+                <s:Label text="{product.featureString}" width="80" height="48" maxDisplayedLines="5"/>
+                <s:Label text="{cf.format(product.price)}" fontWeight="bold"/>
+				<s:Spacer height="4"/>
+                <s:Label text="{product.highlight1}" color="#EE8D0C" includeIn="x3cols, x2cols"/>
+                <s:Label text="{product.highlight2}" color="#EE8D0C" includeIn="x3cols, x2cols"/>
+            </s:VGroup>
+
+        </s:HGroup>
+
+        <s:Spacer height="8"/>
+
+        <s:Label text="Years: {product.experience}" includeIn="compare"/>
+        <s:Label text="BlazeDS: {product.blazeds}" includeIn="compare"/>
+        <s:Label text="Mobile: {product.mobile}" includeIn="compare"/>
+        <s:Label text="Video: {product.video}" includeIn="compare"/>
+        <s:Label text="Highlight: {product.highlight1}" includeIn="compare"/>
+        <s:Label text="Highlight: {product.highlight2}" includeIn="compare"/>
+        <s:Label text="Description:" includeIn="compare"/>
+        <s:Label text="{product.description}" width="100%" includeIn="compare" maxDisplayedLines="5"/>
+    </s:VGroup>
+
+
+    <s:VGroup id="buttons" visible="false" gap="4" paddingRight="8" right="8" top="12">
+        <s:Button id="purchase" icon="@Embed('/assets/icon_cart_empty.png')" 
+            click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.PURCHASE, product))" 
+            width="30" toolTip="Add to cart"/>
+        <s:Button id="compare" icon="@Embed('/assets/icon_compare.png')" 
+            click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.COMPARE, product))" 
+            width="30" toolTip="Add to compare list"/>
+        <s:Button id="details" icon="@Embed('/assets/icon_details.png')" 
+            click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.DETAILS, product))" 
+            width="30" toolTip="Show details"/>
+    </s:VGroup>
+
+    <s:states>
+
+        <s:State name="compare" />
+
+        <s:State name="x4cols" />
+
+        <s:State name="x3cols" />
+
+        <s:State name="x2cols"/>
+    </s:states>
+
+</s:BorderContainer>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/ProductDetails.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/ProductDetails.mxml b/FlexStore/spark/src/productsView/ProductDetails.mxml
new file mode 100644
index 0000000..4b2417d
--- /dev/null
+++ b/FlexStore/spark/src/productsView/ProductDetails.mxml
@@ -0,0 +1,121 @@
+<?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:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+           xmlns:s="library://ns.adobe.com/flex/spark"
+    xmlns:productsView="productsView.*"
+    >
+
+    <fx:Metadata>
+        [Event(name="purchase", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="compare", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="browse", type="samples.flexstore.ProductThumbEvent")]
+    </fx:Metadata>
+
+    <fx:Script>
+        <![CDATA[
+
+		import mx.events.*;
+		
+		import samples.flexstore.Product;
+		import samples.flexstore.ProductThumbEvent;
+
+        private var _product:Product;
+        
+        [Bindable]
+        public function get product():Product
+        {
+            return _product;
+        }
+        
+        public function set product(p:Product):void
+        {
+            _product = p;
+            tn.selectedIndex = 0;
+        }
+        
+	]]>
+    </fx:Script>
+
+    <fx:Declarations>
+        <s:CurrencyFormatter currencySymbol="$" id="cf" fractionalDigits="2"/>        
+    </fx:Declarations>
+
+    <s:states>
+        <s:State name="Features" />
+        <s:State name="Support" />
+    </s:states>
+    
+    <s:transitions>
+        <s:Transition>
+            <s:Fade />
+        </s:Transition>
+    </s:transitions>
+    
+    <s:TabBar id="tn" width="100%" change="currentState = tn.selectedItem">
+        <s:dataProvider>
+            <s:ArrayList>
+                <fx:Array>
+                    <fx:String>Features</fx:String>
+                    <fx:String>Support</fx:String>
+                </fx:Array>
+            </s:ArrayList>
+        </s:dataProvider>
+    </s:TabBar>
+    <s:Group width="100%" height="100%" 
+                    left="4" right="8" top="34" bottom="4">
+
+        <s:VGroup width="100%" height="100%" includeIn="Features" gap="8"
+            paddingLeft="8" paddingTop="8" paddingRight="8" paddingBottom="8">
+
+            <s:HGroup width="100%" gap="12">
+
+                <s:Image id="img" width="101" height="200" source="{product.image}"/>
+
+                <s:VGroup id="descr" width="100%" height="100%" paddingTop="0" gap="4">
+
+                    <s:Label text="{product.name}" fontSize="11" fontWeight="bold"/>
+
+	                <s:Label text="{product.featureString}" width="80" height="48" maxDisplayedLines="4"/>
+
+                    <s:Label text="{product.highlight1}" color="#EE8D0C"/>
+
+                    <s:Label text="{product.highlight2}" color="#EE8D0C"/>
+
+                    <s:Label text="{cf.format(product.price)}" fontWeight="bold"/>
+
+                </s:VGroup>
+            </s:HGroup>
+
+            <s:Label id="descriptionText" width="100%" height="100%" text="{product.description}" maxDisplayedLines="0"/>
+
+        </s:VGroup>
+
+        <productsView:ProductSupport width="100%" height="100%" includeIn="Support" />
+
+    </s:Group>
+
+    <s:VGroup gap="4" right="16" top="36">
+        <s:Spacer width="100%"/>
+        <s:Button icon="@Embed('/assets/icon_cart_empty.png')" click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.PURCHASE, product))" width="30" toolTip="Add to cart"/>
+        <s:Button icon="@Embed('/assets/icon_compare.png')" click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.COMPARE, product))" width="30" toolTip="Add to compare list"/>
+        <s:Button icon="@Embed('/assets/icon_tiles.png')" click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.BROWSE, product));" width="30" toolTip="Back to thumbnail view"/>
+    </s:VGroup>
+
+</s:Group>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/ProductFilterPanel.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/ProductFilterPanel.mxml b/FlexStore/spark/src/productsView/ProductFilterPanel.mxml
new file mode 100644
index 0000000..a0310df
--- /dev/null
+++ b/FlexStore/spark/src/productsView/ProductFilterPanel.mxml
@@ -0,0 +1,200 @@
+<?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:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009" 
+         xmlns:s="library://ns.adobe.com/flex/spark" 
+    xmlns:productsView="productsView.*"
+    xmlns:flexstore="samples.flexstore.*"
+    height="100%" 
+    paddingLeft="4" 
+    paddingRight="12" 
+    paddingTop="12" 
+    paddingBottom="8" 
+    gap="0"
+    currentState="showingThumbnails">
+    
+    <fx:Metadata>
+       [Event(name="filter", type="samples.flexstore.ProductFilterEvent")] 
+       [Event("compare")]
+    </fx:Metadata>
+    
+    <fx:Script>
+        <![CDATA[
+        import mx.controls.sliderClasses.Slider;
+        import mx.controls.Alert; 
+        import samples.flexstore.ProductFilterEvent;
+           
+        private var thumbBeingPressed:Boolean;
+           
+        private function dispatchFilter():void
+        {
+            var event:ProductFilterEvent = 
+                new ProductFilterEvent(filter, thumbBeingPressed);
+            dispatchEvent(event);
+            currentState = "showingThumbnails";
+        }
+        
+        private function sliderValue(values:Array, index:int):Number
+        {
+            return values[index];
+        }
+        
+        private function productRemoved():void
+        {
+            if (currentState == "showingComparison")
+            {
+                if (productList.items.length == 0)
+                {
+                    dispatchFilter();
+                }
+                else
+                {
+                    attemptCompare();
+                }
+            }
+        }
+        
+        private function attemptCompare():void
+        {
+            if (productList.items.length > 0)
+            {
+                dispatchEvent(new Event("compare"));
+                currentState = "showingComparison";
+            }
+            else
+            {
+                Alert.show("There are no items to compare.", "Compare");
+            }
+        }
+        
+        ]]>
+    </fx:Script>
+    <fx:Declarations>
+        <flexstore:ProductFilter id="filter">
+            <flexstore:experience>{series.selectedItem}</flexstore:experience>
+            <flexstore:minPrice>{loPrice.value}</flexstore:minPrice>
+            <flexstore:maxPrice>{hiPrice.value}</flexstore:maxPrice>
+            <flexstore:blazeds>{cbBlazeDS.selected}</flexstore:blazeds>
+            <flexstore:mobile>{cbMobile.selected}</flexstore:mobile>
+            <flexstore:video>{cbVideo.selected}</flexstore:video>
+        </flexstore:ProductFilter>
+        
+        <s:CurrencyFormatter currencySymbol="$" id="cf"/>    
+        
+    </fx:Declarations>
+    
+    <s:Label text="Find" styleName="sectionHeader"/>
+    
+    <s:HGroup width="100%">
+        <s:TextInput styleName="glass" width="100%"/>
+        <s:Button styleName="glass" label="Go" click="Alert.show('This feature is not implemented in this sample', 'Find')"/>
+    </s:HGroup>
+
+    <s:Spacer height="18"/>
+
+    <s:Line width="100%"/>
+
+    <s:Spacer height="8"/>
+
+    <s:HGroup paddingTop="0" paddingLeft="0" verticalAlign="bottom">
+        <s:Label text="Filter" styleName="sectionHeader"/>
+        <s:Label text="({filter.count} items selected)" color="{getStyle('themeColor')}" fontWeight="bold"/>
+    </s:HGroup>
+
+    <s:Spacer height="8"/>
+
+    <s:Label text="Years of Experience"/>
+
+    <s:ComboBox id="series" styleName="glass" width="140" change="dispatchFilter();">
+        <s:dataProvider>
+            <s:ArrayList>
+                <fx:Array>
+                    <fx:String>All</fx:String>
+                    <fx:String>3</fx:String>
+                    <fx:String>5</fx:String>
+                    <fx:String>7</fx:String>
+                    <fx:String>9</fx:String>
+                </fx:Array>                
+            </s:ArrayList>
+        </s:dataProvider>
+    </s:ComboBox>
+
+    <s:Spacer height="18"/>
+
+    <s:Label text="Price"/>
+
+    <!--<s:HSlider id="priceSlider" styleName="glassSlider" minimum="0" maximum="200" tickInterval="10" snapInterval="10"
+        width="100%" thumbCount="2" values="[0,200]" labels="[$0,$200]" liveDragging="true" dataTipFormatFunction="{cf.format}"
+        change="dispatchFilter()"
+        thumbPress="thumbBeingPressed=true"
+        thumbRelease="thumbBeingPressed=false;dispatchFilter()"
+        />-->
+    <s:HGroup>
+        <s:NumericStepper id="loPrice" minimum="0" maximum="{hiPrice.value}" value="0" change="dispatchFilter()" />
+        <s:NumericStepper id="hiPrice" minimum="{loPrice.value}" maximum="200" value="200" change="dispatchFilter()" />
+    </s:HGroup>
+
+    <s:Spacer height="18"/>
+
+    <s:Label text="Required Features"/>
+
+    <s:Spacer height="4"/>
+
+    <s:CheckBox id="cbBlazeDS" styleName="glass" label="BlazeDS" click="dispatchFilter();"/>
+    <s:Spacer height="4"/>
+    <s:CheckBox id="cbMobile" styleName="glass" label="Mobile" click="dispatchFilter()"/>
+    <s:Spacer height="4"/>
+    <s:CheckBox id="cbVideo" styleName="glass" label="Video" click="dispatchFilter();"/>
+
+    <s:Spacer height="18"/>
+
+    <s:Line width="100%"/>
+
+    <s:Spacer height="8"/>
+
+        <s:HGroup>
+            <s:Label text="Compare" styleName="sectionHeader"/>
+            <s:Label text="(Drag items here to compare)" styleName="instructions"/>
+        </s:HGroup>
+
+
+    <s:Spacer height="4"/>
+
+    <!-- height is maxItems * ProductListItem.HEIGHT + 2px border -->
+    <productsView:ProductList id="productList" height="{productList.maxItems * ProductListItem.HEIGHT + 2}" width="100%"
+        newItemStartX="300" newItemStartY="-100" maxItems="4" 
+        removeProduct="productRemoved()"/>
+
+    <s:Spacer height="8"/>
+    
+    <s:Button id="compareButton" styleName="glass" 
+              label.showingThumbnails="Compare Items"
+              icon.showingThumbnails="@Embed('/assets/icon_compare.png')"
+              click.showingThumbnails="attemptCompare()"
+              label.showingComparison="Back to thumbnail view"
+              icon.showingComparison="@Embed('/assets/icon_tiles.png')"
+              click.showingComparison="dispatchFilter()"
+    />
+    
+    <s:states>
+       <s:State name="showingThumbnails" />
+       <s:State name="showingComparison" />
+    </s:states>
+
+</s:VGroup>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/ProductList.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/ProductList.mxml b/FlexStore/spark/src/productsView/ProductList.mxml
new file mode 100644
index 0000000..37d2e26
--- /dev/null
+++ b/FlexStore/spark/src/productsView/ProductList.mxml
@@ -0,0 +1,214 @@
+<?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:BorderContainer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+           xmlns:s="library://ns.adobe.com/flex/spark"
+    borderStyle="solid"
+    dragEnter="doDragEnter(event)"
+    dragDrop="doDragDrop(event)"
+    backgroundAlpha="0" backgroundColor="#FF0000"> <!-- need a background color for drag and drop but can set alpha to 0 -->
+    
+    <fx:Metadata>
+       [Event(name="addProduct", type="samples.flexstore.ProductListEvent")]
+       [Event(name="duplicateProduct", type="samples.flexstore.ProductListEvent")]
+       [Event(name="productQtyChange", type="samples.flexstore.ProductListEvent")]
+       [Event(name="removeProduct", type="samples.flexstore.ProductListEvent")]
+    </fx:Metadata>
+
+    <fx:Script>
+        <![CDATA[
+        import mx.core.*;
+        import mx.effects.*;
+        import mx.events.*;
+        import mx.managers.DragManager;
+        import mx.effects.EffectManager;
+        
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductListEvent;
+        
+        public var items:Array = [];
+        
+        public var newItemStartX:int;
+        public var newItemStartY:int;
+        [Bindable]
+        public var maxItems:int;
+        public var showQuantity:Boolean;
+        
+        private var playingEffects:Dictionary = new Dictionary(true);
+        
+        public function addProduct(product:Product):void
+		{
+            var index:int = indexOf(product.productId);
+            var event:ProductListEvent;
+            var item:ProductListItem;
+            
+            if (index != -1)
+			{
+			    item = items[index] as ProductListItem;
+			    //if we don't keep track of what's playing a double-click can
+			    //cause the list item to keep rising
+			    if (playingEffects[item] == null)
+			    {
+                    var jump:Sequence = new Sequence();
+                    var m1:Move = new Move(item)
+                    m1.yBy = -5;
+                    var m2:Move = new Move(item)
+                    m2.yBy = 5;
+                    jump.addChild(m1);
+                    jump.addChild(m2);
+                    jump.duration = 150;
+                    playingEffects[item] = jump;
+                    jump.addEventListener(EffectEvent.EFFECT_END, function(event:Event):void
+                    {
+                       delete playingEffects[item];
+                    });
+                    jump.play();
+                }
+                event = new ProductListEvent(ProductListEvent.DUPLICATE_PRODUCT);
+                event.product = item.product;
+                dispatchEvent(event);
+            }
+			else
+			{
+                index = items.length;
+                if (maxItems <= 0 || index < maxItems)
+				{
+				    item = new ProductListItem();
+				    if (showQuantity)
+				    {
+				        item.currentState = 'showQuantity';
+				    }
+				    item.product = product;
+				    item.percentWidth = 100;
+				    item.addEventListener(ProductListEvent.REMOVE_PRODUCT, removeItemHandler);
+                    items[index] = item;
+                    item.includeInLayout = false;
+                    viewport.addElement(item);
+                    item.setLayoutBoundsSize(viewport.width, item.getPreferredBoundsHeight());
+                    layoutItems(index, true);
+                    event = new ProductListEvent(ProductListEvent.ADD_PRODUCT);
+                    event.product = product;
+                    dispatchEvent(event);
+                }
+            }
+        }
+        
+        public function getProducts():Array
+        {
+            var ret:Array = [];
+            for (var i:int = 0; i < items.length; i++)
+            {
+                ret[i] = items[i].product;
+            }
+            return ret;
+        }
+        
+        private function removeItemHandler(event:Event):void
+        {
+            var item:ProductListItem = event.target as ProductListItem;
+            var index:int = indexOf(item.product.productId);
+            items.splice(index, 1);
+            viewport.removeElement(item);
+            layoutItems(index);
+        }
+            
+        private function layoutItems(startIndex:int, scrollToBottom:Boolean=false):void
+		{
+            var n:int = items.length;
+            var e:Move;
+			for (var i:int = startIndex; i < n ; i++)
+			{
+			    var item:ProductListItem = items[i];
+                var yTo:Number = i * (item.height);
+                //still need to prevent items that are already in motion from getting
+                //jumpy
+			    if (playingEffects[item] == null)
+			    {
+                    e = new Move(item);
+                    if (item.x == 0 && item.y == 0)
+    				{
+    					e.xFrom = newItemStartX;
+    					e.yFrom = newItemStartY;
+                    }
+    
+                    e.xTo = 0;
+                    e.yTo = yTo;
+                    playingEffects[item] = e;
+                    e.addEventListener(EffectEvent.EFFECT_END, function(event:Event):void
+                    {
+                       delete playingEffects[item];
+                    });
+                    e.play();
+                }
+                else
+                {
+                    playingEffects[item].pause();
+                    playingEffects[item].yTo = yTo;
+                    playingEffects[item].play();
+                }
+            }
+            //get the last event and if we should scroll make sure we can validate
+            //and scroll to maxVPosition
+            if (scrollToBottom)
+            {
+                e.addEventListener(EffectEvent.EFFECT_END, function(event:Event):void
+                {
+                    validateNow();
+                    viewport.verticalScrollPosition = viewport.contentHeight - viewport.height;    
+                });
+            }
+        }
+        
+        private function indexOf(productId:int):int
+		{
+            var index:int = -1;
+
+            var n:int = items.length;
+			for (var i:int = 0; i < items.length; i++)
+			{
+                if (items[i].product.productId == productId)
+				{
+                    index = i;
+                    break;
+                }
+            }
+
+            return index;
+        }     
+
+        private function doDragEnter(event:DragEvent):void
+        {
+            if (event.dragSource.hasFormat("product"))
+            {
+                DragManager.acceptDragDrop(IUIComponent(event.target));
+            }
+        }
+
+        private function doDragDrop(event:DragEvent):void
+        {
+            var product:Product = event.dragSource.dataForFormat("product") as Product;
+            addProduct(product);
+        }  
+ 
+        ]]>
+    </fx:Script>
+    <s:Scroller id="scroller" width="100%" height="100%">
+        <s:Group id="viewport" width="100%" height="100%" />
+    </s:Scroller>
+</s:BorderContainer>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/ProductListItem.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/ProductListItem.mxml b/FlexStore/spark/src/productsView/ProductListItem.mxml
new file mode 100644
index 0000000..5d32431
--- /dev/null
+++ b/FlexStore/spark/src/productsView/ProductListItem.mxml
@@ -0,0 +1,90 @@
+<?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:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+         xmlns:s="library://ns.adobe.com/flex/spark" 
+    styleName="listItem" 
+    height="{ProductListItem.HEIGHT}"
+    automationName="{product.name}">
+
+    <fx:Metadata>
+       [Event(name="productQtyChange", type="samples.flexstore.ProductListEvent")]
+       [Event(name="removeProduct", type="samples.flexstore.ProductListEvent")]
+    </fx:Metadata>
+    
+    <fx:Script>
+    <![CDATA[
+    
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductListEvent;
+        
+        public static const HEIGHT:int = 30;
+        
+        [Bindable]
+        public var product:Product;
+        
+        private function qtyChange():void
+    	{
+            product.qty = int(qty.text);
+            var event:ProductListEvent = new ProductListEvent(ProductListEvent.PRODUCT_QTY_CHANGE);
+            event.product = product;
+    		dispatchEvent(event);
+        }
+        
+        private function removeItem():void
+        {
+            var event:ProductListEvent = new ProductListEvent(ProductListEvent.REMOVE_PRODUCT);
+            event.product = product;
+    		dispatchEvent(event);
+        }
+        
+    ]]>
+    </fx:Script>
+    
+    <fx:Declarations>
+        <s:CurrencyFormatter currencySymbol="$" id="cf" fractionalDigits="2"/>
+    </fx:Declarations>
+    
+    <s:layout>
+        <s:HorizontalLayout />
+    </s:layout>
+        
+    <s:Button id="removeButton"
+        width="14" height="14" 
+        icon="@Embed('/assets/trashcan.png')"
+        toolTip="Remove from cart"
+        click="removeItem()"/>
+
+    <s:Image id="productImage" width="12" height="24" source="{product.image}"/>
+
+    <s:Label id="productName" maxWidth="100" text="{product.name}"/>
+
+    <s:Spacer width="100%" />
+
+    <s:Label id="productPrice" 
+        text="{cf.format(product.price)}" textAlign="right"/>
+        
+    <s:TextInput id="qty" width="25" text="{product.qty}" includeIn="showQuantity"
+                  textAlign="right" maxChars="3" change="qtyChange()" />
+    <s:states>
+        <s:State name="compare" />
+        <s:State name="showQuantity" />
+    </s:states>
+    
+</s:ItemRenderer>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/ProductSupport.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/ProductSupport.mxml b/FlexStore/spark/src/productsView/ProductSupport.mxml
new file mode 100644
index 0000000..599ea87
--- /dev/null
+++ b/FlexStore/spark/src/productsView/ProductSupport.mxml
@@ -0,0 +1,88 @@
+<?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:HGroup xmlns:fx="http://ns.adobe.com/mxml/2009" 
+        xmlns:s="library://ns.adobe.com/flex/spark" 
+		 paddingLeft="4" paddingRight="8" paddingBottom="4"
+		 >
+
+    <fx:Script>
+	<![CDATA[
+
+        private function toggle():void
+		{
+			/*
+            if (vd.playing)
+			{
+                vd.stop();
+                list.visible = true;
+            }
+			else
+			{
+                list.visible = false;
+                vd.play();
+            }
+			*/
+        }
+
+	]]>
+    </fx:Script>
+
+    <fx:Declarations>
+        <s:Parallel id="hideList">
+            <s:children>
+                <fx:Array>
+                    <s:Resize target="{list}" widthTo="0"/>
+                    <!--<mx:Resize target="{vd}" widthTo="400" heightTo="314"/>-->
+                </fx:Array>
+            </s:children>
+        </s:Parallel>
+        
+        <s:Parallel id="showList">
+            <s:children>
+                <fx:Array>
+                    <s:Resize target="{list}" widthTo="130"/>
+                    <!--<mx:Resize target="{vd}" widthTo="270" heightTo="217"/>-->
+                </fx:Array>
+            </s:children>
+        </s:Parallel>        
+    </fx:Declarations>
+    <s:List id="list" width="130" height="100%" selectedIndex="0"
+			 hideEffect="hideList" showEffect="showList">
+        <s:dataProvider>
+            <s:ArrayList>
+                <fx:Array>
+                    <fx:Object label="Install SIM Card"/>
+                </fx:Array>
+            </s:ArrayList>
+        </s:dataProvider>
+    </s:List>
+
+    <s:Group width="100%">
+
+		<!--<mx:VideoDisplay id="vd" width="270" height="217" source="assets/phone.flv"
+						 autoPlay="false" complete="list.visible=true"/>
+
+		<mx:Button label="{vd.playing ? 'Stop' : 'Play'}" click="toggle()" left="8" bottom="8" includeInLayout="false">
+		</mx:Button>
+		-->
+	</s:Group>
+
+
+</s:HGroup>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/samples/flexstore/ButtonBarButtonSkin.as
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/samples/flexstore/ButtonBarButtonSkin.as b/FlexStore/spark/src/samples/flexstore/ButtonBarButtonSkin.as
new file mode 100644
index 0000000..5e94b58
--- /dev/null
+++ b/FlexStore/spark/src/samples/flexstore/ButtonBarButtonSkin.as
@@ -0,0 +1,298 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+import flash.display.GradientType;
+import mx.containers.BoxDirection;
+import mx.controls.Button;
+import mx.controls.ButtonBar;
+import mx.skins.Border;
+import mx.skins.halo.*;
+import mx.styles.StyleManager;
+import mx.utils.ColorUtil;
+
+/**
+ *  Adapted from mx.skins.halo.ButtonBarButtonSkin.
+ *  This version of the ButtonBarButtonSkin is applied for the
+ *  selectedOver, selectedUp, and over states to use the 2nd two
+ *  values of the fillColors for the selected state of the
+ *  button.  The over state then uses a computed value from
+ *  the themeColor to show emphasis.  The border of the selected
+ *  button also uses a computed value from the themeColor, but
+ *  is partially transparent.
+ */
+public class ButtonBarButtonSkin extends Border
+{
+	//--------------------------------------------------------------------------
+	//
+	//  Class variables
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 */
+	private static var cache:Object = {};
+
+	//--------------------------------------------------------------------------
+	//
+	//  Class methods
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 *  Several colors used for drawing are calculated from the base colors
+	 *  of the component (themeColor, borderColor and fillColors).
+	 *  Since these calculations can be a bit expensive,
+	 *  we calculate once per color set and cache the results.
+	 */
+	private static function calcDerivedStyles(themeColor:uint,
+											  fillColor0:uint,
+											  fillColor1:uint):Object
+	{
+		var key:String = HaloColors.getCacheKey(themeColor,
+												fillColor0, fillColor1);
+
+		if (!cache[key])
+		{
+			var o:Object = cache[key] = {};
+
+			// Cross-component styles.
+			HaloColors.addHaloColors(o, themeColor, fillColor0, fillColor1);
+
+			// Button-specific styles.
+			o.innerEdgeColor1 = ColorUtil.adjustBrightness2(fillColor0, -10);
+			o.innerEdgeColor2 = ColorUtil.adjustBrightness2(fillColor1, -25);
+		}
+
+		return cache[key];
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//  Constructor
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 *  Constructor.
+	 */
+	public function ButtonBarButtonSkin()
+	{
+		super();
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//  Overridden properties
+	//
+	//--------------------------------------------------------------------------
+
+	//----------------------------------
+	//  measuredWidth
+	//----------------------------------
+
+	/**
+	 *  @private
+	 */
+	override public function get measuredWidth():Number
+	{
+		return 50;
+	}
+
+	//----------------------------------
+	//  measuredHeight
+	//----------------------------------
+
+	/**
+	 *  @private
+	 */
+	override public function get measuredHeight():Number
+	{
+		return 22;
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//  Overridden methods
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 */
+	override protected function updateDisplayList(w:Number, h:Number):void
+	{
+		super.updateDisplayList(w, h);
+
+		// User-defined styles.
+		var borderColor:uint = getStyle("borderColor");
+		var cornerRadius:Number = getStyle("cornerRadius");
+		var fillAlphas:Array = getStyle("fillAlphas");
+		var fillColors:Array = getStyle("fillColors");
+		styleManager.getColorNames(fillColors);
+		var highlightAlphas:Array = getStyle("highlightAlphas");
+		var themeColor:uint = getStyle("themeColor");
+
+		// Derivative styles.
+		var derStyles:Object = calcDerivedStyles(themeColor, fillColors[0],
+												 fillColors[1]);
+
+		var borderColorDrk1:Number =
+			ColorUtil.adjustBrightness2(borderColor, -50);
+
+		var themeColorDrk1:Number =
+			ColorUtil.adjustBrightness2(themeColor, -25);
+
+		var emph:Boolean = false;
+
+		if (parent is Button)
+			emph = (parent as Button).emphasized;
+
+		var tmp:Number;
+
+		var bar:ButtonBar = parent ? ButtonBar(parent.parent) : null;
+		var horizontal:Boolean = true;
+		var pos:int = 0;
+
+		if (bar)
+		{
+			if (bar.direction == BoxDirection.VERTICAL)
+				horizontal = false;
+
+			// first: -1, middle: 0, last: 1
+			var index:int = bar.getChildIndex(parent);
+			pos = (index == 0 ? -1 : (index == bar.numChildren - 1 ? 1 : 0));
+		}
+
+		var radius:Object = getCornerRadius(pos, horizontal, cornerRadius);
+		var cr:Object = getCornerRadius(pos, horizontal, cornerRadius);
+		var cr1:Object = getCornerRadius(pos, horizontal, cornerRadius - 1);
+		var cr2:Object = getCornerRadius(pos, horizontal, cornerRadius - 2);
+		var cr3:Object = getCornerRadius(pos, horizontal, cornerRadius - 3);
+
+		graphics.clear();
+
+		switch (name)
+		{
+			case "selectedUpSkin":
+			case "selectedOverSkin":
+			{
+				var overFillColors:Array;
+				if (fillColors.length > 2)
+					overFillColors = [ fillColors[2], fillColors[3] ];
+				else
+					overFillColors = [ fillColors[0], fillColors[1] ];
+
+				var overFillAlphas:Array;
+				if (fillAlphas.length > 2)
+					overFillAlphas = [ fillAlphas[2], fillAlphas[3] ];
+  				else
+					overFillAlphas = [ fillAlphas[0], fillAlphas[1] ];
+
+				// button border/edge
+				drawRoundRect(
+					0, 0, w, h, cr,
+					[ themeColor, derStyles.themeColDrk1 ], 0.5,
+					verticalGradientMatrix(0, 0, w , h),
+					GradientType.LINEAR, null,
+					{ x: 1, y: 1, w: w - 2, h: h - 2, r: cr1 });
+
+				// button fill
+				drawRoundRect(
+					1, 1, w - 2, h - 2, cr1,
+					overFillColors, overFillAlphas,
+					verticalGradientMatrix(0, 0, w - 2, h - 2));
+
+				// top highlight
+				if (!(radius is Number))
+					{ radius.bl = radius.br = 0;}
+				drawRoundRect(
+					1, 1, w - 2, (h - 2) / 2, radius,
+					[ 0xFFFFFF, 0xFFFFFF ], highlightAlphas,
+					verticalGradientMatrix(1, 1, w - 2, (h - 2) / 2));
+				break;
+			}
+
+			case "overSkin":
+			{
+				// button border/edge
+				drawRoundRect(
+					0, 0, w, h, cr,
+					[ themeColor, derStyles.themeColDrk1 ], 0.5,
+					verticalGradientMatrix(0, 0, w, h));
+
+				// button fill
+				drawRoundRect(
+					1, 1, w - 2, h - 2, cr1,
+					[ derStyles.fillColorPress1, derStyles.fillColorPress2 ], 1,
+					verticalGradientMatrix(0, 0, w - 2, h - 2));
+
+				// top highlight
+				if (!(radius is Number))
+					{ radius.bl = radius.br = 0;}
+				drawRoundRect(
+					1, 1, w - 2, (h - 2) / 2, radius,
+					[ 0xFFFFFF, 0xFFFFFF ], highlightAlphas,
+					verticalGradientMatrix(1, 1, w - 2, (h - 2) / 2));
+
+				break;
+			}
+		}
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//  Methods
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 */
+	private function getCornerRadius(pos:int, horizontal:Boolean,
+									 radius:Number):Object
+	{
+		if (pos == 0)
+			return 0;
+
+		radius = Math.max(0, radius);
+
+		if (horizontal)
+		{
+			if (pos == -1)
+				return { tl: radius, tr: 0, bl: radius, br: 0 };
+			else // pos == 1
+				return { tl: 0, tr: radius, bl: 0, br: radius };
+		}
+		else
+		{
+			if (pos == -1)
+				return { tl: radius, tr: radius, bl: 0, br: 0 };
+			else // pos == 1
+				return { tl: 0, tr: 0, bl: radius, br: radius };
+		}
+	}
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/samples/flexstore/Product.as
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/samples/flexstore/Product.as b/FlexStore/spark/src/samples/flexstore/Product.as
new file mode 100644
index 0000000..040fb8f
--- /dev/null
+++ b/FlexStore/spark/src/samples/flexstore/Product.as
@@ -0,0 +1,78 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+[Bindable]
+public class Product
+{
+
+    public var productId:int;
+    public var name:String;
+    public var description:String;
+    public var price:Number;
+    public var image:String;
+    public var experience:String;
+    public var blazeds:Boolean;
+    public var mobile:Boolean;
+    public var video:Boolean;
+    public var highlight1:String;
+    public var highlight2:String;
+    public var qty:int;
+
+    public function Product()
+    {
+
+    }
+
+    public function fill(obj:Object):void
+    {
+        for (var i:String in obj)
+        {
+            this[i] = obj[i];
+        }
+    }
+
+    [Bindable(event="propertyChange")]
+    public function get featureString():String
+    {
+    	var str:String = "";
+    	if (blazeds)
+    		str += "BlazeDS";
+
+		if (mobile)
+		{
+			if (str.length > 0)
+				str += "\n";
+			str += "Mobile";
+		}
+
+		if (video)
+		{
+			if (str.length > 0)
+				str += "\n";
+			str += "Video";
+		}
+
+		return str;
+    }
+
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/samples/flexstore/ProductFilter.as
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/samples/flexstore/ProductFilter.as b/FlexStore/spark/src/samples/flexstore/ProductFilter.as
new file mode 100644
index 0000000..d182371
--- /dev/null
+++ b/FlexStore/spark/src/samples/flexstore/ProductFilter.as
@@ -0,0 +1,56 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+[Bindable]
+public class ProductFilter
+{
+    public var count:int;
+    public var experience:String;
+    public var minPrice:Number;
+    public var maxPrice:Number;
+    public var blazeds:Boolean;
+    public var mobile:Boolean;
+    public var video:Boolean;
+    
+    public function ProductFilter()
+    {
+        super();
+    }
+    
+    public function accept(product:Product):Boolean
+    {
+        //price is often the first test so let's fail fast if possible
+        if (minPrice > product.price || maxPrice < product.price)
+            return false;
+        if (experience != "All" && experience > product.experience)
+            return false;
+        if (blazeds && !product.blazeds)
+            return false;
+        if (mobile && !product.mobile)
+            return false;
+        if (video && !product.video)
+            return false;
+        
+        return true;
+    }
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/samples/flexstore/ProductFilterEvent.as
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/samples/flexstore/ProductFilterEvent.as b/FlexStore/spark/src/samples/flexstore/ProductFilterEvent.as
new file mode 100644
index 0000000..b13af3e
--- /dev/null
+++ b/FlexStore/spark/src/samples/flexstore/ProductFilterEvent.as
@@ -0,0 +1,39 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+import flash.events.Event;
+
+public class ProductFilterEvent extends Event
+{
+    public static const FILTER:String = "filter";
+    
+    public var live:Boolean;
+    public var filter:ProductFilter;
+    
+    public function ProductFilterEvent(filter:ProductFilter, live:Boolean)
+    {
+        super(FILTER);
+        this.filter = filter;
+        this.live = live;
+    }
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/samples/flexstore/ProductListEvent.as
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/samples/flexstore/ProductListEvent.as b/FlexStore/spark/src/samples/flexstore/ProductListEvent.as
new file mode 100644
index 0000000..fb4992f
--- /dev/null
+++ b/FlexStore/spark/src/samples/flexstore/ProductListEvent.as
@@ -0,0 +1,42 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+import flash.events.Event;
+
+public class ProductListEvent extends Event
+{
+    public static const ADD_PRODUCT:String = "addProduct";
+    public static const DUPLICATE_PRODUCT:String = "duplicateProduct";
+    public static const REMOVE_PRODUCT:String = "removeProduct";
+    public static const PRODUCT_QTY_CHANGE:String = "productQtyChange";
+    
+    public var product:Product;
+    
+    //making the default bubbles behavior of the event to true since we want
+    //it to bubble out of the ProductListItem and beyond
+    public function ProductListEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false)
+    {
+        super(type, bubbles, cancelable);
+    }
+    
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/samples/flexstore/ProductThumbEvent.as
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/samples/flexstore/ProductThumbEvent.as b/FlexStore/spark/src/samples/flexstore/ProductThumbEvent.as
new file mode 100644
index 0000000..e967daf
--- /dev/null
+++ b/FlexStore/spark/src/samples/flexstore/ProductThumbEvent.as
@@ -0,0 +1,45 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+    
+import flash.events.Event;
+
+public class ProductThumbEvent extends Event
+{
+    public static const PURCHASE:String = "purchase";
+    public static const COMPARE:String = "compare";
+    public static const DETAILS:String = "details";
+    public static const BROWSE:String = "browse";
+    
+    public var product:Product;
+    
+    public function ProductThumbEvent(type:String, product:Product)
+    {
+        super(type);
+        this.product = product;
+    }
+    
+    override public function clone():Event
+    {
+        return new ProductThumbEvent(type, product);
+    }
+}
+
+}
\ No newline at end of file


[2/4] add mx and spark versions of FlexStore

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/HomeView.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/HomeView.mxml b/FlexStore/spark/src/HomeView.mxml
new file mode 100644
index 0000000..a1ad46f
--- /dev/null
+++ b/FlexStore/spark/src/HomeView.mxml
@@ -0,0 +1,171 @@
+<?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.
+
+-->
+<!--
+This component is primarily static and is only meant to show what other
+pages of the store could look like.
+
+Note that this page was put together in the Design view so you'll see more
+hard coded locations and sizes.
+
+Also note when working with a Canvas that using the constraint styles 
+(e.g., left, top, right, bottom) can provide better layout predictability than 
+using x and y, especially when percentage widths and heights are used.
+
+Width and height are hard-coded in the root tag to help the Design view.
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
+           xmlns:s="library://ns.adobe.com/flex/spark"
+           xmlns="*" width="990" height="550">
+	<fx:Script>
+		<![CDATA[
+			import mx.controls.Alert;
+
+			public function updateMapImage():void
+			{
+				mapImage.source = mapCanvas.getStyle('dottedMap');
+			}
+		]]>
+	</fx:Script>
+	<s:HGroup width="100%" height="100%" y="0" x="0" styleName="colorPanel">
+	
+		<s:VGroup width="230" height="100%">
+			<s:Group width="100%" height="100%">
+			
+				<s:BorderContainer left="10" top="10" width="100%" height="60" backgroundColor="#ebebe9" styleName="homeSection">
+					<s:Label left="10" top="10" text="Search Developers" height="22" styleName="sectionHeader"/>
+					<s:Button left="168" top="30" label="Go" width="47" height="20" styleName="glass" click="Alert.show('This feature is not implemented in this sample', 'Go')"/>
+					<s:TextInput left="10" top="30" height="20" width="150"/>
+				</s:BorderContainer>
+				
+				<s:BorderContainer left="10" top="78" width="100%" height="280" backgroundColor="#ffffff" styleName="homeSection">
+					<s:VGroup left="10" top="10" width="100%" height="100%" gap="0">
+						<s:Label text="Flex Experts That Can Help You" styleName="sectionHeader"/>
+						<s:Line height="5" width="197"/>
+						<s:Label text="General" styleName="homeProgramHeader"/>
+						<s:Label text="BlazeDS Experts" fontSize="9"/>
+						<s:Spacer height="8" width="100%"/>
+						<s:Label text="Server-side" styleName="homeProgramHeader"/>
+						<s:Label text="Java, PHP Developers" fontSize="9"/>
+						<s:Spacer height="8" width="100%"/>
+						<s:Label text="Mobile" styleName="homeProgramHeader"/>
+						<s:Label text="Android, IOS and more" fontSize="9"/>
+						<s:Spacer height="8" width="100%"/>
+						<s:Label text="Students" styleName="homeProgramHeader"/>
+						<s:Label text="Free Assistance" fontSize="9"/>
+						<s:Spacer height="8" width="100%"/>
+					</s:VGroup>
+				</s:BorderContainer>
+				
+				<s:BorderContainer left="10" top="366" width="100%" height="174" styleName="homeSection" backgroundColor="#ebebe9">
+					<s:VGroup left="10" top="10" width="100%" height="100%" gap="0">
+					
+						<s:Label text="Manage My Account" styleName="sectionHeader"/>
+						
+						<s:Label text="Phone Number"/>
+						
+						<s:HGroup width="100%" height="25" horizontalAlign="left" verticalAlign="middle">
+							<s:TextInput height="20" width="40"/>
+							<s:Line width="8" height="25"/>
+							<s:TextInput height="20" width="40"/>
+							<s:Line width="8" height="25"/>
+							<s:TextInput height="20" width="40"/>
+						</s:HGroup>
+						
+						<s:Label text="Password"/>
+						<s:TextInput height="20"/>
+						<s:Spacer height="8" width="100%"/>
+						
+						<s:CheckBox label="Remember my phone number" selected="true"/>
+						<s:Spacer height="8" width="100%"/>
+						
+						<s:Button label="Login" styleName="glass" height="20" width="55" click="Alert.show('This feature is not implemented in this sample', 'Login')"/>
+						
+					</s:VGroup>
+				</s:BorderContainer>
+				
+			</s:Group>
+			
+		</s:VGroup>
+		
+		<s:VGroup width="750" height="100%">
+			<s:Group width="100%" height="100%">
+			
+			    <!-- can't use binding to set the mapImage source because the style isn't available early enough -->
+				<s:Group id="mapCanvas" width="100%" height="35%" styleName="homeMap" right="10" top="10">
+					<s:Image id="mapImage" width="487" height="100%" alpha="1.0" left="10" top="10"/>
+					<s:Label y="110" text="US Developers . Flex . FlexJS" width="95%" height="40" horizontalCenter="0" fontWeight="bold" fontSize="22" color="#ffffff" fontFamily="Arial" textAlign="center"/>
+					<s:Label text="Learn More &gt;&gt;" width="95" bottom="10" right="10" fontSize="12" fontFamily="Arial"/>
+					<s:Label text="$60/hr" fontSize="20" right="10" top="10" color="#ffffff" fontWeight="bold" fontFamily="Arial"/>
+					<s:Label text="Rates as low as" x="551" top="16" fontSize="12"/>
+				</s:Group>
+				
+				<s:BorderContainer width="100%" height="330" backgroundColor="#ffffff" borderStyle="solid" cornerRadius="4" bottom="10" right="10">
+					
+					<s:Label left="10" top="10" text="Featured Developers" width="173" height="25" styleName="sectionHeader"/>
+					
+					<s:HGroup left="0" top="43" width="100%" height="100%">
+						
+						<s:VGroup width="33%" height="100%">
+							
+							<s:Group width="100%">
+								<s:Image source="@Embed('/assets/akotter.jpg')" horizontalCenter="0" verticalCenter="0"/>
+							</s:Group>
+							
+							<s:Group width="100%">
+								<s:Label text="Annette Kotter" horizontalCenter="0" id="feat_prod_1" fontWeight="bold" fontSize="12"/>
+							</s:Group>
+							
+						</s:VGroup>
+						
+						<s:VGroup width="33%" height="100%">
+							
+							<s:Group width="100%">
+								<s:Image horizontalCenter="0" verticalCenter="0" source="@Embed('/assets/bcrater.jpg')"/>
+							</s:Group>
+							
+							<s:Group width="100%">
+								<s:Label text="Ben Crater" horizontalCenter="0" id="feat_prod_2" fontWeight="bold" fontSize="12"/>
+							</s:Group>
+							
+						</s:VGroup>
+						
+						<s:VGroup width="33%" height="100%">
+							
+							<s:Group width="100%">
+								<s:Image horizontalCenter="0" verticalCenter="0" source="@Embed('/assets/jproctor.jpg')"/>
+							</s:Group>
+							
+							<s:Group width="100%">
+								<s:Label text="Jane Proctor" horizontalCenter="0" id="feat_prod_3" fontWeight="bold" fontSize="12"/>
+							</s:Group>
+							
+						</s:VGroup>
+						
+					</s:HGroup>
+					
+				</s:BorderContainer>
+				
+			</s:Group>
+		
+		</s:VGroup>
+		
+	</s:HGroup>
+	
+</s:Group>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/ProductsView.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/ProductsView.mxml b/FlexStore/spark/src/ProductsView.mxml
new file mode 100644
index 0000000..ac76f3f
--- /dev/null
+++ b/FlexStore/spark/src/ProductsView.mxml
@@ -0,0 +1,116 @@
+<?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.
+
+-->
+<!-- width and height hard-coded in the root tag to better support the 
+     Design view in FlexBuilder since we know the width and height from the 
+     settings in flexstore.mxml -->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
+           xmlns:s="library://ns.adobe.com/flex/spark"
+    xmlns:productsView="productsView.*"
+    width="990" height="550"
+    currentState="showFilter"
+    creationComplete="trace('pview')"
+    >
+
+    <fx:Script>
+        <![CDATA[
+        import mx.collections.ArrayCollection;
+        import samples.flexstore.Product;
+                
+        private var _catalog:ArrayCollection;
+        
+        [Bindable]
+        public function get catalog():ArrayCollection
+        {
+            return _catalog;
+        }
+        
+        public function set catalog(c:ArrayCollection):void
+        {
+            _catalog = c;
+            if (filterPanel != null)
+            {
+                filterPanel.filter.count = c.length;
+            }
+        }
+        
+        public function addToCompare(product:Product):void
+        {
+            //setting the state before adding the product avoids jumpiness in the transition, not sure why
+            currentState = 'showFilter';
+            filterPanel.productList.addProduct(product);
+        }
+        
+        public function addToCart(product:Product):void
+        {
+            //setting the state before adding the product avoids jumpiness in the transition, not sure why
+            currentState = 'showCart'; 
+            cartPanel.productList.addProduct(product);
+        }
+        
+        
+        ]]>
+    </fx:Script>
+    
+    <s:HGroup 
+        styleName="colorPanel"
+        height="100%" width="100%" 
+        gap="0">
+    
+        <productsView:Grip id="filterGrip" gripIcon="@Embed('/assets/icon_magnifier.png')" 
+            gripTip="Show filter panel" click="currentState = 'showFilter'"/>
+    
+        <productsView:ProductFilterPanel id="filterPanel" width="265" height="100%"
+            filter="catalogPanel.filter(event.filter, event.live)"
+            compare="catalogPanel.compare(filterPanel.productList.getProducts())"
+            creationComplete="if (catalog) filterPanel.filter.count = catalog.length"/>
+    
+        <s:Spacer width="100%"/>
+        
+        <productsView:ProductCart id="cartPanel" width="265" height="100%"/>
+
+        <productsView:Grip id="cartGrip" gripIcon="@Embed('/assets/icon_cart_empty.png')"
+            gripTip="Show cart" click="currentState = 'showCart'"/>
+    
+    </s:HGroup>
+        
+    <productsView:ProductCatalogPanel id="catalogPanel" y="4" width="685" height="540"
+                                      left.showFilter="285"
+                                      right.showCart="285"
+        catalog="{catalog}"
+        compare="addToCompare(event.product)"
+        purchase="addToCart(event.product)"
+        cartCount="{cartPanel.numProducts}"/>
+    
+    <s:states>
+       <s:State name="showFilter" />
+       <s:State name="showCart" />
+    </s:states>
+    
+    <!-- 
+      make sure to use transitions here instead of applying a Move effect
+      to the Panel itself which will result in odd behavior
+    -->
+    <s:transitions>
+       <s:Transition fromState="*" toState="*">
+          <s:Move target="{catalogPanel}" />
+       </s:Transition>
+    </s:transitions>
+        
+</s:Group>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/SupportView.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/SupportView.mxml b/FlexStore/spark/src/SupportView.mxml
new file mode 100644
index 0000000..a2a089b
--- /dev/null
+++ b/FlexStore/spark/src/SupportView.mxml
@@ -0,0 +1,144 @@
+<?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.
+
+-->
+<!--
+This component is primarily static and is only meant to show what other
+pages of the store could look like.
+
+Note that this page was put together in the Design view so you'll see more
+hard coded locations and sizes.
+
+We did not have sizing issues here as much so you'll see more hardcoded 
+"y" values rather than "top."
+
+The width and height are hard-coded in the root tag to help the Design view.
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
+           xmlns:s="library://ns.adobe.com/flex/spark" xmlns="*" alpha="1.0"
+    width="990" height="550">
+	
+	<fx:Script>
+	    <![CDATA[
+	       import mx.controls.Alert; 
+	    ]]>
+	</fx:Script>
+	
+    <fx:Declarations>
+        <fx:XML id="locationsModel">
+            <root>
+                <location image="assets/support_mapmarker_a.png" name="601 Townsend St" /> 
+                <location image="assets/support_mapmarker_b.png" name="Location B" />
+                <location image="assets/support_mapmarker_c.png" name="Location C" />	   	   
+            </root> 
+        </fx:XML>   
+        
+        <s:ArrayCollection id="locations" source="{locationsModel.root.location}"/>        
+    </fx:Declarations>
+	
+	<s:HGroup x="0" y="0" width="100%" height="100%" styleName="colorPanel">
+	
+		<s:VGroup width="32%" height="100%">
+			<s:Group width="100%" height="60%">
+			
+				<s:Label y="10" text="Check Location" styleName="sectionHeader" x="20"/>
+				
+				<s:Form width="95%" height="150" y="64" horizontalCenter="0">
+					<s:layout>
+                        <s:VerticalLayout gap="8" paddingBottom="0" paddingRight="0" paddingTop="5"  />
+                    </s:layout>
+					<s:FormItem label="Address:" width="100%">
+						<s:TextInput id="address" width="90%"/>
+					</s:FormItem>
+					
+					<s:FormItem label="City:" width="100%">
+						<s:TextInput id="city" width="60%"/>						
+					</s:FormItem>
+					
+					<s:FormItem label="State:" width="100%">
+						<s:ComboBox id="state" width="50%">
+							<s:dataProvider>
+                                <s:ArrayList>
+                                    <fx:Array>
+                                        <fx:String>California</fx:String>
+                                        <fx:String>Nevada</fx:String>
+                                        <fx:String>Oregon</fx:String>
+                                        <fx:String>Washington</fx:String>
+                                    </fx:Array>                                    
+                                </s:ArrayList>
+            				</s:dataProvider>
+						</s:ComboBox>
+					</s:FormItem>
+					
+					<s:FormItem label="ZIP Code:" width="100%">
+						<s:TextInput id="zip" width="30%"/>
+					</s:FormItem>
+					
+				</s:Form>
+				
+				<s:Label y="38" text="Option1: Enter Address" horizontalCenter="0" styleName="instructions"/>
+				
+				<s:Button y="297" label="Locate" click="Alert.show('This feature is not implemented in this sample', 'Locate')" horizontalCenter="0"/>
+				
+				<s:HGroup y="327" width="80%" height="20" horizontalAlign="center" verticalAlign="middle" horizontalCenter="0">
+					<s:Line width="60">
+                        <s:stroke>
+                            <s:SolidColorStroke color="#000000"/>
+                        </s:stroke>
+                    </s:Line>
+					<s:Label text="OR"/>
+                    <s:Line width="60">
+                        <s:stroke>
+                            <s:SolidColorStroke color="#000000"/>
+                        </s:stroke>
+                    </s:Line>
+				</s:HGroup>
+				
+				<s:Label y="355" text="Option 2: Drag this marker into the map" horizontalCenter="0" styleName="instructions"/>
+				
+				<s:Image y="380" horizontalCenter="0" source="@Embed('/assets/support_mapmarker_plus.png')"/>
+				
+				<s:Line y="415" horizontalCenter="0" width="200" alpha="0.6"/>
+				
+			</s:Group>
+			
+			<s:Group width="100%" height="40%">
+				<s:VGroup width="80%" height="90%" horizontalCenter="0" top="0">
+					<s:Label text="Location" styleName="instructions"/>
+					<s:DataGroup width="100%" dataProvider="{locations}">
+                        <s:itemRenderer>
+                            <fx:Component>
+                                <s:ItemRenderer styleName="listItem" width="100%">
+                                    <s:Image width="21" height="25" source="{data.image}" />
+                                    <s:Label width="100%" text="{data.name}" />
+                                </s:ItemRenderer>                                                            
+                            </fx:Component>
+                        </s:itemRenderer>
+					</s:DataGroup>
+				</s:VGroup>
+			</s:Group>
+			
+		</s:VGroup>
+		
+		<s:Group width="68%" height="100%">
+			<s:Image source="@Embed('/assets/support_map.png')" fillMode="scale" left="2" right="2" top="2" bottom="2"/>
+		</s:Group>
+		
+	</s:HGroup>
+	
+</s:Group>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/akotter.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/akotter.jpg b/FlexStore/spark/src/assets/akotter.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/spark/src/assets/akotter.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/bcrater.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/bcrater.jpg b/FlexStore/spark/src/assets/bcrater.jpg
new file mode 100644
index 0000000..fd15d59
Binary files /dev/null and b/FlexStore/spark/src/assets/bcrater.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/beige_background.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/beige_background.jpg b/FlexStore/spark/src/assets/beige_background.jpg
new file mode 100644
index 0000000..8f034ba
Binary files /dev/null and b/FlexStore/spark/src/assets/beige_background.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/beige_dotted_map.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/beige_dotted_map.png b/FlexStore/spark/src/assets/beige_dotted_map.png
new file mode 100644
index 0000000..e88d9ef
Binary files /dev/null and b/FlexStore/spark/src/assets/beige_dotted_map.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/blue_background.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/blue_background.jpg b/FlexStore/spark/src/assets/blue_background.jpg
new file mode 100644
index 0000000..361ce0e
Binary files /dev/null and b/FlexStore/spark/src/assets/blue_background.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/blue_dotted_map.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/blue_dotted_map.png b/FlexStore/spark/src/assets/blue_dotted_map.png
new file mode 100644
index 0000000..5fa6714
Binary files /dev/null and b/FlexStore/spark/src/assets/blue_dotted_map.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/grip.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/grip.png b/FlexStore/spark/src/assets/grip.png
new file mode 100644
index 0000000..64ee835
Binary files /dev/null and b/FlexStore/spark/src/assets/grip.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_cart_empty.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_cart_empty.png b/FlexStore/spark/src/assets/icon_cart_empty.png
new file mode 100644
index 0000000..562064b
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_cart_empty.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_cart_full.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_cart_full.png b/FlexStore/spark/src/assets/icon_cart_full.png
new file mode 100644
index 0000000..007b08c
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_cart_full.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_compare.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_compare.png b/FlexStore/spark/src/assets/icon_compare.png
new file mode 100644
index 0000000..efc3ea1
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_compare.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_details.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_details.png b/FlexStore/spark/src/assets/icon_details.png
new file mode 100644
index 0000000..2d2bfb9
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_details.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_magnifier.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_magnifier.png b/FlexStore/spark/src/assets/icon_magnifier.png
new file mode 100644
index 0000000..939f814
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_magnifier.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/icon_tiles.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/icon_tiles.png b/FlexStore/spark/src/assets/icon_tiles.png
new file mode 100644
index 0000000..dbf75b6
Binary files /dev/null and b/FlexStore/spark/src/assets/icon_tiles.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/jproctor.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/jproctor.jpg b/FlexStore/spark/src/assets/jproctor.jpg
new file mode 100644
index 0000000..1111787
Binary files /dev/null and b/FlexStore/spark/src/assets/jproctor.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/logo_blue.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/logo_blue.png b/FlexStore/spark/src/assets/logo_blue.png
new file mode 100644
index 0000000..132b894
Binary files /dev/null and b/FlexStore/spark/src/assets/logo_blue.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/logo_orange.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/logo_orange.png b/FlexStore/spark/src/assets/logo_orange.png
new file mode 100644
index 0000000..c776c8c
Binary files /dev/null and b/FlexStore/spark/src/assets/logo_orange.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/abrilliam.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/abrilliam.jpg b/FlexStore/spark/src/assets/pic/abrilliam.jpg
new file mode 100644
index 0000000..6954858
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/abrilliam.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/akotter.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/akotter.jpg b/FlexStore/spark/src/assets/pic/akotter.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/akotter.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/bcrater.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/bcrater.jpg b/FlexStore/spark/src/assets/pic/bcrater.jpg
new file mode 100644
index 0000000..fd15d59
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/bcrater.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/bleporte.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/bleporte.jpg b/FlexStore/spark/src/assets/pic/bleporte.jpg
new file mode 100644
index 0000000..c4769e8
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/bleporte.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/bvanbrocklin.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/bvanbrocklin.jpg b/FlexStore/spark/src/assets/pic/bvanbrocklin.jpg
new file mode 100644
index 0000000..489fa2e
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/bvanbrocklin.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/ccarpenter.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/ccarpenter.jpg b/FlexStore/spark/src/assets/pic/ccarpenter.jpg
new file mode 100644
index 0000000..c1dc3d8
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/ccarpenter.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/clampberto.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/clampberto.jpg b/FlexStore/spark/src/assets/pic/clampberto.jpg
new file mode 100644
index 0000000..9deacd2
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/clampberto.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/davenon.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/davenon.jpg b/FlexStore/spark/src/assets/pic/davenon.jpg
new file mode 100644
index 0000000..6a2a142
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/davenon.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/dmcgoyal.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/dmcgoyal.jpg b/FlexStore/spark/src/assets/pic/dmcgoyal.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/dmcgoyal.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/dwillhelm.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/dwillhelm.jpg b/FlexStore/spark/src/assets/pic/dwillhelm.jpg
new file mode 100644
index 0000000..fd15d59
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/dwillhelm.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/esunderland.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/esunderland.jpg b/FlexStore/spark/src/assets/pic/esunderland.jpg
new file mode 100644
index 0000000..c4769e8
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/esunderland.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/jproctor.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/jproctor.jpg b/FlexStore/spark/src/assets/pic/jproctor.jpg
new file mode 100644
index 0000000..1111787
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/jproctor.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/mfields.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/mfields.jpg b/FlexStore/spark/src/assets/pic/mfields.jpg
new file mode 100644
index 0000000..489fa2e
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/mfields.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/pdempsey.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/pdempsey.jpg b/FlexStore/spark/src/assets/pic/pdempsey.jpg
new file mode 100644
index 0000000..9deacd2
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/pdempsey.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/ptranep.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/ptranep.jpg b/FlexStore/spark/src/assets/pic/ptranep.jpg
new file mode 100644
index 0000000..4b9a03b
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/ptranep.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/rcrawley.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/rcrawley.jpg b/FlexStore/spark/src/assets/pic/rcrawley.jpg
new file mode 100644
index 0000000..9b60320
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/rcrawley.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/rdreifus.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/rdreifus.jpg b/FlexStore/spark/src/assets/pic/rdreifus.jpg
new file mode 100644
index 0000000..6a2a142
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/rdreifus.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/pic/twong.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/pic/twong.jpg b/FlexStore/spark/src/assets/pic/twong.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/spark/src/assets/pic/twong.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/support_map.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/support_map.png b/FlexStore/spark/src/assets/support_map.png
new file mode 100644
index 0000000..c2f2394
Binary files /dev/null and b/FlexStore/spark/src/assets/support_map.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/support_mapmarker_a.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/support_mapmarker_a.png b/FlexStore/spark/src/assets/support_mapmarker_a.png
new file mode 100644
index 0000000..20c21e1
Binary files /dev/null and b/FlexStore/spark/src/assets/support_mapmarker_a.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/support_mapmarker_b.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/support_mapmarker_b.png b/FlexStore/spark/src/assets/support_mapmarker_b.png
new file mode 100644
index 0000000..069ccd8
Binary files /dev/null and b/FlexStore/spark/src/assets/support_mapmarker_b.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/support_mapmarker_c.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/support_mapmarker_c.png b/FlexStore/spark/src/assets/support_mapmarker_c.png
new file mode 100644
index 0000000..f6b587e
Binary files /dev/null and b/FlexStore/spark/src/assets/support_mapmarker_c.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/support_mapmarker_plus.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/support_mapmarker_plus.png b/FlexStore/spark/src/assets/support_mapmarker_plus.png
new file mode 100644
index 0000000..4192088
Binary files /dev/null and b/FlexStore/spark/src/assets/support_mapmarker_plus.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/assets/trashcan.png
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/assets/trashcan.png b/FlexStore/spark/src/assets/trashcan.png
new file mode 100644
index 0000000..9df75d7
Binary files /dev/null and b/FlexStore/spark/src/assets/trashcan.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/beige.css
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/beige.css b/FlexStore/spark/src/beige.css
new file mode 100644
index 0000000..48de215
--- /dev/null
+++ b/FlexStore/spark/src/beige.css
@@ -0,0 +1,168 @@
+/*
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+*/
+
+/* Style for color-specific state - Beige */
+
+@namespace "library://ns.adobe.com/flex/spark";
+
+/*
+//----------------------------
+//  Global styles
+//----------------------------
+*/
+.global
+{
+    highlightAlphas:        .5, .25;
+    borderColor:            #939A9D;
+    headerColors:           #A65904, #E68701;
+    themeColor:             #75B1CE;
+    rollOverColor:          #D6E6EE;
+    selectionColor:         #B8D5E4;
+}
+
+/*
+//----------------------------
+// Type selectors
+//----------------------------
+*/
+Application
+{
+    backgroundColor:		#EAE6DD;
+    backgroundImage:        Embed("assets/beige_background.jpg");
+}
+
+/*
+//----------------------------
+// Apply to Panels and Alerts by default
+//----------------------------
+*/
+.windowStatus {
+	color: #FFCC99;
+}
+
+.windowStyles {		/* catalog panel's title text */
+	color: #FFCC99;
+}
+
+/*
+//----------------------------
+// Named styles
+//----------------------------
+*/
+
+.colorPanel /* for the background of some surfaces */
+{
+    borderStyle:            "solid";
+    borderThickness:        0;
+    backgroundColor:		#BCB29F;
+    backgroundAlpha:		0.4;
+    color: 					#170505;
+    cornerRadius:           4;
+    dropShadowEnabled:      true;
+}
+
+.homeProgramHeader /* in HomeView */
+{
+    fontWeight:             "bold";
+    fontSize:               13;
+    color:                  #BE7E3F;
+}
+
+.homeMap
+{
+    borderStyle:            "solid";
+    cornerRadius:           4;
+    backgroundColor:        #BE7E3F;
+    alpha:                  1;
+    dottedMap:              Embed("assets/beige_dotted_map.png");
+}
+
+.instructions
+{
+    alpha:                  .85;
+    color:                  #5C5857;
+}
+
+.storeControlBar
+{
+    fillAlphas: 			.60, .40;
+    fillColors: 			#8F8879, #BCB29F;
+    highlightAlphas:		.05, .25;
+    cornerRadius: 			3;
+	shadowDistance:         4;
+	paddingLeft:            0;
+	paddingRight:           0;
+	paddingTop:             0;
+	paddingBottom:          0;
+	horizontalGap:          0;
+    storeLogo:              Embed("assets/logo_orange.png");
+}
+
+.storeButtonBar
+{
+    cornerRadius:           0;
+    buttonStyleName:        "storeButton";
+    themeColor:             #A65904;
+}
+
+.storeButton
+{
+    cornerRadius:           0;
+    fillColors:             #8F8879, #BCB29F, #A65904, #E68701;
+    fillAlphas:             1, 1;
+    highlightAlphas:        .5, .25;
+    fontWeight:             "normal";
+    selectedOverSkin:       ClassReference("samples.flexstore.ButtonBarButtonSkin");
+    selectedUpSkin:         ClassReference("samples.flexstore.ButtonBarButtonSkin");
+    overSkin:               ClassReference("samples.flexstore.ButtonBarButtonSkin");
+}
+
+.catalogTitleButtonSelected
+{
+    color:                  #FFFFFF;
+    fontWeight:             "bold";
+}
+
+.catalogTitleButtonDeselected
+{
+    color:                  #222222;
+    fontWeight:             "bold";
+}
+
+.catalogTitleButtonHighlighted
+{
+    color:                  #FFCC99;
+    fontWeight:             "bold";
+}
+
+.catalogPanel
+{
+    highlightAlphas:        .5, .25;
+    headerColors:           #A65904, #E68701;
+    borderAlpha:            1;
+    borderColor:            #FFFFFF;
+    borderThicknessRight:   1;
+    borderThicknessBottom:  1;
+    paddingRight:           0;
+    paddingBottom:          0;
+}
+
+

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/blue.css
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/blue.css b/FlexStore/spark/src/blue.css
new file mode 100644
index 0000000..58e98cd
--- /dev/null
+++ b/FlexStore/spark/src/blue.css
@@ -0,0 +1,165 @@
+/*
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+*/
+
+/* Style for color-specific state - Beige */
+
+/*
+//----------------------------
+//  Global styles
+//----------------------------
+*/
+.global
+{
+    highlightAlphas:        .5, .25;
+    borderColor:            #939A9D;
+    headerColors:           #456F84, #9ABBC9;
+    themeColor:             #75B1CE;
+    rollOverColor:          #D6E6EE;
+    selectionColor:         #B8D5E4;
+}
+
+/*
+//----------------------------
+// Type selectors
+//----------------------------
+*/
+Application
+{
+    backgroundColor:		#AAB2B7;
+    backgroundImage:        Embed("assets/blue_background.jpg");
+}
+
+/*
+//----------------------------
+// Apply to Panels and Alerts by default
+//----------------------------
+*/
+.windowStatus {
+	color: #BDE9FA;
+}
+
+.windowStyles {		/* catalog panel's title text */
+	color: #BDE9FA;
+}
+
+/*
+//----------------------------
+// Named styles
+//----------------------------
+*/
+
+.colorPanel /* for the background of some surfaces */
+{
+    borderStyle:            "solid";
+    borderThickness:        0;
+    backgroundColor:		#BDD6E2;
+    backgroundAlpha:		0.4;
+    color: 					#170505;
+    cornerRadius:           4;
+    dropShadowEnabled:      true;
+}
+
+.homeProgramHeader /* in HomeView */
+{
+    fontWeight:             "bold";
+    fontSize:               13;
+    color:                  #7AA4B9;
+}
+
+.homeMap
+{
+    borderStyle:            "solid";
+    cornerRadius:           4;
+    backgroundColor:        #7AA4B9;
+    alpha:                  1;
+    dottedMap:              Embed("assets/blue_dotted_map.png");
+}
+
+.instructions
+{
+    alpha:                  .85;
+    color:                  #5C5857;
+}
+
+.storeControlBar
+{
+    fillAlphas: 			.60, .40;
+    fillColors: 			#4A6F81, #BDD6E2;
+    highlightAlphas:		.05, .25;
+    cornerRadius: 			3;
+	shadowDistance:         4;
+	paddingLeft:            0;
+	paddingRight:           0;
+	paddingTop:             0;
+	paddingBottom:          0;
+	horizontalGap:          0;
+    storeLogo:              Embed("assets/logo_blue.png");
+}
+
+.storeButtonBar
+{
+    cornerRadius:           0;
+    buttonStyleName:        "storeButton";
+    themeColor:             #456F84;
+}
+
+.storeButton
+{
+    cornerRadius:           0;
+    fillColors:             #4A6F81, #BDD6E2, #456F84, #9ABBC9;
+    fillAlphas:             1, 1;
+    highlightAlphas:        .5, .25;
+    fontWeight:             "normal";
+    selectedOverSkin:       ClassReference("samples.flexstore.ButtonBarButtonSkin");
+    selectedUpSkin:         ClassReference("samples.flexstore.ButtonBarButtonSkin");
+    overSkin:               ClassReference("samples.flexstore.ButtonBarButtonSkin");
+}
+
+.catalogTitleButtonSelected
+{
+    color:                  #FFFFFF;
+    fontWeight:             "bold";
+}
+
+.catalogTitleButtonDeselected
+{
+    color:                  #222222;
+    fontWeight:             "bold";
+}
+
+.catalogTitleButtonHighlighted
+{
+    color:                  #BDE9FA;
+    fontWeight:             "bold";
+}
+
+.catalogPanel
+{
+    highlightAlphas:        .5, .25;
+    headerColors:           #456F84, #9ABBC9;
+    borderAlpha:            1;
+    borderColor:            #FFFFFF;
+    borderThicknessRight:   1;
+    borderThicknessBottom:  1;
+    paddingRight:           0;
+    paddingBottom:          0;
+}
+

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/data/catalog.xml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/data/catalog.xml b/FlexStore/spark/src/data/catalog.xml
new file mode 100644
index 0000000..423e177
--- /dev/null
+++ b/FlexStore/spark/src/data/catalog.xml
@@ -0,0 +1,256 @@
+<?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.
+ 
+ -->
+<catalog>
+
+    <product productId="1">
+        <name>Andrew Brilliam</name>
+        <description>15 years experience. 8 years with Flex.  Specializing in Text Layout Framework</description>
+        <price>60.00</price>
+        <image>assets/pic/abrilliam.jpg</image>
+        <experience>15</experience>
+        <blazeds>false</blazeds>
+        <mobile>false</mobile>
+        <video>false</video>
+        <highlight1>Text Layout Framework</highlight1>
+		<highlight2>Parsley</highlight2>
+    </product>
+
+    <product productId="2">
+        <name>Annette Kotter</name>
+        <description>Specializing in custom components.  PHP servers.</description>
+        <price>55</price>
+        <image>assets/pic/akotter.jpg</image>
+        <experience>3</experience>
+        <blazeds>true</blazeds>
+        <mobile>false</mobile>
+        <video>false</video>
+        <highlight1>Custom Components</highlight1>
+		<highlight2>PHP</highlight2>
+    </product>
+
+    <product productId="3">
+        <name>Ben Crater</name>
+        <description>Specializing in BlazeDS backends.</description>
+        <price>55</price>
+        <image>assets/pic/bcrater.jpg</image>
+        <experience>4</experience>
+        <blazeds>true</blazeds>
+        <mobile>false</mobile>
+        <video>false</video>
+        <highlight1>BlazeDS</highlight1>
+		<highlight2>Remote Object</highlight2>
+    </product>
+
+    <product productId="4">
+        <name>Beth Leporte</name>
+        <description>BlazeDS or PHP servers.  Multimedia messagin.</description>
+        <price>70.00</price>
+        <image>assets/pic/bleporte.jpg</image>
+        <experience>6</experience>
+        <blazeds>true</blazeds>
+        <mobile>false</mobile>
+        <video>false</video>
+        <highlight1>Multimedia messaging</highlight1>
+		<highlight2>BlazeDS</highlight2>
+    </product>
+
+    <product productId="5">
+        <name>Brad Van Brocklin</name>
+        <description>Emphasis on mobile application development</description>
+        <price>80</price>
+        <image>assets/pic/bvanbrocklin.jpg</image>
+        <experience>6</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>false</video>
+        <highlight1>Mobile</highlight1>
+		<highlight2>Android</highlight2>
+    </product>
+
+    <product productId="6">
+        <name>Carlos Carpenter</name>
+        <description>Built many mobile apps and video apps.</description>
+        <price>80</price>
+        <image>assets/pic/ccarpenter.jpg</image>
+        <experience>4</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Mobile</highlight1>
+		<highlight2>Video</highlight2>
+    </product>
+
+    <product productId="7">
+        <name>Christine Lampberto</name>
+        <description>7 years experience building mobile applications.</description>
+        <price>90</price>
+        <image>assets/pic/clampberto.jpg</image>
+        <experience>7</experience>
+        <blazeds>true</blazeds>
+        <mobile>true</mobile>
+        <video>false</video>
+        <highlight1>BlazeDS</highlight1>
+		<highlight2>Mobile</highlight2>
+    </product>
+
+    <product productId="8">
+        <name>Dee Dee Avenon</name>
+        <description>I've been making video apps for over 5 years and mobile apps for about 3 years.</description>
+        <price>100</price>
+        <image>assets/pic/davenon.jpg</image>
+        <experience>10</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="9">
+        <name>Denise McGoyal</name>
+        <description>Specializing in video sharing applicaions.  MObile apps too.</description>
+        <price>100</price>
+        <image>assets/pic/dmcgoyal.jpg</image>
+        <experience>5</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="10">
+        <name>Daniel Willhelm</name>
+        <description>I'm into mobile apps, video apps and social apps.</description>
+        <price>70</price>
+        <image>assets/pic/dwillhelm.jpg</image>
+        <experience>90</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="11">
+        <name>Eunice Sunderland</name>
+        <description>My recent focus is on mobile apps, but I have considerable experience in video apps as well.</description>
+        <price>150</price>
+        <image>assets/pic/esunderland.jpg</image>
+        <experience>30</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="12">
+        <name>Jane Proctor</name>
+        <description>I've been developing mobile companion apps for the past 3 years.</description>
+        <price>75</price>
+        <image>assets/pic/jproctor.jpg</image>
+        <experience>6</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="13">
+        <name>Mark Fields</name>
+        <description>Video is my favorite thing.  Mobile is also a favorite.</description>
+        <price>60</price>
+        <image>assets/pic/mfields.jpg</image>
+        <experience>70</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="14">
+        <name>Patricia Dempsey</name>
+        <description>I've been cranking out mobile apps for the past 6 years.  A few have involved video as well.</description>
+        <price>120</price>
+        <image>assets/pic/pdempsey.jpg</image>
+        <experience>7</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="15">
+        <name>Paul Trandep</name>
+        <description>I've been working on a mobile app that incorporates music.  It just shipped so now I'm looking for the next fun thing to work on.'</description>
+        <price>50</price>
+        <image>assets/pic/ptranep.jpg</image>
+        <experience>6</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="16">
+        <name>Roscoe Crawley</name>
+        <description>My main specialty is in BlazeDS connected to Flex.</description>
+        <price>59</price>
+        <image>assets/pic/rcrawley.jpg</image>
+        <experience>9</experience>
+        <blazeds>true</blazeds>
+        <mobile>false</mobile>
+        <video>false</video>
+        <highlight1>BlazeDS</highlight1>
+		<highlight2>Remote Object</highlight2>
+    </product>
+
+    <product productId="17">
+        <name>Renee Dreifus</name>
+            <description>I can do it all: BlazeDS, Mobile, Video.</description>
+        <price>79</price>
+        <image>assets/pic/rdreifus.jpg</image>
+        <experience>90</experience>
+        <blazeds>true</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="18">
+        <name>Tina Wong</name>
+        <description>I've been developing Flex apps since 1.5.  Most of my recent work has been on mobile apps.</description>
+        <price>109</price>
+        <image>assets/pic/twong.jpg</image>
+        <experience>9</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+</catalog>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/main.css
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/main.css b/FlexStore/spark/src/main.css
new file mode 100644
index 0000000..23fd5c2
--- /dev/null
+++ b/FlexStore/spark/src/main.css
@@ -0,0 +1,83 @@
+/*
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+*/
+
+/*
+//----------------------------
+//  Global styles
+//----------------------------
+*/
+.global {
+    color:                  #170505;
+    fillAlphas:             1.00, 1.00; /* last pair are for OVER state */
+    fillColors: 		    #FFFFFF, #DDDDDD, #FFFFFF, #EEEEEE;
+}
+
+/*
+//----------------------------
+// Type selectors
+//----------------------------
+*/
+
+HRule
+{
+    color:                  #666666;
+}
+
+/*
+//----------------------------
+// Named styles
+//----------------------------
+*/
+.glass {
+    borderColor:		    #767473;
+    fillAlphas: 		    .60, .60, .60, .60;
+    fillColors: 		    #888888, #F3F3F3, #9E9E9E, #FCFCFC;
+    highlightAlphas:	    .07, .45;
+}
+
+.glassSlider
+{
+    fillAlphas: 		    .80, .80, .80, .80;
+    fillColors: 		    #F3F3F3, #BBBBBB, #FCFCFC, #CCCCCC;
+}
+
+.listItem
+{
+    paddingLeft:            4;
+    paddingRight:           4;
+    horizontalGap:          5;
+    verticalAlign:          "middle";
+    backgroundColor:        #FFFFFF;
+    backgroundAlpha:        .5;
+    borderStyle:            "outset";
+}
+
+.sectionHeader
+{
+    fontWeight:             "bold";
+    fontSize:               11;
+}
+
+.homeSection
+{
+    cornerRadius:           4;
+    borderStyle:            "solid";
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/CatalogTitleButtons.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/CatalogTitleButtons.mxml b/FlexStore/spark/src/productsView/CatalogTitleButtons.mxml
new file mode 100644
index 0000000..db5abc3
--- /dev/null
+++ b/FlexStore/spark/src/productsView/CatalogTitleButtons.mxml
@@ -0,0 +1,64 @@
+<?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:HGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
+         xmlns:s="library://ns.adobe.com/flex/spark"
+    verticalAlign="middle" 
+    paddingTop="0" 
+    paddingBottom="0"
+	currentState="showFilter">
+    <fx:Script>
+        <![CDATA[
+            [Bindable]
+            public var cartCount:int;
+            
+            private function rollOverLabel(event:Event):void
+            {
+                Label(event.target).setStyle("styleName", "catalogTitleButtonHighlighted");
+            }
+            
+            private function rollOutLabel(event:Event):void
+            {
+                Label(event.target).setStyle("styleName", "catalogTitleButtonDeselected");
+            }
+        ]]>
+    </fx:Script>
+    
+    <s:Spacer width="100%" />
+    <s:Label id="findPhones" text="Find Developers" click="currentState = 'showFilter'"
+             styleName.showFilter="catalogTitleButtonSelected"
+             styleName.showCart="catalogTitleButtonDeselected"
+             rollOver.showCart="rollOverLabel(event)"
+             rollOut.showCart="rollOutLabel(event)"/>
+    <s:Line height="{findPhones.height * .75}" alpha=".75">
+        <s:stroke>
+            <s:SolidColorStroke color="#333333" />
+        </s:stroke>
+    </s:Line>
+    <s:Label id="viewCart" text="View Cart ({cartCount} items)" click="currentState = 'showCart'"
+             styleName.showFilter="catalogTitleButtonDeselected"
+             styleName.showCart="catalogTitleButtonSelected"
+             rollOver.showFilter="rollOverLabel(event)"
+             rollOut.showFilter="rollOutLabel(event)"/>
+    
+    <s:states>
+        <s:State name="showFilter" />
+        <s:State name="showCart" />
+    </s:states>
+</s:HGroup>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/Grip.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/Grip.mxml b/FlexStore/spark/src/productsView/Grip.mxml
new file mode 100644
index 0000000..1c0a8d9
--- /dev/null
+++ b/FlexStore/spark/src/productsView/Grip.mxml
@@ -0,0 +1,36 @@
+<?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:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
+         xmlns:s="library://ns.adobe.com/flex/spark" width="17" height="100%" 
+    paddingTop="10" horizontalAlign="center">
+    <fx:Script>
+        <![CDATA[
+           [Bindable]
+           public var gripTip:String; 
+           
+           [Bindable]
+           public var gripIcon:Class;
+        ]]>
+    </fx:Script>
+
+    <s:Image source="{gripIcon}" />
+    <s:Image source="@Embed('/assets/grip.png')" toolTip="{gripTip}" />
+    
+</s:VGroup>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/ProductCart.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/ProductCart.mxml b/FlexStore/spark/src/productsView/ProductCart.mxml
new file mode 100644
index 0000000..cb381ad
--- /dev/null
+++ b/FlexStore/spark/src/productsView/ProductCart.mxml
@@ -0,0 +1,118 @@
+<?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:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
+         xmlns:s="library://ns.adobe.com/flex/spark" 
+    xmlns:productsView="productsView.*"
+    horizontalAlign="right"
+    paddingTop="8"
+    paddingBottom="8"
+    paddingRight="4"
+    paddingLeft="4"
+    >
+    
+    <fx:Script>
+        <![CDATA[
+        
+        import mx.controls.Alert;
+        
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductListEvent;
+        
+        [Bindable]
+        public var numProducts:int=0;
+        
+        [Bindable]
+        private var total:Number = 0;
+
+        private const SHIPPING:Number = 1.99;
+        
+        private function productListEventHandler(event:ProductListEvent):void
+        {
+            switch (event.type)
+            {
+                case ProductListEvent.ADD_PRODUCT:
+                    event.product.qty = 0;  
+                    //fall through into the same logic as dup          
+                case ProductListEvent.DUPLICATE_PRODUCT:
+                    event.product.qty++;
+                    total += event.product.price;
+                    numProducts++;
+                    break;            
+                case ProductListEvent.PRODUCT_QTY_CHANGE:
+                case ProductListEvent.REMOVE_PRODUCT:
+                    var items:Array = productList.items;
+                    total = 0; 
+                    numProducts = 0;
+                    for (var i:int=0; i < items.length; i++)
+                    {
+                        var product:Product = items[i].product;
+                        total += product.qty * product.price;
+                        numProducts += product.qty;
+                    }       
+                    break;
+                default:
+                    break;
+            }
+        }
+        
+        ]]>
+    </fx:Script>
+    <fx:Declarations>
+        <s:CurrencyFormatter currencySymbol="$" id="cf" fractionalDigits="2"/>        
+    </fx:Declarations>
+    
+    <s:Label width="100%" text="Your Shopping Cart" styleName="sectionHeader"/>
+        
+    <productsView:ProductList id="productList" height="100%" width="100%"
+        newItemStartX="-100" newItemStartY="-100" 
+        addProduct="productListEventHandler(event)"
+        duplicateProduct="productListEventHandler(event)"
+        productQtyChange="productListEventHandler(event)"
+        removeProduct="productListEventHandler(event)"
+        showQuantity="true"
+        />
+    
+    <s:Form >
+        <s:layout>
+            <s:VerticalLayout gap="0" paddingRight="0" />
+        </s:layout>
+        <s:FormItem label="Total:" width="100%">
+
+            <s:Label width="70" text="{cf.format(total)}" textAlign="right"/>
+
+        </s:FormItem>
+
+        <s:FormItem label="Service Fee:" width="100%">
+
+            <s:Label width="70" text="{cf.format(numProducts * SHIPPING)}" textAlign="right"/>
+
+        </s:FormItem>
+
+        <s:FormItem label="Grand Total:" fontWeight="bold" width="100%">
+
+            <s:Label width="70" text="{cf.format(total + (numProducts * SHIPPING))}" textAlign="right"/>
+
+        </s:FormItem>
+
+    </s:Form>
+
+    <s:Button label="Submit Order"  click="Alert.show('This feature is not implemented in this sample', 'Submit Order')"/>
+
+</s:VGroup>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/productsView/ProductCatalogPanel.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/productsView/ProductCatalogPanel.mxml b/FlexStore/spark/src/productsView/ProductCatalogPanel.mxml
new file mode 100644
index 0000000..4626475
--- /dev/null
+++ b/FlexStore/spark/src/productsView/ProductCatalogPanel.mxml
@@ -0,0 +1,513 @@
+<?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:Panel xmlns:fx="http://ns.adobe.com/mxml/2009"
+          xmlns:s="library://ns.adobe.com/flex/spark"
+    xmlns:productsView="productsView.*"
+    currentState="browse"
+    title.browse="Browse"
+    title.compare="Product Comparison"
+    title.details="Product Details"
+    skinClass="productsView.ProductCatalogPanelSkin"
+    styleName="catalogPanel"
+    creationComplete="titleButtons = skin['titleButtons']">
+
+    <s:layout>
+        <s:VerticalLayout />
+    </s:layout>
+    
+    <fx:Metadata>
+        [Event(name="purchase", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="compare", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="details", type="samples.flexstore.ProductThumbEvent")]
+    </fx:Metadata>
+    
+    <fx:Script>
+        <![CDATA[
+        import flash.utils.Dictionary;
+        
+        import mx.collections.ArrayCollection;
+        import mx.collections.IViewCursor;
+        import mx.core.DragSource;
+        import mx.core.IUIComponent;
+        import mx.effects.Effect;
+        import mx.effects.Fade;
+        import mx.effects.Move;
+        import mx.events.EffectEvent;
+        import mx.events.DragEvent;
+        import mx.managers.DragManager;
+
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductFilter;
+        import samples.flexstore.ProductFilterEvent;
+        import samples.flexstore.ProductThumbEvent;
+       
+     
+        private var accepted:Dictionary = new Dictionary();
+        private var thumbnails:Array;
+        private var filterCount:int;
+        private var thumbnailState:String = 'browse'; //either 'browse' or 'compare'
+        [Bindable]
+        private var titleButtons:CatalogTitleButtons; //the buttons that also allow the panel to switch sides
+                
+        [Bindable]
+        public var cartCount:int;
+        
+        //-----------------------------
+        // catalog
+        //-----------------------------
+        
+        private var _catalog:ArrayCollection;
+        
+        [Bindable]
+        public function set catalog(c:ArrayCollection):void
+        {
+            _catalog = c;
+            createThumbnails();
+        }
+        
+        public function get catalog():ArrayCollection
+        {
+            return _catalog;
+        }
+        
+        //----------------------------------------------------------------------
+        // methods
+        //----------------------------------------------------------------------
+       
+        private function createThumbnails():void
+        {
+            var i:int; //variables are hoisted up in scope so declare here to avoid warning
+            if (thumbnails != null)
+            {
+                for (i=0; i < thumbnails.length; i++)
+                {
+                    thumbContent.removeElement(thumbnails[i]);
+                }
+            }
+            
+            var row:int = 0;
+            var col:int = -1;
+            var n:int = catalog.length;
+            thumbnails = new Array(n);
+            filterCount = n;
+            
+            for (i=0; i < n; i++)
+            {
+                var thumb:ProductCatalogThumbnail = new ProductCatalogThumbnail();
+                thumbnails[i] = thumb;
+                thumbnails[i].showInAutomationHierarchy = true;
+                thumb.product = catalog.getItemAt(i) as Product;
+                accepted[thumb.product] = true;
+                thumbContent.addElement(thumb);
+                thumb.addEventListener(ProductThumbEvent.PURCHASE, productThumbEventHandler);
+                thumb.addEventListener(ProductThumbEvent.COMPARE, productThumbEventHandler);
+                thumb.addEventListener(ProductThumbEvent.DETAILS, productThumbEventHandler);
+                thumb.addEventListener(DragEvent.DRAG_START,thumbDragStartHandler);
+            }
+
+            layoutCatalog();
+        }
+        
+        private function thumbDragStartHandler(event:MouseEvent):void
+        {
+            if (DragManager.isDragging == false)
+            {
+                var thumb:ProductCatalogThumbnail = event.target as ProductCatalogThumbnail;
+                var ds:DragSource = new DragSource();
+                ds.addData(thumb.product, "product");
+
+                var di:ProductCatalogThumbnail = new ProductCatalogThumbnail();
+                di.product = thumb.product;
+                
+                //the offset logic is honestly not the most intuitive but
+                //it's necessary to get the dragProxy positioned correctly
+                DragManager.doDrag(thumbContent, ds, event, di, -thumb.x, 
+            				       -thumb.y + thumbContent.verticalScrollPosition, 
+            				       0.5, false);
+            }    
+        }
+        
+        public function filter(productFilter:ProductFilter, live:Boolean):void
+        {
+            currentState = "browse";
+            thumbnailState = "browse";
+            var count:int=0;
+            var n:int = thumbnails.length;
+            var fadeOut:Fade = new Fade();
+            fadeOut.alphaFrom = 1;
+            fadeOut.alphaTo = .1;
+            var targets:Array = [];
+            for (var i:int = 0; i < n; i++)
+            {
+                var thumb:ProductCatalogThumbnail = thumbnails[i];
+                var product:Product = thumb.product;
+                if (productFilter.accept(product))
+                {
+                    accepted[product] = true;
+                    thumb.alpha = 1;    
+                    count++;
+                }
+                else
+                {
+                    accepted[product] = false;
+                    if (live)
+                    {
+                        thumb.alpha = .1;
+                    }
+                    else if (thumb.alpha == 1) //only fade if we hadn't started
+                    {
+                        targets.push(thumb);
+                    }
+                }
+            }
+            productFilter.count = count;
+            filterCount = count;
+
+            if (targets.length > 0)    
+            {
+                fadeOut.targets = targets;
+                fadeOut.play();
+                fadeOut.addEventListener(EffectEvent.EFFECT_END,
+                    function(event:EffectEvent):void
+                    {
+                        layoutCatalog();
+                    });
+            }
+            else if (!live)
+            {
+                layoutCatalog();
+            }
+        }
+        
+        private function layoutCatalog():Effect
+        {
+            var tileWidth:Number;
+            var tileHeight:Number;
+            var numCols:int;
+
+            if (filterCount > 9 || currentState == "compare")
+            {
+                numCols = 4;
+                tileWidth = ProductCatalogThumbnail.COL_WIDTH_4;
+                tileWidth = currentState == "compare"
+                    ? ProductCatalogThumbnail.COMPARE_WIDTH
+                    : ProductCatalogThumbnail.COL_WIDTH_4
+                tileHeight = currentState == "compare"
+                    ? height - 4
+                    : ProductCatalogThumbnail.COL_HEIGHT_4;
+            }
+            else if (filterCount > 4)
+			{
+                numCols = 3;
+                tileWidth = ProductCatalogThumbnail.COL_WIDTH_3;
+                tileHeight = ProductCatalogThumbnail.COL_HEIGHT_3;
+            }
+			else if (filterCount <= 9)
+			{
+                numCols = 2;
+                tileWidth = ProductCatalogThumbnail.COL_WIDTH_2;
+                tileHeight = ProductCatalogThumbnail.COL_HEIGHT_2;
+            }
+			else
+			{
+            }
+            
+            var row:int = 0;
+            var col:int = -1;
+
+			var move:Move = null;
+
+            var n:int = catalog.length;
+			for (var i:int = 0 ; i < n ; i++)
+			{
+                var product:Product = catalog.getItemAt(i) as Product;
+                var thumb:ProductCatalogThumbnail = thumbnails[i];
+                if (accepted[product])
+                {
+                    thumb.currentState = "x" + numCols + "cols";
+                    col++;
+                    if (col > numCols - 1)
+					{
+                        row++;
+                        col = 0;
+                    }
+
+                    var xTo:Number = col * (tileWidth + ProductCatalogThumbnail.HORIZONTAL_GAP);
+                    var yTo:Number = row * (tileHeight + ProductCatalogThumbnail.VERTICAL_GAP);
+
+                    // If the thumbnail is already visible
+					// animate it to its new position.
+                    if (thumb.visible)
+					{
+                        // Animate only if the position is different
+						// from its current position.
+                        if (thumb.x != xTo || thumb.y != yTo)
+						{
+                            move = new Move(thumb);
+                            move.xTo = xTo;
+                            move.yTo = yTo;
+                            move.play();
+                        }
+                    }
+
+                    // If the thumbnail was not previously visible, sets its
+					// x and y coordinates. We'll make it reappear after all
+                    // the visible thumbnails have reached their new position.
+					else
+					{
+                        thumb.x = xTo;
+                        thumb.y = yTo;
+                        thumb.includeInLayout = true;
+                    }
+                }
+				else
+				{
+                    thumb.visible = false;
+                    thumb.includeInLayout = false;
+                }
+            }
+
+            if (!move)
+			{
+                // No visible thumbnails were animated to a new position;
+				// fade in newly selected thumbnails right away.
+                fadeInThumbnails();
+            }
+			else
+			{
+			    //since movement is happening get the scrollbar back to the top
+				thumbContent.verticalScrollPosition = 0;
+                // Fade in newly selected thumbnails after the last
+				// visible thumbnail has moved to its new position.
+                move.addEventListener(EffectEvent.EFFECT_END,
+					function(event:EffectEvent):void
+					{
+						fadeInThumbnails();
+					});
+            }
+            //return the last move to watch
+            return move;
+        }
+        
+        //return the last effect so we could add effectEnd handler if desired
+        private function fadeInThumbnails():void
+		{
+			var n:int = thumbnails.length;
+			var effect:Fade = new Fade();
+			effect.alphaTo = 1;
+			var targets:Array = [];
+			for (var i:int = 0; i < n ; i++)
+			{
+			    var thumb:ProductCatalogThumbnail = thumbnails[i];
+			    if (accepted[thumb.product] && !thumb.visible)
+				{
+                    thumb.alpha = 0;
+                    thumb.visible = true;
+                    targets.push(thumb);
+                }
+            }
+            if (targets.length > 0)
+            {
+                effect.targets = targets;
+                effect.play();
+            }
+        }
+        
+        private function showDetails(product:Product):void
+        {
+            if (currentState == "details")
+			{
+                details.product = product;
+                return;
+            }
+
+            var row:int = -1;
+
+            //should be computed using border metrics instead of hard-coding the 20, but...
+			var xTo:Number = thumbContent.width - ProductCatalogThumbnail.COL_WIDTH_4 - 20;
+            var yTo:Number;
+
+            var move:Move;
+            var first:Boolean = true;
+            var selectedThumb:ProductCatalogThumbnail;
+
+            var n:int = thumbnails.length;
+			for (var i:int = 0; i < n; i++)
+			{
+			    var thumb:ProductCatalogThumbnail = thumbnails[i];
+                if (thumb.visible)
+				{
+                    row++;
+                    yTo = row * (ProductCatalogThumbnail.COL_HEIGHT_4 + ProductCatalogThumbnail.VERTICAL_GAP);
+
+                    thumb.currentState = "x4cols";
+
+                    if (thumb.x != xTo || thumb.y != yTo)
+					{
+                        move = new Move(thumb);
+                        if (first)
+						{
+                            move.addEventListener(EffectEvent.EFFECT_END,
+								function(event:EffectEvent):void
+								{
+									details.product = product;
+                                    currentState = "details";
+								});
+
+                            first = false;
+                        }
+                        move.xTo = xTo;
+                        move.yTo = yTo;
+                        move.play();
+                    }
+                    
+                    if (thumb.product == product)
+                    {
+                        selectedThumb = thumb;
+                    }
+                }
+            }
+            if (selectedThumb != null)
+            {
+                //make sure that the selected thumb is visible in the list on the right
+                move.addEventListener(EffectEvent.EFFECT_END,
+					function(e:EffectEvent):void
+					{
+					    var curpos:int = thumbContent.verticalScrollPosition;
+					    if (selectedThumb.y < curpos)
+					    {
+					        thumbContent.verticalScrollPosition = y;
+					    }
+					    else if (selectedThumb.y + ProductCatalogThumbnail.COL_HEIGHT_4 > curpos + thumbContent.height)
+					    {
+					        //this logic doesn't seem to be perfect but it will do
+					        var diff:int = selectedThumb.y - (curpos + thumbContent.height)
+					        thumbContent.verticalScrollPosition += diff + ProductCatalogThumbnail.COL_HEIGHT_4 + ProductCatalogThumbnail.VERTICAL_GAP;
+					    }
+					});
+            }
+            
+        }
+        
+        private function productThumbEventHandler(event:ProductThumbEvent):void
+        {
+            if (event.type == ProductThumbEvent.DETAILS)
+            {
+                showDetails(event.product);
+            }
+            else if (event.type == ProductThumbEvent.BROWSE)
+            {
+                if (thumbnailState == "browse")
+                {                
+                    currentState = "browse";
+                    layoutCatalog();
+                }
+                else
+                {
+                    compare();
+                }
+            }
+            else
+            {
+                dispatchEvent(event);
+            }
+        }
+        
+        public function compare(toCompare:Array=null):void
+        {
+            currentState = "compare";
+            thumbnailState = "compare";
+            if (toCompare != null)
+            {
+                var n:int = thumbnails.length;
+                for (var i:int = 0; i < n; i++)
+                {
+                    accepted[thumbnails[i].product] = false;
+                }
+                for (i=0; i < toCompare.length; i++)
+                {
+                    accepted[toCompare[i]] = true;
+                }
+            }
+            var lastEffect:Effect = layoutCatalog();
+            if (lastEffect != null)
+            {
+                lastEffect.addEventListener(EffectEvent.EFFECT_END,
+                    function (event:EffectEvent):void
+                    {
+                        setCompareState();
+                    });
+            }
+            else
+            {
+                setCompareState();
+            }
+        }
+        
+        private function setCompareState():void
+        {
+            //avoid an issue if the user clicks quickly where we move into
+            //compare state even though we're no longer in compare
+            if (currentState == "compare") 
+            {
+                var n:int = thumbnails.length;
+                for (var i:int = 0; i < n; i++)
+                {
+                    var thumb:ProductCatalogThumbnail = thumbnails[i];
+                    if (accepted[thumb.product])
+                    {
+                        thumb.currentState = "compare";
+                    }
+                }
+                
+            }
+        }
+        
+        ]]>
+    </fx:Script>
+    
+    <fx:Binding source="cartCount" destination="titleButtons.cartCount" />
+    <!-- two-way binding between the states of panel title buttons and the product view state -->
+    <fx:Binding source="ProductsView(parentDocument).currentState" destination="titleButtons.currentState" />
+    <fx:Binding destination="ProductsView(parentDocument).currentState" source="titleButtons.currentState" />
+
+    <s:Group width="100%" height="100%">
+        <s:Group id="thumbContentGroup" width="100%" height="100%">
+            <s:Scroller width="100%" height="100%">
+                <s:Group id="thumbContent" width="100%" height="100%"/>
+            </s:Scroller>
+        </s:Group>
+        <productsView:ProductDetails id="details"
+            width="{ProductCatalogThumbnail.COL_WIDTH_4 * 3}"
+            height="100%"
+            visible="false"
+            visible.details="true"
+            compare="productThumbEventHandler(event)"
+            purchase="productThumbEventHandler(event)"
+            browse="productThumbEventHandler(event)" />
+    </s:Group>
+    
+    <s:states>
+        <s:State name="browse" />
+        <s:State name="compare" />
+        <s:State name="details" />
+    </s:states>
+    
+</s:Panel>


[4/4] git commit: [flex-examples] [refs/heads/develop] - add mx and spark versions of FlexStore

Posted by ah...@apache.org.
add mx and spark versions of FlexStore


Project: http://git-wip-us.apache.org/repos/asf/flex-examples/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-examples/commit/c652cfba
Tree: http://git-wip-us.apache.org/repos/asf/flex-examples/tree/c652cfba
Diff: http://git-wip-us.apache.org/repos/asf/flex-examples/diff/c652cfba

Branch: refs/heads/develop
Commit: c652cfba6bb46f1ec5c1fc0a6914eb88fc64f728
Parents: a3a9031
Author: Alex Harui <ah...@apache.org>
Authored: Thu Aug 28 14:04:46 2014 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Thu Aug 28 14:04:46 2014 -0700

----------------------------------------------------------------------
 FlexStore/mx/src/FlexStore.mxml                 | 131 +++++
 FlexStore/mx/src/HomeView.mxml                  | 169 ++++++
 FlexStore/mx/src/ProductsView.mxml              | 117 ++++
 FlexStore/mx/src/SupportView.mxml               | 127 +++++
 FlexStore/mx/src/assets/akotter.jpg             | Bin 0 -> 19395 bytes
 FlexStore/mx/src/assets/bcrater.jpg             | Bin 0 -> 22670 bytes
 FlexStore/mx/src/assets/beige_background.jpg    | Bin 0 -> 12533 bytes
 FlexStore/mx/src/assets/beige_dotted_map.png    | Bin 0 -> 216598 bytes
 FlexStore/mx/src/assets/blue_background.jpg     | Bin 0 -> 12868 bytes
 FlexStore/mx/src/assets/blue_dotted_map.png     | Bin 0 -> 217088 bytes
 FlexStore/mx/src/assets/grip.png                | Bin 0 -> 19836 bytes
 FlexStore/mx/src/assets/icon_cart_empty.png     | Bin 0 -> 29594 bytes
 FlexStore/mx/src/assets/icon_cart_full.png      | Bin 0 -> 31388 bytes
 FlexStore/mx/src/assets/icon_compare.png        | Bin 0 -> 30218 bytes
 FlexStore/mx/src/assets/icon_details.png        | Bin 0 -> 29527 bytes
 FlexStore/mx/src/assets/icon_magnifier.png      | Bin 0 -> 30454 bytes
 FlexStore/mx/src/assets/icon_tiles.png          | Bin 0 -> 27988 bytes
 FlexStore/mx/src/assets/jproctor.jpg            | Bin 0 -> 21684 bytes
 FlexStore/mx/src/assets/logo_blue.png           | Bin 0 -> 33427 bytes
 FlexStore/mx/src/assets/logo_orange.png         | Bin 0 -> 33897 bytes
 FlexStore/mx/src/assets/pic/abrilliam.jpg       | Bin 0 -> 18903 bytes
 FlexStore/mx/src/assets/pic/akotter.jpg         | Bin 0 -> 19395 bytes
 FlexStore/mx/src/assets/pic/bcrater.jpg         | Bin 0 -> 22670 bytes
 FlexStore/mx/src/assets/pic/bleporte.jpg        | Bin 0 -> 23363 bytes
 FlexStore/mx/src/assets/pic/bvanbrocklin.jpg    | Bin 0 -> 18066 bytes
 FlexStore/mx/src/assets/pic/ccarpenter.jpg      | Bin 0 -> 19219 bytes
 FlexStore/mx/src/assets/pic/clampberto.jpg      | Bin 0 -> 18611 bytes
 FlexStore/mx/src/assets/pic/davenon.jpg         | Bin 0 -> 20028 bytes
 FlexStore/mx/src/assets/pic/dmcgoyal.jpg        | Bin 0 -> 19395 bytes
 FlexStore/mx/src/assets/pic/dwillhelm.jpg       | Bin 0 -> 22670 bytes
 FlexStore/mx/src/assets/pic/esunderland.jpg     | Bin 0 -> 23363 bytes
 FlexStore/mx/src/assets/pic/jproctor.jpg        | Bin 0 -> 21684 bytes
 FlexStore/mx/src/assets/pic/mfields.jpg         | Bin 0 -> 18066 bytes
 FlexStore/mx/src/assets/pic/pdempsey.jpg        | Bin 0 -> 18611 bytes
 FlexStore/mx/src/assets/pic/ptranep.jpg         | Bin 0 -> 19627 bytes
 FlexStore/mx/src/assets/pic/rcrawley.jpg        | Bin 0 -> 23692 bytes
 FlexStore/mx/src/assets/pic/rdreifus.jpg        | Bin 0 -> 20028 bytes
 FlexStore/mx/src/assets/pic/twong.jpg           | Bin 0 -> 19395 bytes
 FlexStore/mx/src/assets/support_map.png         | Bin 0 -> 172293 bytes
 FlexStore/mx/src/assets/support_mapmarker_a.png | Bin 0 -> 834 bytes
 FlexStore/mx/src/assets/support_mapmarker_b.png | Bin 0 -> 822 bytes
 FlexStore/mx/src/assets/support_mapmarker_c.png | Bin 0 -> 817 bytes
 .../mx/src/assets/support_mapmarker_plus.png    | Bin 0 -> 827 bytes
 FlexStore/mx/src/assets/trashcan.png            | Bin 0 -> 27189 bytes
 FlexStore/mx/src/beige.css                      | 166 ++++++
 FlexStore/mx/src/blue.css                       | 165 ++++++
 FlexStore/mx/src/data/catalog.xml               | 256 +++++++++
 FlexStore/mx/src/main.css                       |  83 +++
 .../src/productsView/CatalogTitleButtons.mxml   |  62 +++
 FlexStore/mx/src/productsView/Grip.mxml         |  35 ++
 FlexStore/mx/src/productsView/ProductCart.mxml  | 115 ++++
 .../src/productsView/ProductCatalogPanel.mxml   | 534 +++++++++++++++++++
 .../productsView/ProductCatalogThumbnail.mxml   | 226 ++++++++
 .../mx/src/productsView/ProductDetails.mxml     |  97 ++++
 .../mx/src/productsView/ProductFilterPanel.mxml | 192 +++++++
 FlexStore/mx/src/productsView/ProductList.mxml  | 210 ++++++++
 .../mx/src/productsView/ProductListItem.mxml    |  85 +++
 .../mx/src/productsView/ProductSupport.mxml     |  84 +++
 .../samples/flexstore/ButtonBarButtonSkin.as    | 298 +++++++++++
 FlexStore/mx/src/samples/flexstore/Product.as   |  78 +++
 .../mx/src/samples/flexstore/ProductFilter.as   |  56 ++
 .../src/samples/flexstore/ProductFilterEvent.as |  39 ++
 .../src/samples/flexstore/ProductListEvent.as   |  42 ++
 .../src/samples/flexstore/ProductThumbEvent.as  |  45 ++
 FlexStore/spark/src/FlexStore.mxml              | 280 ++++++++++
 FlexStore/spark/src/HomeView.mxml               | 171 ++++++
 FlexStore/spark/src/ProductsView.mxml           | 116 ++++
 FlexStore/spark/src/SupportView.mxml            | 144 +++++
 FlexStore/spark/src/assets/akotter.jpg          | Bin 0 -> 19395 bytes
 FlexStore/spark/src/assets/bcrater.jpg          | Bin 0 -> 22670 bytes
 FlexStore/spark/src/assets/beige_background.jpg | Bin 0 -> 12533 bytes
 FlexStore/spark/src/assets/beige_dotted_map.png | Bin 0 -> 216598 bytes
 FlexStore/spark/src/assets/blue_background.jpg  | Bin 0 -> 12868 bytes
 FlexStore/spark/src/assets/blue_dotted_map.png  | Bin 0 -> 217088 bytes
 FlexStore/spark/src/assets/grip.png             | Bin 0 -> 19836 bytes
 FlexStore/spark/src/assets/icon_cart_empty.png  | Bin 0 -> 29594 bytes
 FlexStore/spark/src/assets/icon_cart_full.png   | Bin 0 -> 31388 bytes
 FlexStore/spark/src/assets/icon_compare.png     | Bin 0 -> 30218 bytes
 FlexStore/spark/src/assets/icon_details.png     | Bin 0 -> 29527 bytes
 FlexStore/spark/src/assets/icon_magnifier.png   | Bin 0 -> 30454 bytes
 FlexStore/spark/src/assets/icon_tiles.png       | Bin 0 -> 27988 bytes
 FlexStore/spark/src/assets/jproctor.jpg         | Bin 0 -> 21684 bytes
 FlexStore/spark/src/assets/logo_blue.png        | Bin 0 -> 33427 bytes
 FlexStore/spark/src/assets/logo_orange.png      | Bin 0 -> 33897 bytes
 FlexStore/spark/src/assets/pic/abrilliam.jpg    | Bin 0 -> 18903 bytes
 FlexStore/spark/src/assets/pic/akotter.jpg      | Bin 0 -> 19395 bytes
 FlexStore/spark/src/assets/pic/bcrater.jpg      | Bin 0 -> 22670 bytes
 FlexStore/spark/src/assets/pic/bleporte.jpg     | Bin 0 -> 23363 bytes
 FlexStore/spark/src/assets/pic/bvanbrocklin.jpg | Bin 0 -> 18066 bytes
 FlexStore/spark/src/assets/pic/ccarpenter.jpg   | Bin 0 -> 19219 bytes
 FlexStore/spark/src/assets/pic/clampberto.jpg   | Bin 0 -> 18611 bytes
 FlexStore/spark/src/assets/pic/davenon.jpg      | Bin 0 -> 20028 bytes
 FlexStore/spark/src/assets/pic/dmcgoyal.jpg     | Bin 0 -> 19395 bytes
 FlexStore/spark/src/assets/pic/dwillhelm.jpg    | Bin 0 -> 22670 bytes
 FlexStore/spark/src/assets/pic/esunderland.jpg  | Bin 0 -> 23363 bytes
 FlexStore/spark/src/assets/pic/jproctor.jpg     | Bin 0 -> 21684 bytes
 FlexStore/spark/src/assets/pic/mfields.jpg      | Bin 0 -> 18066 bytes
 FlexStore/spark/src/assets/pic/pdempsey.jpg     | Bin 0 -> 18611 bytes
 FlexStore/spark/src/assets/pic/ptranep.jpg      | Bin 0 -> 19627 bytes
 FlexStore/spark/src/assets/pic/rcrawley.jpg     | Bin 0 -> 23692 bytes
 FlexStore/spark/src/assets/pic/rdreifus.jpg     | Bin 0 -> 20028 bytes
 FlexStore/spark/src/assets/pic/twong.jpg        | Bin 0 -> 19395 bytes
 FlexStore/spark/src/assets/support_map.png      | Bin 0 -> 172293 bytes
 .../spark/src/assets/support_mapmarker_a.png    | Bin 0 -> 834 bytes
 .../spark/src/assets/support_mapmarker_b.png    | Bin 0 -> 822 bytes
 .../spark/src/assets/support_mapmarker_c.png    | Bin 0 -> 817 bytes
 .../spark/src/assets/support_mapmarker_plus.png | Bin 0 -> 827 bytes
 FlexStore/spark/src/assets/trashcan.png         | Bin 0 -> 27189 bytes
 FlexStore/spark/src/beige.css                   | 168 ++++++
 FlexStore/spark/src/blue.css                    | 165 ++++++
 FlexStore/spark/src/data/catalog.xml            | 256 +++++++++
 FlexStore/spark/src/main.css                    |  83 +++
 .../src/productsView/CatalogTitleButtons.mxml   |  64 +++
 FlexStore/spark/src/productsView/Grip.mxml      |  36 ++
 .../spark/src/productsView/ProductCart.mxml     | 118 ++++
 .../src/productsView/ProductCatalogPanel.mxml   | 513 ++++++++++++++++++
 .../productsView/ProductCatalogPanelSkin.mxml   | 286 ++++++++++
 .../productsView/ProductCatalogThumbnail.mxml   | 195 +++++++
 .../spark/src/productsView/ProductDetails.mxml  | 121 +++++
 .../src/productsView/ProductFilterPanel.mxml    | 200 +++++++
 .../spark/src/productsView/ProductList.mxml     | 214 ++++++++
 .../spark/src/productsView/ProductListItem.mxml |  90 ++++
 .../spark/src/productsView/ProductSupport.mxml  |  88 +++
 .../samples/flexstore/ButtonBarButtonSkin.as    | 298 +++++++++++
 .../spark/src/samples/flexstore/Product.as      |  78 +++
 .../src/samples/flexstore/ProductFilter.as      |  56 ++
 .../src/samples/flexstore/ProductFilterEvent.as |  39 ++
 .../src/samples/flexstore/ProductListEvent.as   |  42 ++
 .../src/samples/flexstore/ProductThumbEvent.as  |  45 ++
 129 files changed, 7278 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/FlexStore.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/FlexStore.mxml b/FlexStore/mx/src/FlexStore.mxml
new file mode 100644
index 0000000..db66b31
--- /dev/null
+++ b/FlexStore/mx/src/FlexStore.mxml
@@ -0,0 +1,131 @@
+<?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.
+
+-->
+<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*"
+				layout="absolute" minWidth="990" minHeight="550"
+				preinitialize="loadStyle()"
+				creationComplete="startService()"
+				pageTitle="FlexStore">
+	
+	<mx:Script>
+		<![CDATA[
+			import mx.collections.IViewCursor;
+			import mx.collections.ArrayCollection;
+			import samples.flexstore.Product;
+			import mx.rpc.events.ResultEvent;
+			import mx.events.StyleEvent;
+			import mx.styles.StyleManager;
+			
+			[Bindable]
+			private var catalog:ArrayCollection;
+			
+			private var currentTheme:String = "beige";
+			
+			private function toggleTheme():void
+			{
+				if (currentTheme == "beige")
+				{
+					currentTheme = "blue";
+				}
+				else
+				{
+					currentTheme = "beige";
+				}
+				
+				loadStyle();
+			}
+			
+			private function startService():void
+			{
+				productService.send();
+			}
+			
+			private function loadStyle():void
+			{
+				var eventDispatcher:IEventDispatcher =
+					styleManager.loadStyleDeclarations(currentTheme + ".swf");
+				eventDispatcher.addEventListener(StyleEvent.COMPLETE, completeHandler);
+			}
+			
+			private function completeHandler(event:StyleEvent):void
+			{
+				image.source = acb.getStyle("storeLogo");
+				homeView.updateMapImage();
+				super.initialized = true;
+			}
+			
+			private function productServiceResultHandler(event:ResultEvent):void
+			{
+				//HTTPService returns an ArrayCollection for nested arrays
+				var products:ArrayCollection = event.result.catalog.product;
+				var temp:ArrayCollection = new ArrayCollection();
+				var cursor:IViewCursor = products.createCursor();
+				while (!cursor.afterLast)
+				{
+					var product:Product = new Product();
+					product.fill(cursor.current);
+					temp.addItem(product);
+					cursor.moveNext();
+				}
+				catalog = temp;
+			}
+			
+			override public function set initialized(value:Boolean):void
+			{
+				// Hold off until the Runtime CSS SWF is done loading.
+			}
+		]]>
+	</mx:Script>
+	
+	<mx:Style source="main.css"/>
+	
+	<mx:HTTPService id="productService" url="data/catalog.xml"
+					result="productServiceResultHandler(event)"/>
+	
+	<mx:VBox width="990" paddingLeft="0" paddingRight="0" horizontalCenter="0" top="12">
+		
+		<mx:ApplicationControlBar id="acb" width="100%" styleName="storeControlBar">
+			<mx:Image id="image" 
+					  click="toggleTheme()"
+					  toolTip="Change Theme"/>
+			<mx:ToggleButtonBar
+				height="100%"
+				dataProvider="{storeViews}"
+				styleName="storeButtonBar"/>
+		</mx:ApplicationControlBar>
+		
+		<!-- using a creationPolicy of "auto" or "queued" has a bug at time of writing
+		that prevents initial states from applying styles correctly.
+		plus the instantiation of the cart view can cause a performance
+		hiccup which we might prefer at startup -->
+		<mx:ViewStack id="storeViews" width="100%" height="550" creationPolicy="all">
+			<HomeView id="homeView" label="Home"
+					  showEffect="WipeDown" hideEffect="WipeUp"
+					  />
+			<ProductsView id="pView" label="Products" catalog="{catalog}"
+						  showEffect="WipeDown" hideEffect="WipeUp"
+						  />
+			<SupportView id="supportView" label="Support"
+						 showEffect="WipeDown" hideEffect="WipeUp"
+						 />
+		</mx:ViewStack>
+		
+	</mx:VBox>
+	
+</mx:Application>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/HomeView.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/HomeView.mxml b/FlexStore/mx/src/HomeView.mxml
new file mode 100644
index 0000000..601daa5
--- /dev/null
+++ b/FlexStore/mx/src/HomeView.mxml
@@ -0,0 +1,169 @@
+<?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.
+
+-->
+<!--
+This component is primarily static and is only meant to show what other
+pages of the store could look like.
+
+Note that this page was put together in the Design view so you'll see more
+hard coded locations and sizes.
+
+Also note when working with a Canvas that using the constraint styles 
+(e.g., left, top, right, bottom) can provide better layout predictability than 
+using x and y, especially when percentage widths and heights are used.
+
+Width and height are hard-coded in the root tag to help the Design view.
+-->
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" width="990" height="550">
+	<mx:Script>
+		<![CDATA[
+			import mx.controls.Alert;
+
+			public function updateMapImage():void
+			{
+				mapImage.source = mapCanvas.getStyle('dottedMap');
+			}
+		]]>
+	</mx:Script>
+	<mx:HBox width="100%" height="100%" y="0" x="0" styleName="colorPanel">
+	
+		<mx:VBox width="230" height="100%">
+			<mx:Canvas width="100%" height="100%">
+			
+				<mx:Canvas left="10" top="10" width="100%" height="60" backgroundColor="#ebebe9" styleName="homeSection">
+					<mx:Label left="10" top="10" text="Search Developers" height="22" styleName="sectionHeader"/>
+					<mx:Button left="168" top="30" label="Go" width="47" height="20" styleName="glass" click="Alert.show('This feature is not implemented in this sample', 'Go')"/>
+					<mx:TextInput left="10" top="30" height="20" width="150"/>
+				</mx:Canvas>
+				
+				<mx:Canvas left="10" top="78" width="100%" height="280" backgroundColor="#ffffff" styleName="homeSection">
+					<mx:VBox left="10" top="10" width="100%" height="100%" verticalGap="0">
+						<mx:Label text="Flex Experts That Can Help You" styleName="sectionHeader"/>
+						<mx:HRule height="5" width="197"/>
+						<mx:Label text="General" styleName="homeProgramHeader"/>
+						<mx:Label text="BlazeDS Experts" fontSize="9"/>
+						<mx:Spacer height="8" width="100%"/>
+						<mx:Label text="Server-side" styleName="homeProgramHeader"/>
+						<mx:Label text="Java, PHP Developers" fontSize="9"/>
+						<mx:Spacer height="8" width="100%"/>
+						<mx:Label text="Mobile" styleName="homeProgramHeader"/>
+						<mx:Label text="Android, IOS and more" fontSize="9"/>
+						<mx:Spacer height="8" width="100%"/>
+						<mx:Label text="Students" styleName="homeProgramHeader"/>
+						<mx:Label text="Free Assistance" fontSize="9"/>
+						<mx:Spacer height="8" width="100%"/>
+					</mx:VBox>
+				</mx:Canvas>
+				
+				<mx:Canvas left="10" top="366" width="100%" height="174" styleName="homeSection" backgroundColor="#ebebe9">
+					<mx:VBox left="10" top="10" width="100%" height="100%" verticalGap="0">
+					
+						<mx:Label text="Manage My Account" styleName="sectionHeader"/>
+						
+						<mx:Label text="Phone Number"/>
+						
+						<mx:HBox width="100%" height="25" horizontalAlign="left" verticalAlign="middle">
+							<mx:TextInput height="20" width="40"/>
+							<mx:HRule width="8" height="25"/>
+							<mx:TextInput height="20" width="40"/>
+							<mx:HRule width="8" height="25"/>
+							<mx:TextInput height="20" width="40"/>
+						</mx:HBox>
+						
+						<mx:Label text="Password"/>
+						<mx:TextInput height="20"/>
+						<mx:Spacer height="8" width="100%"/>
+						
+						<mx:CheckBox label="Remember my phone number" selected="true"/>
+						<mx:Spacer height="8" width="100%"/>
+						
+						<mx:Button label="Login" styleName="glass" height="20" width="55" click="Alert.show('This feature is not implemented in this sample', 'Login')"/>
+						
+					</mx:VBox>
+				</mx:Canvas>
+				
+			</mx:Canvas>
+			
+		</mx:VBox>
+		
+		<mx:VBox width="750" height="100%">
+			<mx:Canvas width="100%" height="100%">
+			
+			    <!-- can't use binding to set the mapImage source because the style isn't available early enough -->
+				<mx:Canvas id="mapCanvas" width="100%" height="35%" styleName="homeMap" right="10" top="10">
+					<mx:Image id="mapImage" width="487" scaleContent="false" height="100%" alpha="1.0" left="10" top="10"/>
+					<mx:Label y="110" text="US Developers . Flex . FlexJS" width="95%" height="40" horizontalCenter="0" fontWeight="bold" fontSize="22" color="#ffffff" fontFamily="Arial" textAlign="center"/>
+					<mx:Label text="Learn More &gt;&gt;" width="95" bottom="10" right="10" fontSize="12" fontFamily="Arial"/>
+					<mx:Label text="$60/hr" fontSize="20" right="10" top="10" color="#ffffff" fontWeight="bold" fontFamily="Arial"/>
+					<mx:Label text="Rates as low as" x="551" top="16" fontSize="12"/>
+				</mx:Canvas>
+				
+				<mx:Canvas width="100%" height="330" backgroundColor="#ffffff" borderStyle="solid" cornerRadius="4" bottom="10" right="10">
+					
+					<mx:Label left="10" top="10" text="Featured Developers" width="173" height="25" styleName="sectionHeader"/>
+					
+					<mx:HBox left="0" top="43" width="100%" height="100%">
+						
+						<mx:VBox width="33%" height="100%">
+							
+							<mx:Canvas width="100%">
+								<mx:Image source="@Embed('/assets/akotter.jpg')" horizontalCenter="0" verticalCenter="0"/>
+							</mx:Canvas>
+							
+							<mx:Canvas width="100%">
+								<mx:Text text="Annette Kotter" horizontalCenter="0" id="feat_prod_1" fontWeight="bold" fontSize="12"/>
+							</mx:Canvas>
+							
+						</mx:VBox>
+						
+						<mx:VBox width="33%" height="100%">
+							
+							<mx:Canvas width="100%">
+								<mx:Image horizontalCenter="0" verticalCenter="0" source="@Embed('/assets/bcrater.jpg')"/>
+							</mx:Canvas>
+							
+							<mx:Canvas width="100%">
+								<mx:Text text="Ben Crater" horizontalCenter="0" id="feat_prod_2" fontWeight="bold" fontSize="12"/>
+							</mx:Canvas>
+							
+						</mx:VBox>
+						
+						<mx:VBox width="33%" height="100%">
+							
+							<mx:Canvas width="100%">
+								<mx:Image horizontalCenter="0" verticalCenter="0" source="@Embed('/assets/jproctor.jpg')"/>
+							</mx:Canvas>
+							
+							<mx:Canvas width="100%">
+								<mx:Text text="Jane Proctor" horizontalCenter="0" id="feat_prod_3" fontWeight="bold" fontSize="12"/>
+							</mx:Canvas>
+							
+						</mx:VBox>
+						
+					</mx:HBox>
+					
+				</mx:Canvas>
+				
+			</mx:Canvas>
+		
+		</mx:VBox>
+		
+	</mx:HBox>
+	
+</mx:Canvas>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/ProductsView.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/ProductsView.mxml b/FlexStore/mx/src/ProductsView.mxml
new file mode 100644
index 0000000..0535732
--- /dev/null
+++ b/FlexStore/mx/src/ProductsView.mxml
@@ -0,0 +1,117 @@
+<?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.
+
+-->
+<!-- width and height hard-coded in the root tag to better support the 
+     Design view in FlexBuilder since we know the width and height from the 
+     settings in flexstore.mxml -->
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" 
+    xmlns:productsView="productsView.*"
+    width="990" height="550"
+    currentState="showFilter">
+
+    <mx:Script>
+        <![CDATA[
+        import mx.collections.ArrayCollection;
+        import samples.flexstore.Product;
+                
+        private var _catalog:ArrayCollection;
+        
+        [Bindable]
+        public function get catalog():ArrayCollection
+        {
+            return _catalog;
+        }
+        
+        public function set catalog(c:ArrayCollection):void
+        {
+            _catalog = c;
+            if (filterPanel != null)
+            {
+                filterPanel.filter.count = c.length;
+            }
+        }
+        
+        public function addToCompare(product:Product):void
+        {
+            //setting the state before adding the product avoids jumpiness in the transition, not sure why
+            currentState = 'showFilter';
+            filterPanel.productList.addProduct(product);
+        }
+        
+        public function addToCart(product:Product):void
+        {
+            //setting the state before adding the product avoids jumpiness in the transition, not sure why
+            currentState = 'showCart'; 
+            cartPanel.productList.addProduct(product);
+        }
+        
+        
+        ]]>
+    </mx:Script>
+    
+    <mx:HBox 
+        styleName="colorPanel"
+        dropShadowEnabled="true" 
+        height="100%" width="100%" 
+        verticalScrollPolicy="off" 
+        horizontalGap="0">
+    
+        <productsView:Grip id="filterGrip" gripIcon="@Embed('/assets/icon_magnifier.png')" 
+            gripTip="Show filter panel" click="currentState = 'showFilter'"/>
+    
+        <productsView:ProductFilterPanel id="filterPanel" width="265" height="100%"
+            filter="catalogPanel.filter(event.filter, event.live)"
+            compare="catalogPanel.compare(filterPanel.productList.getProducts())"
+            creationComplete="if (catalog) filterPanel.filter.count = catalog.length"/>
+    
+        <mx:Spacer width="100%"/>
+        
+        <productsView:ProductCart id="cartPanel" width="265" height="100%"/>
+
+        <productsView:Grip id="cartGrip" gripIcon="@Embed('/assets/icon_cart_empty.png')"
+            gripTip="Show cart" click="currentState = 'showCart'"/>
+    
+    </mx:HBox>
+        
+    <productsView:ProductCatalogPanel id="catalogPanel" y="4" width="685" height="540"
+        catalog="{catalog}"
+        compare="addToCompare(event.product)"
+        purchase="addToCart(event.product)"
+        cartCount="{cartPanel.numProducts}"/>
+    
+    <mx:states>
+       <mx:State name="showFilter">
+          <mx:SetStyle target="{catalogPanel}" name="left" value="285"/>
+       </mx:State>        
+       <mx:State name="showCart">
+           <mx:SetStyle target="{catalogPanel}" name="right" value="285"/>
+       </mx:State>
+    </mx:states>
+    
+    <!-- 
+      make sure to use transitions here instead of applying a Move effect
+      to the Panel itself which will result in odd behavior
+    -->
+    <mx:transitions>
+       <mx:Transition fromState="*" toState="*">
+          <mx:Move target="{catalogPanel}" />
+       </mx:Transition>
+    </mx:transitions>
+        
+</mx:Canvas>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/SupportView.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/SupportView.mxml b/FlexStore/mx/src/SupportView.mxml
new file mode 100644
index 0000000..1f18454
--- /dev/null
+++ b/FlexStore/mx/src/SupportView.mxml
@@ -0,0 +1,127 @@
+<?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.
+
+-->
+<!--
+This component is primarily static and is only meant to show what other
+pages of the store could look like.
+
+Note that this page was put together in the Design view so you'll see more
+hard coded locations and sizes.
+
+We did not have sizing issues here as much so you'll see more hardcoded 
+"y" values rather than "top."
+
+The width and height are hard-coded in the root tag to help the Design view.
+-->
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" alpha="1.0"
+    width="990" height="550">
+	
+	<mx:Script>
+	    <![CDATA[
+	       import mx.controls.Alert; 
+	    ]]>
+	</mx:Script>
+	
+    <mx:Model id="locationsModel">
+        <root>
+            <location image="assets/support_mapmarker_a.png" name="601 Townsend St" /> 
+    	    <location image="assets/support_mapmarker_b.png" name="Location B" />
+    	    <location image="assets/support_mapmarker_c.png" name="Location C" />	   	   
+        </root> 
+    </mx:Model>   
+		
+	<mx:ArrayCollection id="locations" source="{locationsModel.root.location}"/>
+	
+	<mx:HBox x="0" y="0" width="100%" height="100%" styleName="colorPanel">
+	
+		<mx:VBox width="32%" height="100%">
+			<mx:Canvas width="100%" height="60%">
+			
+				<mx:Label y="10" text="Check Location" styleName="sectionHeader" x="20"/>
+				
+				<mx:Form width="95%" height="125" y="64" verticalGap="8" paddingBottom="0" paddingRight="0" paddingTop="5" horizontalCenter="0">
+					
+					<mx:FormItem label="Address:" width="100%">
+						<mx:TextInput id="address" width="90%"/>
+					</mx:FormItem>
+					
+					<mx:FormItem label="City:" width="100%">
+						<mx:TextInput id="city" width="60%"/>						
+					</mx:FormItem>
+					
+					<mx:FormItem label="State:" width="100%">
+						<mx:ComboBox id="state" width="50%">
+							<mx:dataProvider>
+ 				               <mx:Array>
+				                    <mx:String>California</mx:String>
+				                    <mx:String>Nevada</mx:String>
+				                    <mx:String>Oregon</mx:String>
+				                    <mx:String>Washington</mx:String>
+				                </mx:Array>
+            				</mx:dataProvider>
+						</mx:ComboBox>
+					</mx:FormItem>
+					
+					<mx:FormItem label="ZIP Code:" width="100%">
+						<mx:TextInput id="zip" width="30%"/>
+					</mx:FormItem>
+					
+				</mx:Form>
+				
+				<mx:Label y="38" text="Option1: Enter Address" horizontalCenter="0" styleName="instructions"/>
+				
+				<mx:Button y="197" label="Locate" click="Alert.show('This feature is not implemented in this sample', 'Locate')" horizontalCenter="0"/>
+				
+				<mx:HBox y="227" width="80%" height="20" horizontalAlign="center" verticalAlign="middle" horizontalCenter="0">
+					<mx:HRule width="60" strokeColor="#000000"/>
+					<mx:Label text="OR"/>
+					<mx:HRule width="60" strokeColor="#000000"/>
+				</mx:HBox>
+				
+				<mx:Label y="255" text="Option 2: Drag this marker into the map" horizontalCenter="0" styleName="instructions"/>
+				
+				<mx:Image y="280" horizontalCenter="0" source="@Embed('/assets/support_mapmarker_plus.png')"/>
+				
+				<mx:HRule y="315" horizontalCenter="0" width="200" alpha="0.6"/>
+				
+			</mx:Canvas>
+			
+			<mx:Canvas width="100%" height="40%">
+				<mx:VBox width="80%" height="90%" horizontalCenter="0" top="0">
+					<mx:Label text="Location" styleName="instructions"/>
+					<mx:VBox width="100%" verticalGap="0">
+    					<mx:Repeater id="locationRepeater" dataProvider="{locations}">
+    					    <mx:HBox styleName="listItem" width="100%">
+                                <mx:Image width="21" height="25" source="{locationRepeater.currentItem.image}" />
+                                <mx:Label width="100%" text="{locationRepeater.currentItem.name}" />
+                            </mx:HBox>
+    					</mx:Repeater>
+					</mx:VBox>
+				</mx:VBox>
+			</mx:Canvas>
+			
+		</mx:VBox>
+		
+		<mx:Canvas width="68%" height="100%">
+			<mx:Image source="@Embed('/assets/support_map.png')" scaleContent="true" left="2" right="2" top="2" bottom="2"/>
+		</mx:Canvas>
+		
+	</mx:HBox>
+	
+</mx:Canvas>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/akotter.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/akotter.jpg b/FlexStore/mx/src/assets/akotter.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/mx/src/assets/akotter.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/bcrater.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/bcrater.jpg b/FlexStore/mx/src/assets/bcrater.jpg
new file mode 100644
index 0000000..fd15d59
Binary files /dev/null and b/FlexStore/mx/src/assets/bcrater.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/beige_background.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/beige_background.jpg b/FlexStore/mx/src/assets/beige_background.jpg
new file mode 100644
index 0000000..8f034ba
Binary files /dev/null and b/FlexStore/mx/src/assets/beige_background.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/beige_dotted_map.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/beige_dotted_map.png b/FlexStore/mx/src/assets/beige_dotted_map.png
new file mode 100644
index 0000000..e88d9ef
Binary files /dev/null and b/FlexStore/mx/src/assets/beige_dotted_map.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/blue_background.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/blue_background.jpg b/FlexStore/mx/src/assets/blue_background.jpg
new file mode 100644
index 0000000..361ce0e
Binary files /dev/null and b/FlexStore/mx/src/assets/blue_background.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/blue_dotted_map.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/blue_dotted_map.png b/FlexStore/mx/src/assets/blue_dotted_map.png
new file mode 100644
index 0000000..5fa6714
Binary files /dev/null and b/FlexStore/mx/src/assets/blue_dotted_map.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/grip.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/grip.png b/FlexStore/mx/src/assets/grip.png
new file mode 100644
index 0000000..64ee835
Binary files /dev/null and b/FlexStore/mx/src/assets/grip.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/icon_cart_empty.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/icon_cart_empty.png b/FlexStore/mx/src/assets/icon_cart_empty.png
new file mode 100644
index 0000000..562064b
Binary files /dev/null and b/FlexStore/mx/src/assets/icon_cart_empty.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/icon_cart_full.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/icon_cart_full.png b/FlexStore/mx/src/assets/icon_cart_full.png
new file mode 100644
index 0000000..007b08c
Binary files /dev/null and b/FlexStore/mx/src/assets/icon_cart_full.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/icon_compare.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/icon_compare.png b/FlexStore/mx/src/assets/icon_compare.png
new file mode 100644
index 0000000..efc3ea1
Binary files /dev/null and b/FlexStore/mx/src/assets/icon_compare.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/icon_details.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/icon_details.png b/FlexStore/mx/src/assets/icon_details.png
new file mode 100644
index 0000000..2d2bfb9
Binary files /dev/null and b/FlexStore/mx/src/assets/icon_details.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/icon_magnifier.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/icon_magnifier.png b/FlexStore/mx/src/assets/icon_magnifier.png
new file mode 100644
index 0000000..939f814
Binary files /dev/null and b/FlexStore/mx/src/assets/icon_magnifier.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/icon_tiles.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/icon_tiles.png b/FlexStore/mx/src/assets/icon_tiles.png
new file mode 100644
index 0000000..dbf75b6
Binary files /dev/null and b/FlexStore/mx/src/assets/icon_tiles.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/jproctor.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/jproctor.jpg b/FlexStore/mx/src/assets/jproctor.jpg
new file mode 100644
index 0000000..1111787
Binary files /dev/null and b/FlexStore/mx/src/assets/jproctor.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/logo_blue.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/logo_blue.png b/FlexStore/mx/src/assets/logo_blue.png
new file mode 100644
index 0000000..132b894
Binary files /dev/null and b/FlexStore/mx/src/assets/logo_blue.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/logo_orange.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/logo_orange.png b/FlexStore/mx/src/assets/logo_orange.png
new file mode 100644
index 0000000..c776c8c
Binary files /dev/null and b/FlexStore/mx/src/assets/logo_orange.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/abrilliam.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/abrilliam.jpg b/FlexStore/mx/src/assets/pic/abrilliam.jpg
new file mode 100644
index 0000000..6954858
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/abrilliam.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/akotter.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/akotter.jpg b/FlexStore/mx/src/assets/pic/akotter.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/akotter.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/bcrater.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/bcrater.jpg b/FlexStore/mx/src/assets/pic/bcrater.jpg
new file mode 100644
index 0000000..fd15d59
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/bcrater.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/bleporte.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/bleporte.jpg b/FlexStore/mx/src/assets/pic/bleporte.jpg
new file mode 100644
index 0000000..c4769e8
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/bleporte.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/bvanbrocklin.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/bvanbrocklin.jpg b/FlexStore/mx/src/assets/pic/bvanbrocklin.jpg
new file mode 100644
index 0000000..489fa2e
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/bvanbrocklin.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/ccarpenter.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/ccarpenter.jpg b/FlexStore/mx/src/assets/pic/ccarpenter.jpg
new file mode 100644
index 0000000..c1dc3d8
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/ccarpenter.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/clampberto.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/clampberto.jpg b/FlexStore/mx/src/assets/pic/clampberto.jpg
new file mode 100644
index 0000000..9deacd2
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/clampberto.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/davenon.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/davenon.jpg b/FlexStore/mx/src/assets/pic/davenon.jpg
new file mode 100644
index 0000000..6a2a142
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/davenon.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/dmcgoyal.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/dmcgoyal.jpg b/FlexStore/mx/src/assets/pic/dmcgoyal.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/dmcgoyal.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/dwillhelm.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/dwillhelm.jpg b/FlexStore/mx/src/assets/pic/dwillhelm.jpg
new file mode 100644
index 0000000..fd15d59
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/dwillhelm.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/esunderland.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/esunderland.jpg b/FlexStore/mx/src/assets/pic/esunderland.jpg
new file mode 100644
index 0000000..c4769e8
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/esunderland.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/jproctor.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/jproctor.jpg b/FlexStore/mx/src/assets/pic/jproctor.jpg
new file mode 100644
index 0000000..1111787
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/jproctor.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/mfields.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/mfields.jpg b/FlexStore/mx/src/assets/pic/mfields.jpg
new file mode 100644
index 0000000..489fa2e
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/mfields.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/pdempsey.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/pdempsey.jpg b/FlexStore/mx/src/assets/pic/pdempsey.jpg
new file mode 100644
index 0000000..9deacd2
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/pdempsey.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/ptranep.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/ptranep.jpg b/FlexStore/mx/src/assets/pic/ptranep.jpg
new file mode 100644
index 0000000..4b9a03b
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/ptranep.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/rcrawley.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/rcrawley.jpg b/FlexStore/mx/src/assets/pic/rcrawley.jpg
new file mode 100644
index 0000000..9b60320
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/rcrawley.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/rdreifus.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/rdreifus.jpg b/FlexStore/mx/src/assets/pic/rdreifus.jpg
new file mode 100644
index 0000000..6a2a142
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/rdreifus.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/pic/twong.jpg
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/pic/twong.jpg b/FlexStore/mx/src/assets/pic/twong.jpg
new file mode 100644
index 0000000..1124b71
Binary files /dev/null and b/FlexStore/mx/src/assets/pic/twong.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/support_map.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/support_map.png b/FlexStore/mx/src/assets/support_map.png
new file mode 100644
index 0000000..c2f2394
Binary files /dev/null and b/FlexStore/mx/src/assets/support_map.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/support_mapmarker_a.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/support_mapmarker_a.png b/FlexStore/mx/src/assets/support_mapmarker_a.png
new file mode 100644
index 0000000..20c21e1
Binary files /dev/null and b/FlexStore/mx/src/assets/support_mapmarker_a.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/support_mapmarker_b.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/support_mapmarker_b.png b/FlexStore/mx/src/assets/support_mapmarker_b.png
new file mode 100644
index 0000000..069ccd8
Binary files /dev/null and b/FlexStore/mx/src/assets/support_mapmarker_b.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/support_mapmarker_c.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/support_mapmarker_c.png b/FlexStore/mx/src/assets/support_mapmarker_c.png
new file mode 100644
index 0000000..f6b587e
Binary files /dev/null and b/FlexStore/mx/src/assets/support_mapmarker_c.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/support_mapmarker_plus.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/support_mapmarker_plus.png b/FlexStore/mx/src/assets/support_mapmarker_plus.png
new file mode 100644
index 0000000..4192088
Binary files /dev/null and b/FlexStore/mx/src/assets/support_mapmarker_plus.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/assets/trashcan.png
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/assets/trashcan.png b/FlexStore/mx/src/assets/trashcan.png
new file mode 100644
index 0000000..9df75d7
Binary files /dev/null and b/FlexStore/mx/src/assets/trashcan.png differ

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/beige.css
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/beige.css b/FlexStore/mx/src/beige.css
new file mode 100644
index 0000000..e93830d
--- /dev/null
+++ b/FlexStore/mx/src/beige.css
@@ -0,0 +1,166 @@
+/*
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+*/
+
+/* Style for color-specific state - Beige */
+
+/*
+//----------------------------
+//  Global styles
+//----------------------------
+*/
+.global
+{
+    highlightAlphas:        .5, .25;
+    borderColor:            #939A9D;
+    headerColors:           #A65904, #E68701;
+    themeColor:             #75B1CE;
+    rollOverColor:          #D6E6EE;
+    selectionColor:         #B8D5E4;
+}
+
+/*
+//----------------------------
+// Type selectors
+//----------------------------
+*/
+Application
+{
+    backgroundColor:		#EAE6DD;
+    backgroundImage:        Embed("assets/beige_background.jpg");
+}
+
+/*
+//----------------------------
+// Apply to Panels and Alerts by default
+//----------------------------
+*/
+.windowStatus {
+	color: #FFCC99;
+}
+
+.windowStyles {		/* catalog panel's title text */
+	color: #FFCC99;
+}
+
+/*
+//----------------------------
+// Named styles
+//----------------------------
+*/
+
+.colorPanel /* for the background of some surfaces */
+{
+    borderStyle:            "solid";
+    borderThickness:        0;
+    backgroundColor:		#BCB29F;
+    backgroundAlpha:		0.4;
+    color: 					#170505;
+    cornerRadius:           4;
+    dropShadowEnabled:      true;
+}
+
+.homeProgramHeader /* in HomeView */
+{
+    fontWeight:             "bold";
+    fontSize:               13;
+    color:                  #BE7E3F;
+}
+
+.homeMap
+{
+    borderStyle:            "solid";
+    cornerRadius:           4;
+    backgroundColor:        #BE7E3F;
+    alpha:                  1;
+    dottedMap:              Embed("assets/beige_dotted_map.png");
+}
+
+.instructions
+{
+    alpha:                  .85;
+    color:                  #5C5857;
+}
+
+.storeControlBar
+{
+    fillAlphas: 			.60, .40;
+    fillColors: 			#8F8879, #BCB29F;
+    highlightAlphas:		.05, .25;
+    cornerRadius: 			3;
+	shadowDistance:         4;
+	paddingLeft:            0;
+	paddingRight:           0;
+	paddingTop:             0;
+	paddingBottom:          0;
+	horizontalGap:          0;
+    storeLogo:              Embed("assets/logo_orange.png");
+}
+
+.storeButtonBar
+{
+    cornerRadius:           0;
+    buttonStyleName:        "storeButton";
+    themeColor:             #A65904;
+}
+
+.storeButton
+{
+    cornerRadius:           0;
+    fillColors:             #8F8879, #BCB29F, #A65904, #E68701;
+    fillAlphas:             1, 1;
+    highlightAlphas:        .5, .25;
+    fontWeight:             "normal";
+    selectedOverSkin:       ClassReference("samples.flexstore.ButtonBarButtonSkin");
+    selectedUpSkin:         ClassReference("samples.flexstore.ButtonBarButtonSkin");
+    overSkin:               ClassReference("samples.flexstore.ButtonBarButtonSkin");
+}
+
+.catalogTitleButtonSelected
+{
+    color:                  #FFFFFF;
+    fontWeight:             "bold";
+}
+
+.catalogTitleButtonDeselected
+{
+    color:                  #222222;
+    fontWeight:             "bold";
+}
+
+.catalogTitleButtonHighlighted
+{
+    color:                  #FFCC99;
+    fontWeight:             "bold";
+}
+
+.catalogPanel
+{
+    highlightAlphas:        .5, .25;
+    headerColors:           #A65904, #E68701;
+    borderAlpha:            1;
+    borderColor:            #FFFFFF;
+    borderThicknessRight:   1;
+    borderThicknessBottom:  1;
+    paddingRight:           0;
+    paddingBottom:          0;
+}
+
+

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/blue.css
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/blue.css b/FlexStore/mx/src/blue.css
new file mode 100644
index 0000000..58e98cd
--- /dev/null
+++ b/FlexStore/mx/src/blue.css
@@ -0,0 +1,165 @@
+/*
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+*/
+
+/* Style for color-specific state - Beige */
+
+/*
+//----------------------------
+//  Global styles
+//----------------------------
+*/
+.global
+{
+    highlightAlphas:        .5, .25;
+    borderColor:            #939A9D;
+    headerColors:           #456F84, #9ABBC9;
+    themeColor:             #75B1CE;
+    rollOverColor:          #D6E6EE;
+    selectionColor:         #B8D5E4;
+}
+
+/*
+//----------------------------
+// Type selectors
+//----------------------------
+*/
+Application
+{
+    backgroundColor:		#AAB2B7;
+    backgroundImage:        Embed("assets/blue_background.jpg");
+}
+
+/*
+//----------------------------
+// Apply to Panels and Alerts by default
+//----------------------------
+*/
+.windowStatus {
+	color: #BDE9FA;
+}
+
+.windowStyles {		/* catalog panel's title text */
+	color: #BDE9FA;
+}
+
+/*
+//----------------------------
+// Named styles
+//----------------------------
+*/
+
+.colorPanel /* for the background of some surfaces */
+{
+    borderStyle:            "solid";
+    borderThickness:        0;
+    backgroundColor:		#BDD6E2;
+    backgroundAlpha:		0.4;
+    color: 					#170505;
+    cornerRadius:           4;
+    dropShadowEnabled:      true;
+}
+
+.homeProgramHeader /* in HomeView */
+{
+    fontWeight:             "bold";
+    fontSize:               13;
+    color:                  #7AA4B9;
+}
+
+.homeMap
+{
+    borderStyle:            "solid";
+    cornerRadius:           4;
+    backgroundColor:        #7AA4B9;
+    alpha:                  1;
+    dottedMap:              Embed("assets/blue_dotted_map.png");
+}
+
+.instructions
+{
+    alpha:                  .85;
+    color:                  #5C5857;
+}
+
+.storeControlBar
+{
+    fillAlphas: 			.60, .40;
+    fillColors: 			#4A6F81, #BDD6E2;
+    highlightAlphas:		.05, .25;
+    cornerRadius: 			3;
+	shadowDistance:         4;
+	paddingLeft:            0;
+	paddingRight:           0;
+	paddingTop:             0;
+	paddingBottom:          0;
+	horizontalGap:          0;
+    storeLogo:              Embed("assets/logo_blue.png");
+}
+
+.storeButtonBar
+{
+    cornerRadius:           0;
+    buttonStyleName:        "storeButton";
+    themeColor:             #456F84;
+}
+
+.storeButton
+{
+    cornerRadius:           0;
+    fillColors:             #4A6F81, #BDD6E2, #456F84, #9ABBC9;
+    fillAlphas:             1, 1;
+    highlightAlphas:        .5, .25;
+    fontWeight:             "normal";
+    selectedOverSkin:       ClassReference("samples.flexstore.ButtonBarButtonSkin");
+    selectedUpSkin:         ClassReference("samples.flexstore.ButtonBarButtonSkin");
+    overSkin:               ClassReference("samples.flexstore.ButtonBarButtonSkin");
+}
+
+.catalogTitleButtonSelected
+{
+    color:                  #FFFFFF;
+    fontWeight:             "bold";
+}
+
+.catalogTitleButtonDeselected
+{
+    color:                  #222222;
+    fontWeight:             "bold";
+}
+
+.catalogTitleButtonHighlighted
+{
+    color:                  #BDE9FA;
+    fontWeight:             "bold";
+}
+
+.catalogPanel
+{
+    highlightAlphas:        .5, .25;
+    headerColors:           #456F84, #9ABBC9;
+    borderAlpha:            1;
+    borderColor:            #FFFFFF;
+    borderThicknessRight:   1;
+    borderThicknessBottom:  1;
+    paddingRight:           0;
+    paddingBottom:          0;
+}
+

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/data/catalog.xml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/data/catalog.xml b/FlexStore/mx/src/data/catalog.xml
new file mode 100644
index 0000000..423e177
--- /dev/null
+++ b/FlexStore/mx/src/data/catalog.xml
@@ -0,0 +1,256 @@
+<?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.
+ 
+ -->
+<catalog>
+
+    <product productId="1">
+        <name>Andrew Brilliam</name>
+        <description>15 years experience. 8 years with Flex.  Specializing in Text Layout Framework</description>
+        <price>60.00</price>
+        <image>assets/pic/abrilliam.jpg</image>
+        <experience>15</experience>
+        <blazeds>false</blazeds>
+        <mobile>false</mobile>
+        <video>false</video>
+        <highlight1>Text Layout Framework</highlight1>
+		<highlight2>Parsley</highlight2>
+    </product>
+
+    <product productId="2">
+        <name>Annette Kotter</name>
+        <description>Specializing in custom components.  PHP servers.</description>
+        <price>55</price>
+        <image>assets/pic/akotter.jpg</image>
+        <experience>3</experience>
+        <blazeds>true</blazeds>
+        <mobile>false</mobile>
+        <video>false</video>
+        <highlight1>Custom Components</highlight1>
+		<highlight2>PHP</highlight2>
+    </product>
+
+    <product productId="3">
+        <name>Ben Crater</name>
+        <description>Specializing in BlazeDS backends.</description>
+        <price>55</price>
+        <image>assets/pic/bcrater.jpg</image>
+        <experience>4</experience>
+        <blazeds>true</blazeds>
+        <mobile>false</mobile>
+        <video>false</video>
+        <highlight1>BlazeDS</highlight1>
+		<highlight2>Remote Object</highlight2>
+    </product>
+
+    <product productId="4">
+        <name>Beth Leporte</name>
+        <description>BlazeDS or PHP servers.  Multimedia messagin.</description>
+        <price>70.00</price>
+        <image>assets/pic/bleporte.jpg</image>
+        <experience>6</experience>
+        <blazeds>true</blazeds>
+        <mobile>false</mobile>
+        <video>false</video>
+        <highlight1>Multimedia messaging</highlight1>
+		<highlight2>BlazeDS</highlight2>
+    </product>
+
+    <product productId="5">
+        <name>Brad Van Brocklin</name>
+        <description>Emphasis on mobile application development</description>
+        <price>80</price>
+        <image>assets/pic/bvanbrocklin.jpg</image>
+        <experience>6</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>false</video>
+        <highlight1>Mobile</highlight1>
+		<highlight2>Android</highlight2>
+    </product>
+
+    <product productId="6">
+        <name>Carlos Carpenter</name>
+        <description>Built many mobile apps and video apps.</description>
+        <price>80</price>
+        <image>assets/pic/ccarpenter.jpg</image>
+        <experience>4</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Mobile</highlight1>
+		<highlight2>Video</highlight2>
+    </product>
+
+    <product productId="7">
+        <name>Christine Lampberto</name>
+        <description>7 years experience building mobile applications.</description>
+        <price>90</price>
+        <image>assets/pic/clampberto.jpg</image>
+        <experience>7</experience>
+        <blazeds>true</blazeds>
+        <mobile>true</mobile>
+        <video>false</video>
+        <highlight1>BlazeDS</highlight1>
+		<highlight2>Mobile</highlight2>
+    </product>
+
+    <product productId="8">
+        <name>Dee Dee Avenon</name>
+        <description>I've been making video apps for over 5 years and mobile apps for about 3 years.</description>
+        <price>100</price>
+        <image>assets/pic/davenon.jpg</image>
+        <experience>10</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="9">
+        <name>Denise McGoyal</name>
+        <description>Specializing in video sharing applicaions.  MObile apps too.</description>
+        <price>100</price>
+        <image>assets/pic/dmcgoyal.jpg</image>
+        <experience>5</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="10">
+        <name>Daniel Willhelm</name>
+        <description>I'm into mobile apps, video apps and social apps.</description>
+        <price>70</price>
+        <image>assets/pic/dwillhelm.jpg</image>
+        <experience>90</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="11">
+        <name>Eunice Sunderland</name>
+        <description>My recent focus is on mobile apps, but I have considerable experience in video apps as well.</description>
+        <price>150</price>
+        <image>assets/pic/esunderland.jpg</image>
+        <experience>30</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="12">
+        <name>Jane Proctor</name>
+        <description>I've been developing mobile companion apps for the past 3 years.</description>
+        <price>75</price>
+        <image>assets/pic/jproctor.jpg</image>
+        <experience>6</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="13">
+        <name>Mark Fields</name>
+        <description>Video is my favorite thing.  Mobile is also a favorite.</description>
+        <price>60</price>
+        <image>assets/pic/mfields.jpg</image>
+        <experience>70</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="14">
+        <name>Patricia Dempsey</name>
+        <description>I've been cranking out mobile apps for the past 6 years.  A few have involved video as well.</description>
+        <price>120</price>
+        <image>assets/pic/pdempsey.jpg</image>
+        <experience>7</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="15">
+        <name>Paul Trandep</name>
+        <description>I've been working on a mobile app that incorporates music.  It just shipped so now I'm looking for the next fun thing to work on.'</description>
+        <price>50</price>
+        <image>assets/pic/ptranep.jpg</image>
+        <experience>6</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="16">
+        <name>Roscoe Crawley</name>
+        <description>My main specialty is in BlazeDS connected to Flex.</description>
+        <price>59</price>
+        <image>assets/pic/rcrawley.jpg</image>
+        <experience>9</experience>
+        <blazeds>true</blazeds>
+        <mobile>false</mobile>
+        <video>false</video>
+        <highlight1>BlazeDS</highlight1>
+		<highlight2>Remote Object</highlight2>
+    </product>
+
+    <product productId="17">
+        <name>Renee Dreifus</name>
+            <description>I can do it all: BlazeDS, Mobile, Video.</description>
+        <price>79</price>
+        <image>assets/pic/rdreifus.jpg</image>
+        <experience>90</experience>
+        <blazeds>true</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+    <product productId="18">
+        <name>Tina Wong</name>
+        <description>I've been developing Flex apps since 1.5.  Most of my recent work has been on mobile apps.</description>
+        <price>109</price>
+        <image>assets/pic/twong.jpg</image>
+        <experience>9</experience>
+        <blazeds>false</blazeds>
+        <mobile>true</mobile>
+        <video>true</video>
+        <highlight1>Video Applications</highlight1>
+		<highlight2>Mobile Applications</highlight2>
+    </product>
+
+</catalog>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/main.css
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/main.css b/FlexStore/mx/src/main.css
new file mode 100644
index 0000000..23fd5c2
--- /dev/null
+++ b/FlexStore/mx/src/main.css
@@ -0,0 +1,83 @@
+/*
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+*/
+
+/*
+//----------------------------
+//  Global styles
+//----------------------------
+*/
+.global {
+    color:                  #170505;
+    fillAlphas:             1.00, 1.00; /* last pair are for OVER state */
+    fillColors: 		    #FFFFFF, #DDDDDD, #FFFFFF, #EEEEEE;
+}
+
+/*
+//----------------------------
+// Type selectors
+//----------------------------
+*/
+
+HRule
+{
+    color:                  #666666;
+}
+
+/*
+//----------------------------
+// Named styles
+//----------------------------
+*/
+.glass {
+    borderColor:		    #767473;
+    fillAlphas: 		    .60, .60, .60, .60;
+    fillColors: 		    #888888, #F3F3F3, #9E9E9E, #FCFCFC;
+    highlightAlphas:	    .07, .45;
+}
+
+.glassSlider
+{
+    fillAlphas: 		    .80, .80, .80, .80;
+    fillColors: 		    #F3F3F3, #BBBBBB, #FCFCFC, #CCCCCC;
+}
+
+.listItem
+{
+    paddingLeft:            4;
+    paddingRight:           4;
+    horizontalGap:          5;
+    verticalAlign:          "middle";
+    backgroundColor:        #FFFFFF;
+    backgroundAlpha:        .5;
+    borderStyle:            "outset";
+}
+
+.sectionHeader
+{
+    fontWeight:             "bold";
+    fontSize:               11;
+}
+
+.homeSection
+{
+    cornerRadius:           4;
+    borderStyle:            "solid";
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/productsView/CatalogTitleButtons.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/productsView/CatalogTitleButtons.mxml b/FlexStore/mx/src/productsView/CatalogTitleButtons.mxml
new file mode 100644
index 0000000..526f1b6
--- /dev/null
+++ b/FlexStore/mx/src/productsView/CatalogTitleButtons.mxml
@@ -0,0 +1,62 @@
+<?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.
+
+-->
+<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" 
+    verticalAlign="middle" 
+    paddingTop="0" 
+    paddingBottom="0"
+    horizontalScrollPolicy="off"
+	currentState="showFilter">
+    <mx:Script>
+        <![CDATA[
+            [Bindable]
+            public var cartCount:int;
+            
+            private function rollOverLabel(event:Event):void
+            {
+                Label(event.target).setStyle("styleName", "catalogTitleButtonHighlighted");
+            }
+            
+            private function rollOutLabel(event:Event):void
+            {
+                Label(event.target).setStyle("styleName", "catalogTitleButtonDeselected");
+            }
+        ]]>
+    </mx:Script>
+    
+    <mx:Spacer width="100%" />
+    <mx:Label id="findPhones" text="Find Developers" click="currentState = 'showFilter'"/>
+    <mx:VRule height="{findPhones.height * .75}" themeColor="#333333" alpha=".75"/>
+    <mx:Label id="viewCart" text="View Cart ({cartCount} items)" click="currentState = 'showCart'"/>
+    
+    <mx:states>
+        <mx:State name="showFilter">
+            <mx:SetStyle target="{findPhones}" name="styleName" value="catalogTitleButtonSelected" />
+            <mx:SetStyle target="{viewCart}" name="styleName" value="catalogTitleButtonDeselected" />
+            <mx:SetEventHandler target="{viewCart}" name="rollOver" handlerFunction="rollOverLabel" />
+            <mx:SetEventHandler target="{viewCart}" name="rollOut" handlerFunction="rollOutLabel" />
+        </mx:State>
+        <mx:State name="showCart">
+            <mx:SetStyle target="{viewCart}" name="styleName" value="catalogTitleButtonSelected" />            
+            <mx:SetStyle target="{findPhones}" name="styleName" value="catalogTitleButtonDeselected" />
+            <mx:SetEventHandler target="{findPhones}" name="rollOver" handlerFunction="rollOverLabel" />
+            <mx:SetEventHandler target="{findPhones}" name="rollOut" handlerFunction="rollOutLabel" />
+        </mx:State>
+    </mx:states>
+</mx:HBox>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/productsView/Grip.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/productsView/Grip.mxml b/FlexStore/mx/src/productsView/Grip.mxml
new file mode 100644
index 0000000..97f4b45
--- /dev/null
+++ b/FlexStore/mx/src/productsView/Grip.mxml
@@ -0,0 +1,35 @@
+<?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.
+
+-->
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="17" height="100%" 
+    paddingTop="10" horizontalAlign="center">
+    <mx:Script>
+        <![CDATA[
+           [Bindable]
+           public var gripTip:String; 
+           
+           [Bindable]
+           public var gripIcon:Class;
+        ]]>
+    </mx:Script>
+
+    <mx:Image source="{gripIcon}" />
+    <mx:Image source="@Embed('/assets/grip.png')" toolTip="{gripTip}" />
+    
+</mx:VBox>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/productsView/ProductCart.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/productsView/ProductCart.mxml b/FlexStore/mx/src/productsView/ProductCart.mxml
new file mode 100644
index 0000000..81ddd13
--- /dev/null
+++ b/FlexStore/mx/src/productsView/ProductCart.mxml
@@ -0,0 +1,115 @@
+<?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.
+
+-->
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" 
+    xmlns:productsView="productsView.*"
+    horizontalAlign="right"
+    paddingTop="8"
+    paddingBottom="8"
+    paddingRight="4"
+    paddingLeft="4"
+    horizontalScrollPolicy="off"
+    verticalScrollPolicy="off">
+    
+    <mx:Script>
+        <![CDATA[
+        
+        import mx.controls.Alert;
+        
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductListEvent;
+        
+        [Bindable]
+        public var numProducts:int=0;
+        
+        [Bindable]
+        private var total:Number = 0;
+
+        private const SHIPPING:Number = 1.99;
+        
+        private function productListEventHandler(event:ProductListEvent):void
+        {
+            switch (event.type)
+            {
+                case ProductListEvent.ADD_PRODUCT:
+                    event.product.qty = 0;  
+                    //fall through into the same logic as dup          
+                case ProductListEvent.DUPLICATE_PRODUCT:
+                    event.product.qty++;
+                    total += event.product.price;
+                    numProducts++;
+                    break;            
+                case ProductListEvent.PRODUCT_QTY_CHANGE:
+                case ProductListEvent.REMOVE_PRODUCT:
+                    var items:Array = productList.items;
+                    total = 0; 
+                    numProducts = 0;
+                    for (var i:int=0; i < items.length; i++)
+                    {
+                        var product:Product = items[i].product;
+                        total += product.qty * product.price;
+                        numProducts += product.qty;
+                    }       
+                    break;
+                default:
+                    break;
+            }
+        }
+        
+        ]]>
+    </mx:Script>
+    
+    <mx:CurrencyFormatter currencySymbol="$" id="cf" precision="2"/>
+    
+    <mx:Label width="100%" text="Your Shopping Cart" styleName="sectionHeader"/>
+        
+    <productsView:ProductList id="productList" height="100%" width="100%"
+        newItemStartX="-100" newItemStartY="-100" 
+        addProduct="productListEventHandler(event)"
+        duplicateProduct="productListEventHandler(event)"
+        productQtyChange="productListEventHandler(event)"
+        removeProduct="productListEventHandler(event)"
+        showQuantity="true"
+        />
+    
+    <mx:Form verticalGap="0" paddingRight="0">
+
+        <mx:FormItem label="Total:">
+
+            <mx:Label width="70" text="{cf.format(total)}" textAlign="right"/>
+
+        </mx:FormItem>
+
+        <mx:FormItem label="Service Fee:">
+
+            <mx:Label width="70" text="{cf.format(numProducts * SHIPPING)}" textAlign="right"/>
+
+        </mx:FormItem>
+
+        <mx:FormItem label="Grand Total:" fontWeight="bold">
+
+            <mx:Label width="70" text="{cf.format(total + (numProducts * SHIPPING))}" textAlign="right"/>
+
+        </mx:FormItem>
+
+    </mx:Form>
+
+    <mx:Button label="Submit Order"  click="Alert.show('This feature is not implemented in this sample', 'Submit Order')"/>
+
+</mx:VBox>


[3/4] add mx and spark versions of FlexStore

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/productsView/ProductCatalogPanel.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/productsView/ProductCatalogPanel.mxml b/FlexStore/mx/src/productsView/ProductCatalogPanel.mxml
new file mode 100644
index 0000000..63754ba
--- /dev/null
+++ b/FlexStore/mx/src/productsView/ProductCatalogPanel.mxml
@@ -0,0 +1,534 @@
+<?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.
+
+-->
+<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" 
+    xmlns:productsView="productsView.*"
+    layout="vertical" 
+    currentState="browse"
+    verticalScrollPolicy="off"
+    horizontalScrollPolicy="off"
+    styleName="catalogPanel">
+    
+    <mx:Metadata>
+        [Event(name="purchase", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="compare", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="details", type="samples.flexstore.ProductThumbEvent")]
+    </mx:Metadata>
+    
+    <mx:Script>
+        <![CDATA[
+        import flash.utils.Dictionary;
+        
+        import mx.collections.ArrayCollection;
+        import mx.collections.IViewCursor;
+        import mx.core.DragSource;
+        import mx.core.IUIComponent;
+        import mx.effects.Effect;
+        import mx.effects.Fade;
+        import mx.effects.Move;
+        import mx.events.EffectEvent;
+        import mx.events.DragEvent;
+        import mx.managers.DragManager;
+
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductFilter;
+        import samples.flexstore.ProductFilterEvent;
+        import samples.flexstore.ProductThumbEvent;
+       
+     
+        private var accepted:Dictionary = new Dictionary();
+        private var thumbnails:Array;
+        private var filterCount:int;
+        private var thumbnailState:String = 'browse'; //either 'browse' or 'compare'
+        [Bindable]
+        private var titleButtons:CatalogTitleButtons; //the buttons that also allow the panel to switch sides
+        
+        override protected function createChildren():void
+        {
+            super.createChildren();
+            titleButtons = new CatalogTitleButtons();
+            titleBar.addChild(titleButtons);
+            
+        }
+
+        override protected function layoutChrome(unscaledWidth:Number, unscaledHeight:Number):void
+        {        
+            super.layoutChrome(unscaledWidth, unscaledHeight);
+            //when adding to a UIComponent (not a Container) need explicit width/height
+            titleButtons.width = unscaledWidth / 2; //make it big so as we add cart items we can stretch)
+            titleButtons.height = titleButtons.measuredHeight;
+            //this placement algorithm is pretty hacky, there are better ways that probably
+            //involve copying more of the Panel layoutChrome method and supporting methods
+            titleButtons.move(statusTextField.x - titleButtons.width, titleTextField.y);
+        }
+        
+        
+        [Bindable]
+        public var cartCount:int;
+        
+        //-----------------------------
+        // catalog
+        //-----------------------------
+        
+        private var _catalog:ArrayCollection;
+        
+        [Bindable]
+        public function set catalog(c:ArrayCollection):void
+        {
+            _catalog = c;
+            createThumbnails();
+        }
+        
+        public function get catalog():ArrayCollection
+        {
+            return _catalog;
+        }
+        
+        //----------------------------------------------------------------------
+        // methods
+        //----------------------------------------------------------------------
+       
+        private function createThumbnails():void
+        {
+            var i:int; //variables are hoisted up in scope so declare here to avoid warning
+            if (thumbnails != null)
+            {
+                for (i=0; i < thumbnails.length; i++)
+                {
+                    thumbContent.removeChild(thumbnails[i]);
+                }
+            }
+            
+            var row:int = 0;
+            var col:int = -1;
+            var n:int = catalog.length;
+            thumbnails = new Array(n);
+            filterCount = n;
+            
+            for (i=0; i < n; i++)
+            {
+                var thumb:ProductCatalogThumbnail = new ProductCatalogThumbnail();
+                thumbnails[i] = thumb;
+                thumbnails[i].showInAutomationHierarchy = true;
+                thumb.product = catalog.getItemAt(i) as Product;
+                accepted[thumb.product] = true;
+                thumbContent.addChild(thumb);
+                thumb.addEventListener(ProductThumbEvent.PURCHASE, productThumbEventHandler);
+                thumb.addEventListener(ProductThumbEvent.COMPARE, productThumbEventHandler);
+                thumb.addEventListener(ProductThumbEvent.DETAILS, productThumbEventHandler);
+                thumb.addEventListener(DragEvent.DRAG_START,thumbDragStartHandler);
+            }
+
+            layoutCatalog();
+        }
+        
+        private function thumbDragStartHandler(event:MouseEvent):void
+        {
+            if (DragManager.isDragging == false)
+            {
+                var thumb:ProductCatalogThumbnail = event.target as ProductCatalogThumbnail;
+                var ds:DragSource = new DragSource();
+                ds.addData(thumb.product, "product");
+
+                var di:ProductCatalogThumbnail = new ProductCatalogThumbnail();
+                di.product = thumb.product;
+                
+                //the offset logic is honestly not the most intuitive but
+                //it's necessary to get the dragProxy positioned correctly
+                DragManager.doDrag(thumbContent, ds, event, di, -thumb.x, 
+            				       -thumb.y + thumbContent.verticalScrollPosition, 
+            				       0.5, false);
+            }    
+        }
+        
+        public function filter(productFilter:ProductFilter, live:Boolean):void
+        {
+            currentState = "browse";
+            thumbnailState = "browse";
+            var count:int=0;
+            var n:int = thumbnails.length;
+            var fadeOut:Fade = new Fade();
+            fadeOut.alphaFrom = 1;
+            fadeOut.alphaTo = .1;
+            var targets:Array = [];
+            for (var i:int = 0; i < n; i++)
+            {
+                var thumb:ProductCatalogThumbnail = thumbnails[i];
+                var product:Product = thumb.product;
+                if (productFilter.accept(product))
+                {
+                    accepted[product] = true;
+                    thumb.alpha = 1;    
+                    count++;
+                }
+                else
+                {
+                    accepted[product] = false;
+                    if (live)
+                    {
+                        thumb.alpha = .1;
+                    }
+                    else if (thumb.alpha == 1) //only fade if we hadn't started
+                    {
+                        targets.push(thumb);
+                    }
+                }
+            }
+            productFilter.count = count;
+            filterCount = count;
+
+            if (targets.length > 0)    
+            {
+                fadeOut.targets = targets;
+                fadeOut.play();
+                fadeOut.addEventListener(EffectEvent.EFFECT_END,
+                    function(event:EffectEvent):void
+                    {
+                        layoutCatalog();
+                    });
+            }
+            else if (!live)
+            {
+                layoutCatalog();
+            }
+        }
+        
+        private function layoutCatalog():Effect
+        {
+            var tileWidth:Number;
+            var tileHeight:Number;
+            var numCols:int;
+
+            if (filterCount > 9 || currentState == "compare")
+            {
+                numCols = 4;
+                tileWidth = ProductCatalogThumbnail.COL_WIDTH_4;
+                tileWidth = currentState == "compare"
+                    ? ProductCatalogThumbnail.COMPARE_WIDTH
+                    : ProductCatalogThumbnail.COL_WIDTH_4
+                tileHeight = currentState == "compare"
+                    ? height - 4
+                    : ProductCatalogThumbnail.COL_HEIGHT_4;
+            }
+            else if (filterCount > 4)
+			{
+                numCols = 3;
+                tileWidth = ProductCatalogThumbnail.COL_WIDTH_3;
+                tileHeight = ProductCatalogThumbnail.COL_HEIGHT_3;
+            }
+			else if (filterCount <= 9)
+			{
+                numCols = 2;
+                tileWidth = ProductCatalogThumbnail.COL_WIDTH_2;
+                tileHeight = ProductCatalogThumbnail.COL_HEIGHT_2;
+            }
+			else
+			{
+            }
+            
+            var row:int = 0;
+            var col:int = -1;
+
+			var move:Move = null;
+
+            var n:int = catalog.length;
+			for (var i:int = 0 ; i < n ; i++)
+			{
+                var product:Product = catalog.getItemAt(i) as Product;
+                var thumb:ProductCatalogThumbnail = thumbnails[i];
+                if (accepted[product])
+                {
+                    thumb.currentState = "" + numCols + "cols";
+                    col++;
+                    if (col > numCols - 1)
+					{
+                        row++;
+                        col = 0;
+                    }
+
+                    var xTo:Number = col * (tileWidth + ProductCatalogThumbnail.HORIZONTAL_GAP);
+                    var yTo:Number = row * (tileHeight + ProductCatalogThumbnail.VERTICAL_GAP);
+
+                    // If the thumbnail is already visible
+					// animate it to its new position.
+                    if (thumb.visible)
+					{
+                        // Animate only if the position is different
+						// from its current position.
+                        if (thumb.x != xTo || thumb.y != yTo)
+						{
+                            move = new Move(thumb);
+                            move.xTo = xTo;
+                            move.yTo = yTo;
+                            move.play();
+                        }
+                    }
+
+                    // If the thumbnail was not previously visible, sets its
+					// x and y coordinates. We'll make it reappear after all
+                    // the visible thumbnails have reached their new position.
+					else
+					{
+                        thumb.x = xTo;
+                        thumb.y = yTo;
+                        thumb.includeInLayout = true;
+                    }
+                }
+				else
+				{
+                    thumb.visible = false;
+                    thumb.includeInLayout = false;
+                }
+            }
+
+            if (!move)
+			{
+                // No visible thumbnails were animated to a new position;
+				// fade in newly selected thumbnails right away.
+                fadeInThumbnails();
+            }
+			else
+			{
+			    //since movement is happening get the scrollbar back to the top
+				thumbContent.verticalScrollPosition = 0;
+                // Fade in newly selected thumbnails after the last
+				// visible thumbnail has moved to its new position.
+                move.addEventListener(EffectEvent.EFFECT_END,
+					function(event:EffectEvent):void
+					{
+						fadeInThumbnails();
+					});
+            }
+            //return the last move to watch
+            return move;
+        }
+        
+        //return the last effect so we could add effectEnd handler if desired
+        private function fadeInThumbnails():void
+		{
+			var n:int = thumbnails.length;
+			var effect:Fade = new Fade();
+			effect.alphaTo = 1;
+			var targets:Array = [];
+			for (var i:int = 0; i < n ; i++)
+			{
+			    var thumb:ProductCatalogThumbnail = thumbnails[i];
+			    if (accepted[thumb.product] && !thumb.visible)
+				{
+                    thumb.alpha = 0;
+                    thumb.visible = true;
+                    targets.push(thumb);
+                }
+            }
+            if (targets.length > 0)
+            {
+                effect.targets = targets;
+                effect.play();
+            }
+        }
+        
+        private function showDetails(product:Product):void
+        {
+            if (currentState == "details")
+			{
+                details.product = product;
+                return;
+            }
+
+            var row:int = -1;
+
+            //should be computed using border metrics instead of hard-coding the 20, but...
+			var xTo:Number = thumbContent.width - ProductCatalogThumbnail.COL_WIDTH_4 - 20;
+            var yTo:Number;
+
+            var move:Move;
+            var first:Boolean = true;
+            var selectedThumb:ProductCatalogThumbnail;
+
+            var n:int = thumbnails.length;
+			for (var i:int = 0; i < n; i++)
+			{
+			    var thumb:ProductCatalogThumbnail = thumbnails[i];
+                if (thumb.visible)
+				{
+                    row++;
+                    yTo = row * (ProductCatalogThumbnail.COL_HEIGHT_4 + ProductCatalogThumbnail.VERTICAL_GAP);
+
+                    thumb.currentState = "4cols";
+
+                    if (thumb.x != xTo || thumb.y != yTo)
+					{
+                        move = new Move(thumb);
+                        if (first)
+						{
+                            move.addEventListener(EffectEvent.EFFECT_END,
+								function(event:EffectEvent):void
+								{
+									details.product = product;
+                                    currentState = "details";
+								});
+
+                            first = false;
+                        }
+                        move.xTo = xTo;
+                        move.yTo = yTo;
+                        move.play();
+                    }
+                    
+                    if (thumb.product == product)
+                    {
+                        selectedThumb = thumb;
+                    }
+                }
+            }
+            if (selectedThumb != null)
+            {
+                //make sure that the selected thumb is visible in the list on the right
+                move.addEventListener(EffectEvent.EFFECT_END,
+					function(e:EffectEvent):void
+					{
+					    var curpos:int = thumbContent.verticalScrollPosition;
+					    if (selectedThumb.y < curpos)
+					    {
+					        thumbContent.verticalScrollPosition = y;
+					    }
+					    else if (selectedThumb.y + ProductCatalogThumbnail.COL_HEIGHT_4 > curpos + thumbContent.height)
+					    {
+					        //this logic doesn't seem to be perfect but it will do
+					        var diff:int = selectedThumb.y - (curpos + thumbContent.height)
+					        thumbContent.verticalScrollPosition += diff + ProductCatalogThumbnail.COL_HEIGHT_4 + ProductCatalogThumbnail.VERTICAL_GAP;
+					    }
+					});
+            }
+            
+        }
+        
+        private function productThumbEventHandler(event:ProductThumbEvent):void
+        {
+            if (event.type == ProductThumbEvent.DETAILS)
+            {
+                showDetails(event.product);
+            }
+            else if (event.type == ProductThumbEvent.BROWSE)
+            {
+                if (thumbnailState == "browse")
+                {                
+                    currentState = "browse";
+                    layoutCatalog();
+                }
+                else
+                {
+                    compare();
+                }
+            }
+            else
+            {
+                dispatchEvent(event);
+            }
+        }
+        
+        public function compare(toCompare:Array=null):void
+        {
+            currentState = "compare";
+            thumbnailState = "compare";
+            if (toCompare != null)
+            {
+                var n:int = thumbnails.length;
+                for (var i:int = 0; i < n; i++)
+                {
+                    accepted[thumbnails[i].product] = false;
+                }
+                for (i=0; i < toCompare.length; i++)
+                {
+                    accepted[toCompare[i]] = true;
+                }
+            }
+            var lastEffect:Effect = layoutCatalog();
+            if (lastEffect != null)
+            {
+                lastEffect.addEventListener(EffectEvent.EFFECT_END,
+                    function (event:EffectEvent):void
+                    {
+                        setCompareState();
+                    });
+            }
+            else
+            {
+                setCompareState();
+            }
+        }
+        
+        private function setCompareState():void
+        {
+            //avoid an issue if the user clicks quickly where we move into
+            //compare state even though we're no longer in compare
+            if (currentState == "compare") 
+            {
+                var n:int = thumbnails.length;
+                for (var i:int = 0; i < n; i++)
+                {
+                    var thumb:ProductCatalogThumbnail = thumbnails[i];
+                    if (accepted[thumb.product])
+                    {
+                        thumb.currentState = "compare";
+                    }
+                }
+                
+            }
+        }
+        
+        ]]>
+    </mx:Script>
+    
+    <mx:Binding source="cartCount" destination="titleButtons.cartCount" />
+    <!-- two-way binding between the states of panel title buttons and the product view state -->
+    <mx:Binding source="ProductsView(parentDocument).currentState" destination="titleButtons.currentState" />
+    <mx:Binding destination="ProductsView(parentDocument).currentState" source="titleButtons.currentState" />
+
+    <mx:Canvas width="100%" height="100%" 
+        verticalScrollPolicy="off"
+        horizontalScrollPolicy="off"
+        >
+        <mx:Canvas id="thumbContent" width="100%" height="100%" 
+            horizontalScrollPolicy="off"/>
+        <productsView:ProductDetails id="details"
+            width="{ProductCatalogThumbnail.COL_WIDTH_4 * 3}"
+            height="100%"
+            visible="false"
+            compare="productThumbEventHandler(event)"
+            purchase="productThumbEventHandler(event)"
+            browse="productThumbEventHandler(event)" />
+    </mx:Canvas>
+    
+    <mx:states>
+        <mx:State name="browse">
+            <mx:SetProperty name="title" value="Browse"/>
+        </mx:State>
+
+        <mx:State name="compare">
+            <mx:SetProperty name="title" value="Product Comparison"/>
+        </mx:State>
+
+        <mx:State name="details">
+            <mx:SetProperty name="title" value="Product Details"/>
+            <mx:SetProperty target="{details}" name="visible" value="true"/>
+        </mx:State>
+    </mx:states>
+    
+</mx:Panel>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/productsView/ProductCatalogThumbnail.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/productsView/ProductCatalogThumbnail.mxml b/FlexStore/mx/src/productsView/ProductCatalogThumbnail.mxml
new file mode 100644
index 0000000..88a8f0a
--- /dev/null
+++ b/FlexStore/mx/src/productsView/ProductCatalogThumbnail.mxml
@@ -0,0 +1,226 @@
+<?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.
+
+-->
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
+    width="{COL_WIDTH_4}" height="{COL_HEIGHT_4}"
+    borderStyle="solid"
+    borderColor="#FFFFFF"
+    horizontalScrollPolicy="off" verticalScrollPolicy="off"
+    rollOver="rollOverHandler(event)"
+    rollOut="rollOutHandler(event)"
+    mouseDown="mouseDownHandler(event)"
+    mouseMove="mouseMoveHandler(event)"
+    mouseUp="mouseUpHandler(event)"
+    click="clickHandler(event)"
+    currentState="4cols"
+    automationName="{product.name}"
+    dropShadowColor="#000000"
+    shadowDistance="2"
+    >
+
+    <mx:Metadata>
+        [Event(name="purchase", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="compare", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="details", type="samples.flexstore.ProductThumbEvent")]
+    </mx:Metadata>
+
+    <mx:Script>
+        <![CDATA[
+
+		import mx.events.*;
+        import mx.core.*;
+        
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductThumbEvent;
+        
+        public static const COL_WIDTH_4:int = 162;
+        public static const COL_HEIGHT_4:int = 122;
+        public static const COL_WIDTH_3:int = 217;
+        public static const COL_HEIGHT_3:int = 165;
+        public static const COL_WIDTH_2:int = 327;
+        public static const COL_HEIGHT_2:int = 250;
+        public static const COMPARE_WIDTH:int = 162;
+        public static const HORIZONTAL_GAP:int = 2;
+        public static const VERTICAL_GAP:int = 3;
+
+        [Bindable]
+        public var product:Product;
+
+        private function rollOverHandler(event:MouseEvent):void
+		{
+            setStyle("borderColor", "#CCCCCC");
+            setStyle("dropShadowEnabled", true);
+            buttons.visible = true;
+        }
+
+        private function rollOutHandler(event:MouseEvent):void
+		{
+            setStyle("borderColor", "#FFFFFF");
+            setStyle("dropShadowEnabled", false);
+			buttons.visible = false;
+        }
+
+        private var dragStartPoint:Point;
+
+        public function mouseDownHandler(event:MouseEvent):void
+        {
+            if (event.target != purchase &&
+                event.target != compare &&
+                event.target != details)
+            {
+                dragStartPoint = new Point(event.stageX, event.stageY);
+                dragStartPoint = globalToLocal(dragStartPoint);
+
+            }
+        }
+
+        public function mouseMoveHandler(event:MouseEvent):void
+        {
+            if (dragStartPoint != null)
+            {
+                var dragEvent:DragEvent = new DragEvent(DragEvent.DRAG_START, true);
+                dragEvent.localX = dragStartPoint.x;
+                dragEvent.localY = dragStartPoint.y;
+                dragEvent.buttonDown = true;
+                dispatchEvent(dragEvent);
+
+                rollOutHandler(event);
+
+                dragStartPoint = null;
+            }
+        }
+
+        public function mouseUpHandler(event:MouseEvent):void
+        {
+            if (dragStartPoint != null)
+            {
+                dragStartPoint = null;
+            }
+        }
+
+        public function clickHandler(event:MouseEvent):void
+        {
+            if (event.target != purchase &&
+                event.target != compare &&
+                event.target != details)
+            {
+                dispatchEvent(new ProductThumbEvent(ProductThumbEvent.DETAILS, product));
+            }
+        }
+
+	]]>
+    </mx:Script>
+
+    <mx:CurrencyFormatter currencySymbol="$" id="cf" precision="2"/>
+
+    <mx:VBox id="vb" width="100%" height="100%"
+        paddingLeft="6" paddingTop="4" paddingRight="8" paddingBottom="4"
+        verticalGap="0">
+
+        <mx:Label text="{product.name}" fontWeight="bold"/>
+
+        <mx:HBox width="100%" paddingTop="0" horizontalGap="4">
+
+            <mx:Image id="img" height="90" width="45" source="{product.image}" />
+
+            <mx:VBox id="descr" width="100%" height="100%" verticalGap="0" paddingTop="0">
+                <mx:Text text="{product.featureString}" selectable="false" width="80" height="48"/>
+                <mx:Label text="{cf.format(product.price)}" fontWeight="bold"/>
+				<mx:Spacer height="4"/>
+            </mx:VBox>
+
+        </mx:HBox>
+
+        <mx:Spacer height="8"/>
+
+    </mx:VBox>
+
+    <mx:VBox id="buttons" visible="false" verticalGap="4" paddingRight="8" right="8" top="12">
+        <mx:Button id="purchase" icon="@Embed('/assets/icon_cart_empty.png')" 
+            click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.PURCHASE, product))" 
+            width="30" toolTip="Add to cart"/>
+        <mx:Button id="compare" icon="@Embed('/assets/icon_compare.png')" 
+            click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.COMPARE, product))" 
+            width="30" toolTip="Add to compare list"/>
+        <mx:Button id="details" icon="@Embed('/assets/icon_details.png')" 
+            click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.DETAILS, product))" 
+            width="30" toolTip="Show details"/>
+    </mx:VBox>
+
+    <mx:states>
+
+        <mx:State name="compare">
+            <mx:SetProperty name="height" value="502"/>
+            <mx:AddChild relativeTo="{vb}">
+                <mx:Label text="Years: {product.experience}"/>
+            </mx:AddChild>
+            <mx:AddChild relativeTo="{vb}">
+                <mx:Label text="BlazeDS: {product.blazeds}"/>
+            </mx:AddChild>
+            <mx:AddChild relativeTo="{vb}">
+                <mx:Label text="Mobile: {product.mobile}"/>
+            </mx:AddChild>
+            <mx:AddChild relativeTo="{vb}">
+                <mx:Label text="Video: {product.video}"/>
+            </mx:AddChild>
+            <mx:AddChild relativeTo="{vb}">
+                <mx:Label text="Highlight: {product.highlight1}"/>
+            </mx:AddChild>
+            <mx:AddChild relativeTo="{vb}">
+                <mx:Label text="Highlight: {product.highlight2}"/>
+            </mx:AddChild>
+            <mx:AddChild relativeTo="{vb}">
+                <mx:Label text="Description:"/>
+            </mx:AddChild>
+            <mx:AddChild relativeTo="{vb}">
+                <mx:Text text="{product.description}" width="100%"/>
+            </mx:AddChild>
+        </mx:State>
+
+        <mx:State name="4cols">
+            <mx:SetProperty name="width" value="{COL_WIDTH_4}"/>
+            <mx:SetProperty name="height" value="{COL_HEIGHT_4}"/>
+        </mx:State>
+
+        <mx:State name="3cols">
+            <mx:SetProperty name="width" value="{COL_WIDTH_3}"/>
+            <mx:SetProperty name="height" value="{COL_HEIGHT_3}"/>
+            <mx:SetProperty target="{img}" name="width" value="60"/>
+            <mx:SetProperty target="{img}" name="height" value="120"/>
+            <mx:AddChild relativeTo="{descr}">
+        		<mx:Label text="{product.highlight1}" color="#EE8D0C"/>
+            </mx:AddChild>
+            <mx:AddChild relativeTo="{descr}">
+        		<mx:Label text="{product.highlight2}" color="#EE8D0C"/>
+            </mx:AddChild>
+        </mx:State>
+
+        <mx:State name="2cols" basedOn="3cols">
+            <mx:SetProperty name="width" value="{COL_WIDTH_2}"/>
+            <mx:SetProperty name="height" value="{COL_HEIGHT_2}"/>
+            <mx:SetProperty target="{img}" name="width" value="60"/>
+            <mx:SetProperty target="{img}" name="height" value="120"/>
+            <mx:AddChild relativeTo="{vb}">
+                <mx:Text width="100%" text="{product.description}"/>
+            </mx:AddChild>
+        </mx:State>
+
+    </mx:states>
+
+</mx:Canvas>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/productsView/ProductDetails.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/productsView/ProductDetails.mxml b/FlexStore/mx/src/productsView/ProductDetails.mxml
new file mode 100644
index 0000000..ac80b11
--- /dev/null
+++ b/FlexStore/mx/src/productsView/ProductDetails.mxml
@@ -0,0 +1,97 @@
+<?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.
+
+-->
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" 
+    xmlns:productsView="productsView.*"
+    horizontalScrollPolicy="off" verticalScrollPolicy="off">
+
+    <mx:Metadata>
+        [Event(name="purchase", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="compare", type="samples.flexstore.ProductThumbEvent")]
+        [Event(name="browse", type="samples.flexstore.ProductThumbEvent")]
+    </mx:Metadata>
+
+    <mx:Script>
+        <![CDATA[
+
+		import mx.events.*;
+		
+		import samples.flexstore.Product;
+		import samples.flexstore.ProductThumbEvent;
+
+        private var _product:Product;
+        
+        [Bindable]
+        public function get product():Product
+        {
+            return _product;
+        }
+        
+        public function set product(p:Product):void
+        {
+            _product = p;
+            tn.selectedIndex = 0;
+        }
+        
+	]]>
+    </mx:Script>
+
+    <mx:CurrencyFormatter currencySymbol="$" id="cf" precision="2"/>
+
+    <mx:TabNavigator id="tn" width="100%" height="100%" 
+                    left="4" right="8" top="4" bottom="4">
+
+        <mx:VBox width="100%" height="100%" label="Features" verticalGap="8"
+            paddingLeft="8" paddingTop="8" paddingRight="8" paddingBottom="8" showEffect="Fade" hideEffect="Fade">
+
+            <mx:HBox width="100%" horizontalGap="12">
+
+                <mx:Image id="img" width="101" height="200" source="{product.image}"/>
+
+                <mx:VBox id="descr" width="100%" height="100%" paddingTop="0" verticalGap="4">
+
+                    <mx:Label text="{product.name}" fontSize="11" fontWeight="bold"/>
+
+	                <mx:Text text="{product.featureString}" width="80" height="48"/>
+
+                    <mx:Label text="{product.highlight1}" color="#EE8D0C"/>
+
+                    <mx:Label text="{product.highlight2}" color="#EE8D0C"/>
+
+                    <mx:Label text="{cf.format(product.price)}" fontWeight="bold"/>
+
+                </mx:VBox>
+            </mx:HBox>
+
+            <mx:Text id="descriptionText" width="100%" height="100%" text="{product.description}"/>
+
+        </mx:VBox>
+
+        <productsView:ProductSupport width="100%" height="100%" label="Support" showEffect="Fade" hideEffect="Fade"/>
+
+    </mx:TabNavigator>
+
+    <mx:VBox verticalGap="4" right="16" top="36">
+        <mx:Spacer width="100%"/>
+        <mx:Button icon="@Embed('/assets/icon_cart_empty.png')" click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.PURCHASE, product))" width="30" toolTip="Add to cart"/>
+        <mx:Button icon="@Embed('/assets/icon_compare.png')" click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.COMPARE, product))" width="30" toolTip="Add to compare list"/>
+        <mx:Button icon="@Embed('/assets/icon_tiles.png')" click="dispatchEvent(new ProductThumbEvent(ProductThumbEvent.BROWSE, product));" width="30" toolTip="Back to thumbnail view"/>
+    </mx:VBox>
+
+</mx:Canvas>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/productsView/ProductFilterPanel.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/productsView/ProductFilterPanel.mxml b/FlexStore/mx/src/productsView/ProductFilterPanel.mxml
new file mode 100644
index 0000000..794d0d3
--- /dev/null
+++ b/FlexStore/mx/src/productsView/ProductFilterPanel.mxml
@@ -0,0 +1,192 @@
+<?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.
+
+-->
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" 
+    xmlns:productsView="productsView.*"
+    xmlns:flexstore="samples.flexstore.*"
+    height="100%" 
+    paddingLeft="4" 
+    paddingRight="12" 
+    paddingTop="12" 
+    paddingBottom="8" 
+    verticalGap="0"
+    currentState="showingThumbnails">
+    
+    <mx:Metadata>
+       [Event(name="filter", type="samples.flexstore.ProductFilterEvent")] 
+       [Event("compare")]
+    </mx:Metadata>
+    
+    <mx:Script>
+        <![CDATA[
+        import mx.controls.sliderClasses.Slider;
+        import mx.controls.Alert; 
+        import samples.flexstore.ProductFilterEvent;
+           
+        private var thumbBeingPressed:Boolean;
+           
+        private function dispatchFilter():void
+        {
+            var event:ProductFilterEvent = 
+                new ProductFilterEvent(filter, thumbBeingPressed);
+            dispatchEvent(event);
+            currentState = "showingThumbnails";
+        }
+        
+        private function sliderValue(values:Array, index:int):Number
+        {
+            return values[index];
+        }
+        
+        private function productRemoved():void
+        {
+            if (currentState == "showingComparison")
+            {
+                if (productList.items.length == 0)
+                {
+                    dispatchFilter();
+                }
+                else
+                {
+                    attemptCompare();
+                }
+            }
+        }
+        
+        private function attemptCompare():void
+        {
+            if (productList.items.length > 0)
+            {
+                dispatchEvent(new Event("compare"));
+                currentState = "showingComparison";
+            }
+            else
+            {
+                Alert.show("There are no items to compare.", "Compare");
+            }
+        }
+        
+        ]]>
+    </mx:Script>
+    
+    <flexstore:ProductFilter id="filter">
+        <flexstore:experience>{series.selectedItem}</flexstore:experience>
+        <flexstore:minPrice>{sliderValue(priceSlider.values, 0)}</flexstore:minPrice>
+        <flexstore:maxPrice>{sliderValue(priceSlider.values, 1)}</flexstore:maxPrice>
+        <flexstore:blazeds>{cbBlazeDS.selected}</flexstore:blazeds>
+        <flexstore:mobile>{cbMobile.selected}</flexstore:mobile>
+        <flexstore:video>{cbVideo.selected}</flexstore:video>
+    </flexstore:ProductFilter>
+
+    <mx:CurrencyFormatter currencySymbol="$" id="cf"/>    
+    
+    <mx:Label text="Find" styleName="sectionHeader"/>
+    
+    <mx:HBox width="100%">
+        <mx:TextInput styleName="glass" width="100%"/>
+        <mx:Button styleName="glass" label="Go" click="Alert.show('This feature is not implemented in this sample', 'Find')"/>
+    </mx:HBox>
+
+    <mx:Spacer height="18"/>
+
+    <mx:HRule width="100%"/>
+
+    <mx:Spacer height="8"/>
+
+    <mx:HBox paddingTop="0" paddingLeft="0" verticalAlign="bottom">
+        <mx:Label text="Filter" styleName="sectionHeader"/>
+        <mx:Label text="({filter.count} items selected)" color="{getStyle('themeColor')}" fontWeight="bold"/>
+    </mx:HBox>
+
+    <mx:Spacer height="8"/>
+
+    <mx:Label text="Years of Experience"/>
+
+    <mx:ComboBox id="series" styleName="glass" width="140" change="dispatchFilter();">
+        <mx:dataProvider>
+            <mx:Array>
+                <mx:String>All</mx:String>
+                <mx:String>3</mx:String>
+                <mx:String>5</mx:String>
+                <mx:String>7</mx:String>
+                <mx:String>9</mx:String>
+            </mx:Array>
+        </mx:dataProvider>
+    </mx:ComboBox>
+
+    <mx:Spacer height="18"/>
+
+    <mx:Label text="Price"/>
+
+    <mx:HSlider id="priceSlider" styleName="glassSlider" minimum="0" maximum="200" tickInterval="10" snapInterval="10"
+        width="100%" thumbCount="2" values="[0,200]" labels="[$0,$200]" liveDragging="true" dataTipFormatFunction="{cf.format}"
+        change="dispatchFilter()"
+        thumbPress="thumbBeingPressed=true"
+        thumbRelease="thumbBeingPressed=false;dispatchFilter()"
+        />
+
+    <mx:Spacer height="18"/>
+
+    <mx:Label text="Required Features"/>
+
+    <mx:Spacer height="4"/>
+
+    <mx:CheckBox id="cbBlazeDS" styleName="glass" label="BlazeDS" click="dispatchFilter();"/>
+    <mx:Spacer height="4"/>
+    <mx:CheckBox id="cbMobile" styleName="glass" label="Mobile" click="dispatchFilter()"/>
+    <mx:Spacer height="4"/>
+    <mx:CheckBox id="cbVideo" styleName="glass" label="Video" click="dispatchFilter();"/>
+
+    <mx:Spacer height="18"/>
+
+    <mx:HRule width="100%"/>
+
+    <mx:Spacer height="8"/>
+
+        <mx:HBox>
+            <mx:Label text="Compare" styleName="sectionHeader"/>
+            <mx:Label text="(Drag items here to compare)" styleName="instructions"/>
+        </mx:HBox>
+
+
+    <mx:Spacer height="4"/>
+
+    <!-- height is maxItems * ProductListItem.HEIGHT + 2px border -->
+    <productsView:ProductList id="productList" height="{productList.maxItems * ProductListItem.HEIGHT + 2}" width="100%"
+        newItemStartX="300" newItemStartY="-100" maxItems="4" 
+        removeProduct="productRemoved()"/>
+
+    <mx:Spacer height="8"/>
+    
+    <mx:Button id="compareButton" styleName="glass" />
+    
+    <mx:states>
+       <mx:State name="showingThumbnails">
+          <mx:SetProperty target="{compareButton}" name="label" value="Compare Items" />
+          <mx:SetStyle target="{compareButton}" name="icon" value="@Embed('/assets/icon_compare.png')" />
+          <mx:SetEventHandler target="{compareButton}" name="click" handler="attemptCompare()" />
+       </mx:State>
+       <mx:State name="showingComparison">
+           <mx:SetProperty target="{compareButton}" name="label" value="Back to thumbnail view" />
+           <mx:SetStyle target="{compareButton}" name="icon" value="@Embed('/assets/icon_tiles.png')" />
+           <mx:SetEventHandler target="{compareButton}" name="click" handler="dispatchFilter()" />
+       </mx:State>
+    </mx:states>
+
+</mx:VBox>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/productsView/ProductList.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/productsView/ProductList.mxml b/FlexStore/mx/src/productsView/ProductList.mxml
new file mode 100644
index 0000000..b0498e7
--- /dev/null
+++ b/FlexStore/mx/src/productsView/ProductList.mxml
@@ -0,0 +1,210 @@
+<?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.
+
+-->
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
+    borderStyle="solid"
+    horizontalScrollPolicy="off"
+    dragEnter="doDragEnter(event)"
+    dragDrop="doDragDrop(event)"
+    backgroundAlpha="0" backgroundColor="#FF0000"> <!-- need a background color for drag and drop but can set alpha to 0 -->
+    
+    <mx:Metadata>
+       [Event(name="addProduct", type="samples.flexstore.ProductListEvent")]
+       [Event(name="duplicateProduct", type="samples.flexstore.ProductListEvent")]
+       [Event(name="productQtyChange", type="samples.flexstore.ProductListEvent")]
+       [Event(name="removeProduct", type="samples.flexstore.ProductListEvent")]
+    </mx:Metadata>
+
+    <mx:Script>
+        <![CDATA[
+        import mx.core.*;
+        import mx.effects.*;
+        import mx.events.*;
+        import mx.managers.DragManager;
+        import mx.effects.EffectManager;
+        
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductListEvent;
+        
+        public var items:Array = [];
+        
+        public var newItemStartX:int;
+        public var newItemStartY:int;
+        [Bindable]
+        public var maxItems:int;
+        public var showQuantity:Boolean;
+        
+        private var playingEffects:Dictionary = new Dictionary(true);
+        
+        public function addProduct(product:Product):void
+		{
+            var index:int = indexOf(product.productId);
+            var event:ProductListEvent;
+            var item:ProductListItem;
+            
+            if (index != -1)
+			{
+			    item = items[index] as ProductListItem;
+			    //if we don't keep track of what's playing a double-click can
+			    //cause the list item to keep rising
+			    if (playingEffects[item] == null)
+			    {
+                    var jump:Sequence = new Sequence();
+                    var m1:Move = new Move(item)
+                    m1.yBy = -5;
+                    var m2:Move = new Move(item)
+                    m2.yBy = 5;
+                    jump.addChild(m1);
+                    jump.addChild(m2);
+                    jump.duration = 150;
+                    playingEffects[item] = jump;
+                    jump.addEventListener(EffectEvent.EFFECT_END, function(event:Event):void
+                    {
+                       delete playingEffects[item];
+                    });
+                    jump.play();
+                }
+                event = new ProductListEvent(ProductListEvent.DUPLICATE_PRODUCT);
+                event.product = item.product;
+                dispatchEvent(event);
+            }
+			else
+			{
+                index = items.length;
+                if (maxItems <= 0 || index < maxItems)
+				{
+				    item = new ProductListItem();
+				    if (showQuantity)
+				    {
+				        item.currentState = 'showQuantity';
+				    }
+				    item.product = product;
+				    item.percentWidth = 100;
+				    item.addEventListener(ProductListEvent.REMOVE_PRODUCT, removeItemHandler);
+                    items[index] = item;
+                    addChild(item);
+                    layoutItems(index, true);
+                    event = new ProductListEvent(ProductListEvent.ADD_PRODUCT);
+                    event.product = product;
+                    dispatchEvent(event);
+                }
+            }
+        }
+        
+        public function getProducts():Array
+        {
+            var ret:Array = [];
+            for (var i:int = 0; i < items.length; i++)
+            {
+                ret[i] = items[i].product;
+            }
+            return ret;
+        }
+        
+        private function removeItemHandler(event:Event):void
+        {
+            var item:ProductListItem = event.target as ProductListItem;
+            var index:int = indexOf(item.product.productId);
+            items.splice(index, 1);
+            removeChild(item);
+            layoutItems(index);
+        }
+            
+        private function layoutItems(startIndex:int, scrollToBottom:Boolean=false):void
+		{
+            var n:int = items.length;
+            var e:Move;
+			for (var i:int = startIndex; i < n ; i++)
+			{
+			    var item:ProductListItem = items[i];
+                var yTo:Number = i * (item.height);
+                //still need to prevent items that are already in motion from getting
+                //jumpy
+			    if (playingEffects[item] == null)
+			    {
+                    e = new Move(item);
+                    if (item.x == 0 && item.y == 0)
+    				{
+    					e.xFrom = newItemStartX;
+    					e.yFrom = newItemStartY;
+                    }
+    
+                    e.xTo = 0;
+                    e.yTo = yTo;
+                    playingEffects[item] = e;
+                    e.addEventListener(EffectEvent.EFFECT_END, function(event:Event):void
+                    {
+                       delete playingEffects[item];
+                    });
+                    e.play();
+                }
+                else
+                {
+                    playingEffects[item].pause();
+                    playingEffects[item].yTo = yTo;
+                    playingEffects[item].play();
+                }
+            }
+            //get the last event and if we should scroll make sure we can validate
+            //and scroll to maxVPosition
+            if (scrollToBottom)
+            {
+                e.addEventListener(EffectEvent.EFFECT_END, function(event:Event):void
+                {
+                    validateNow();
+                    verticalScrollPosition = maxVerticalScrollPosition;    
+                });
+            }
+        }
+        
+        private function indexOf(productId:int):int
+		{
+            var index:int = -1;
+
+            var n:int = items.length;
+			for (var i:int = 0; i < items.length; i++)
+			{
+                if (items[i].product.productId == productId)
+				{
+                    index = i;
+                    break;
+                }
+            }
+
+            return index;
+        }     
+
+        private function doDragEnter(event:DragEvent):void
+        {
+            if (event.dragSource.hasFormat("product"))
+            {
+                DragManager.acceptDragDrop(IUIComponent(event.target));
+            }
+        }
+
+        private function doDragDrop(event:DragEvent):void
+        {
+            var product:Product = event.dragSource.dataForFormat("product") as Product;
+            addProduct(product);
+        }  
+ 
+        ]]>
+    </mx:Script>
+    
+</mx:Canvas>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/productsView/ProductListItem.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/productsView/ProductListItem.mxml b/FlexStore/mx/src/productsView/ProductListItem.mxml
new file mode 100644
index 0000000..40aeb20
--- /dev/null
+++ b/FlexStore/mx/src/productsView/ProductListItem.mxml
@@ -0,0 +1,85 @@
+<?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.
+
+-->
+<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" 
+    styleName="listItem"
+    height="{ProductListItem.HEIGHT}"
+    automationName="{product.name}">
+
+    <mx:Metadata>
+       [Event(name="productQtyChange", type="samples.flexstore.ProductListEvent")]
+       [Event(name="removeProduct", type="samples.flexstore.ProductListEvent")]
+    </mx:Metadata>
+    
+    <mx:Script>
+    <![CDATA[
+    
+        import samples.flexstore.Product;
+        import samples.flexstore.ProductListEvent;
+        
+        public static const HEIGHT:int = 30;
+        
+        [Bindable]
+        public var product:Product;
+        
+        private function qtyChange():void
+    	{
+            product.qty = int(qty.text);
+            var event:ProductListEvent = new ProductListEvent(ProductListEvent.PRODUCT_QTY_CHANGE);
+            event.product = product;
+    		dispatchEvent(event);
+        }
+        
+        private function removeItem():void
+        {
+            var event:ProductListEvent = new ProductListEvent(ProductListEvent.REMOVE_PRODUCT);
+            event.product = product;
+    		dispatchEvent(event);
+        }
+        
+    ]]>
+    </mx:Script>
+    
+    <mx:CurrencyFormatter currencySymbol="$" id="cf" precision="2"/>
+    
+    <mx:Button id="removeButton"
+        width="14" height="14" 
+        icon="@Embed('/assets/trashcan.png')"
+        toolTip="Remove from cart"
+        click="removeItem()"/>
+
+    <mx:Image id="productImage" width="12" height="24" source="{product.image}"/>
+
+    <mx:Label id="productName" maxWidth="100" text="{product.name}"/>
+
+    <mx:Spacer width="100%" />
+
+    <mx:Label id="productPrice" 
+        text="{cf.format(product.price)}" textAlign="right"/>
+        
+    <mx:states>
+        <mx:State name="showQuantity">
+            <mx:AddChild>
+                <mx:TextInput id="qty" width="25" text="{product.qty}" 
+                    textAlign="right" maxChars="3" change="qtyChange()" />
+           </mx:AddChild>
+       </mx:State>        
+    </mx:states>
+    
+</mx:HBox>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/productsView/ProductSupport.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/productsView/ProductSupport.mxml b/FlexStore/mx/src/productsView/ProductSupport.mxml
new file mode 100644
index 0000000..1d9aab9
--- /dev/null
+++ b/FlexStore/mx/src/productsView/ProductSupport.mxml
@@ -0,0 +1,84 @@
+<?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.
+
+-->
+<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
+		 paddingLeft="4" paddingRight="8" paddingBottom="4"
+		 horizontalScrollPolicy="off" verticalScrollPolicy="off">
+
+    <mx:Script>
+	<![CDATA[
+
+        private function toggle():void
+		{
+			/*
+            if (vd.playing)
+			{
+                vd.stop();
+                list.visible = true;
+            }
+			else
+			{
+                list.visible = false;
+                vd.play();
+            }
+			*/
+        }
+
+	]]>
+    </mx:Script>
+
+    <mx:Parallel id="hideList">
+        <mx:children>
+            <mx:Array>
+                <mx:Resize target="{list}" widthTo="0"/>
+                <!--<mx:Resize target="{vd}" widthTo="400" heightTo="314"/>-->
+            </mx:Array>
+        </mx:children>
+    </mx:Parallel>
+
+    <mx:Parallel id="showList">
+        <mx:children>
+            <mx:Array>
+                <mx:Resize target="{list}" widthTo="130"/>
+                <!--<mx:Resize target="{vd}" widthTo="270" heightTo="217"/>-->
+            </mx:Array>
+        </mx:children>
+    </mx:Parallel>
+
+    <mx:List id="list" width="130" height="100%" selectedIndex="0"
+			 hideEffect="hideList" showEffect="showList">
+        <mx:dataProvider>
+            <mx:Array>
+                <mx:Object label="Install SIM Card"/>
+            </mx:Array>
+        </mx:dataProvider>
+    </mx:List>
+
+    <mx:Canvas width="100%" verticalScrollPolicy="off" horizontalScrollPolicy="off">
+
+		<!--<mx:VideoDisplay id="vd" width="270" height="217" source="assets/phone.flv"
+						 autoPlay="false" complete="list.visible=true"/>
+
+		<mx:Button label="{vd.playing ? 'Stop' : 'Play'}" click="toggle()" left="8" bottom="8" includeInLayout="false">
+		</mx:Button>
+		-->
+	</mx:Canvas>
+
+
+</mx:HBox>

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/samples/flexstore/ButtonBarButtonSkin.as
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/samples/flexstore/ButtonBarButtonSkin.as b/FlexStore/mx/src/samples/flexstore/ButtonBarButtonSkin.as
new file mode 100644
index 0000000..5e94b58
--- /dev/null
+++ b/FlexStore/mx/src/samples/flexstore/ButtonBarButtonSkin.as
@@ -0,0 +1,298 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+import flash.display.GradientType;
+import mx.containers.BoxDirection;
+import mx.controls.Button;
+import mx.controls.ButtonBar;
+import mx.skins.Border;
+import mx.skins.halo.*;
+import mx.styles.StyleManager;
+import mx.utils.ColorUtil;
+
+/**
+ *  Adapted from mx.skins.halo.ButtonBarButtonSkin.
+ *  This version of the ButtonBarButtonSkin is applied for the
+ *  selectedOver, selectedUp, and over states to use the 2nd two
+ *  values of the fillColors for the selected state of the
+ *  button.  The over state then uses a computed value from
+ *  the themeColor to show emphasis.  The border of the selected
+ *  button also uses a computed value from the themeColor, but
+ *  is partially transparent.
+ */
+public class ButtonBarButtonSkin extends Border
+{
+	//--------------------------------------------------------------------------
+	//
+	//  Class variables
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 */
+	private static var cache:Object = {};
+
+	//--------------------------------------------------------------------------
+	//
+	//  Class methods
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 *  Several colors used for drawing are calculated from the base colors
+	 *  of the component (themeColor, borderColor and fillColors).
+	 *  Since these calculations can be a bit expensive,
+	 *  we calculate once per color set and cache the results.
+	 */
+	private static function calcDerivedStyles(themeColor:uint,
+											  fillColor0:uint,
+											  fillColor1:uint):Object
+	{
+		var key:String = HaloColors.getCacheKey(themeColor,
+												fillColor0, fillColor1);
+
+		if (!cache[key])
+		{
+			var o:Object = cache[key] = {};
+
+			// Cross-component styles.
+			HaloColors.addHaloColors(o, themeColor, fillColor0, fillColor1);
+
+			// Button-specific styles.
+			o.innerEdgeColor1 = ColorUtil.adjustBrightness2(fillColor0, -10);
+			o.innerEdgeColor2 = ColorUtil.adjustBrightness2(fillColor1, -25);
+		}
+
+		return cache[key];
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//  Constructor
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 *  Constructor.
+	 */
+	public function ButtonBarButtonSkin()
+	{
+		super();
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//  Overridden properties
+	//
+	//--------------------------------------------------------------------------
+
+	//----------------------------------
+	//  measuredWidth
+	//----------------------------------
+
+	/**
+	 *  @private
+	 */
+	override public function get measuredWidth():Number
+	{
+		return 50;
+	}
+
+	//----------------------------------
+	//  measuredHeight
+	//----------------------------------
+
+	/**
+	 *  @private
+	 */
+	override public function get measuredHeight():Number
+	{
+		return 22;
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//  Overridden methods
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 */
+	override protected function updateDisplayList(w:Number, h:Number):void
+	{
+		super.updateDisplayList(w, h);
+
+		// User-defined styles.
+		var borderColor:uint = getStyle("borderColor");
+		var cornerRadius:Number = getStyle("cornerRadius");
+		var fillAlphas:Array = getStyle("fillAlphas");
+		var fillColors:Array = getStyle("fillColors");
+		styleManager.getColorNames(fillColors);
+		var highlightAlphas:Array = getStyle("highlightAlphas");
+		var themeColor:uint = getStyle("themeColor");
+
+		// Derivative styles.
+		var derStyles:Object = calcDerivedStyles(themeColor, fillColors[0],
+												 fillColors[1]);
+
+		var borderColorDrk1:Number =
+			ColorUtil.adjustBrightness2(borderColor, -50);
+
+		var themeColorDrk1:Number =
+			ColorUtil.adjustBrightness2(themeColor, -25);
+
+		var emph:Boolean = false;
+
+		if (parent is Button)
+			emph = (parent as Button).emphasized;
+
+		var tmp:Number;
+
+		var bar:ButtonBar = parent ? ButtonBar(parent.parent) : null;
+		var horizontal:Boolean = true;
+		var pos:int = 0;
+
+		if (bar)
+		{
+			if (bar.direction == BoxDirection.VERTICAL)
+				horizontal = false;
+
+			// first: -1, middle: 0, last: 1
+			var index:int = bar.getChildIndex(parent);
+			pos = (index == 0 ? -1 : (index == bar.numChildren - 1 ? 1 : 0));
+		}
+
+		var radius:Object = getCornerRadius(pos, horizontal, cornerRadius);
+		var cr:Object = getCornerRadius(pos, horizontal, cornerRadius);
+		var cr1:Object = getCornerRadius(pos, horizontal, cornerRadius - 1);
+		var cr2:Object = getCornerRadius(pos, horizontal, cornerRadius - 2);
+		var cr3:Object = getCornerRadius(pos, horizontal, cornerRadius - 3);
+
+		graphics.clear();
+
+		switch (name)
+		{
+			case "selectedUpSkin":
+			case "selectedOverSkin":
+			{
+				var overFillColors:Array;
+				if (fillColors.length > 2)
+					overFillColors = [ fillColors[2], fillColors[3] ];
+				else
+					overFillColors = [ fillColors[0], fillColors[1] ];
+
+				var overFillAlphas:Array;
+				if (fillAlphas.length > 2)
+					overFillAlphas = [ fillAlphas[2], fillAlphas[3] ];
+  				else
+					overFillAlphas = [ fillAlphas[0], fillAlphas[1] ];
+
+				// button border/edge
+				drawRoundRect(
+					0, 0, w, h, cr,
+					[ themeColor, derStyles.themeColDrk1 ], 0.5,
+					verticalGradientMatrix(0, 0, w , h),
+					GradientType.LINEAR, null,
+					{ x: 1, y: 1, w: w - 2, h: h - 2, r: cr1 });
+
+				// button fill
+				drawRoundRect(
+					1, 1, w - 2, h - 2, cr1,
+					overFillColors, overFillAlphas,
+					verticalGradientMatrix(0, 0, w - 2, h - 2));
+
+				// top highlight
+				if (!(radius is Number))
+					{ radius.bl = radius.br = 0;}
+				drawRoundRect(
+					1, 1, w - 2, (h - 2) / 2, radius,
+					[ 0xFFFFFF, 0xFFFFFF ], highlightAlphas,
+					verticalGradientMatrix(1, 1, w - 2, (h - 2) / 2));
+				break;
+			}
+
+			case "overSkin":
+			{
+				// button border/edge
+				drawRoundRect(
+					0, 0, w, h, cr,
+					[ themeColor, derStyles.themeColDrk1 ], 0.5,
+					verticalGradientMatrix(0, 0, w, h));
+
+				// button fill
+				drawRoundRect(
+					1, 1, w - 2, h - 2, cr1,
+					[ derStyles.fillColorPress1, derStyles.fillColorPress2 ], 1,
+					verticalGradientMatrix(0, 0, w - 2, h - 2));
+
+				// top highlight
+				if (!(radius is Number))
+					{ radius.bl = radius.br = 0;}
+				drawRoundRect(
+					1, 1, w - 2, (h - 2) / 2, radius,
+					[ 0xFFFFFF, 0xFFFFFF ], highlightAlphas,
+					verticalGradientMatrix(1, 1, w - 2, (h - 2) / 2));
+
+				break;
+			}
+		}
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//  Methods
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 */
+	private function getCornerRadius(pos:int, horizontal:Boolean,
+									 radius:Number):Object
+	{
+		if (pos == 0)
+			return 0;
+
+		radius = Math.max(0, radius);
+
+		if (horizontal)
+		{
+			if (pos == -1)
+				return { tl: radius, tr: 0, bl: radius, br: 0 };
+			else // pos == 1
+				return { tl: 0, tr: radius, bl: 0, br: radius };
+		}
+		else
+		{
+			if (pos == -1)
+				return { tl: radius, tr: radius, bl: 0, br: 0 };
+			else // pos == 1
+				return { tl: 0, tr: 0, bl: radius, br: radius };
+		}
+	}
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/samples/flexstore/Product.as
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/samples/flexstore/Product.as b/FlexStore/mx/src/samples/flexstore/Product.as
new file mode 100644
index 0000000..040fb8f
--- /dev/null
+++ b/FlexStore/mx/src/samples/flexstore/Product.as
@@ -0,0 +1,78 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+[Bindable]
+public class Product
+{
+
+    public var productId:int;
+    public var name:String;
+    public var description:String;
+    public var price:Number;
+    public var image:String;
+    public var experience:String;
+    public var blazeds:Boolean;
+    public var mobile:Boolean;
+    public var video:Boolean;
+    public var highlight1:String;
+    public var highlight2:String;
+    public var qty:int;
+
+    public function Product()
+    {
+
+    }
+
+    public function fill(obj:Object):void
+    {
+        for (var i:String in obj)
+        {
+            this[i] = obj[i];
+        }
+    }
+
+    [Bindable(event="propertyChange")]
+    public function get featureString():String
+    {
+    	var str:String = "";
+    	if (blazeds)
+    		str += "BlazeDS";
+
+		if (mobile)
+		{
+			if (str.length > 0)
+				str += "\n";
+			str += "Mobile";
+		}
+
+		if (video)
+		{
+			if (str.length > 0)
+				str += "\n";
+			str += "Video";
+		}
+
+		return str;
+    }
+
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/samples/flexstore/ProductFilter.as
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/samples/flexstore/ProductFilter.as b/FlexStore/mx/src/samples/flexstore/ProductFilter.as
new file mode 100644
index 0000000..d182371
--- /dev/null
+++ b/FlexStore/mx/src/samples/flexstore/ProductFilter.as
@@ -0,0 +1,56 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+[Bindable]
+public class ProductFilter
+{
+    public var count:int;
+    public var experience:String;
+    public var minPrice:Number;
+    public var maxPrice:Number;
+    public var blazeds:Boolean;
+    public var mobile:Boolean;
+    public var video:Boolean;
+    
+    public function ProductFilter()
+    {
+        super();
+    }
+    
+    public function accept(product:Product):Boolean
+    {
+        //price is often the first test so let's fail fast if possible
+        if (minPrice > product.price || maxPrice < product.price)
+            return false;
+        if (experience != "All" && experience > product.experience)
+            return false;
+        if (blazeds && !product.blazeds)
+            return false;
+        if (mobile && !product.mobile)
+            return false;
+        if (video && !product.video)
+            return false;
+        
+        return true;
+    }
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/samples/flexstore/ProductFilterEvent.as
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/samples/flexstore/ProductFilterEvent.as b/FlexStore/mx/src/samples/flexstore/ProductFilterEvent.as
new file mode 100644
index 0000000..b13af3e
--- /dev/null
+++ b/FlexStore/mx/src/samples/flexstore/ProductFilterEvent.as
@@ -0,0 +1,39 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+import flash.events.Event;
+
+public class ProductFilterEvent extends Event
+{
+    public static const FILTER:String = "filter";
+    
+    public var live:Boolean;
+    public var filter:ProductFilter;
+    
+    public function ProductFilterEvent(filter:ProductFilter, live:Boolean)
+    {
+        super(FILTER);
+        this.filter = filter;
+        this.live = live;
+    }
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/samples/flexstore/ProductListEvent.as
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/samples/flexstore/ProductListEvent.as b/FlexStore/mx/src/samples/flexstore/ProductListEvent.as
new file mode 100644
index 0000000..fb4992f
--- /dev/null
+++ b/FlexStore/mx/src/samples/flexstore/ProductListEvent.as
@@ -0,0 +1,42 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+
+import flash.events.Event;
+
+public class ProductListEvent extends Event
+{
+    public static const ADD_PRODUCT:String = "addProduct";
+    public static const DUPLICATE_PRODUCT:String = "duplicateProduct";
+    public static const REMOVE_PRODUCT:String = "removeProduct";
+    public static const PRODUCT_QTY_CHANGE:String = "productQtyChange";
+    
+    public var product:Product;
+    
+    //making the default bubbles behavior of the event to true since we want
+    //it to bubble out of the ProductListItem and beyond
+    public function ProductListEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false)
+    {
+        super(type, bubbles, cancelable);
+    }
+    
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/mx/src/samples/flexstore/ProductThumbEvent.as
----------------------------------------------------------------------
diff --git a/FlexStore/mx/src/samples/flexstore/ProductThumbEvent.as b/FlexStore/mx/src/samples/flexstore/ProductThumbEvent.as
new file mode 100644
index 0000000..e967daf
--- /dev/null
+++ b/FlexStore/mx/src/samples/flexstore/ProductThumbEvent.as
@@ -0,0 +1,45 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 samples.flexstore
+{
+    
+import flash.events.Event;
+
+public class ProductThumbEvent extends Event
+{
+    public static const PURCHASE:String = "purchase";
+    public static const COMPARE:String = "compare";
+    public static const DETAILS:String = "details";
+    public static const BROWSE:String = "browse";
+    
+    public var product:Product;
+    
+    public function ProductThumbEvent(type:String, product:Product)
+    {
+        super(type);
+        this.product = product;
+    }
+    
+    override public function clone():Event
+    {
+        return new ProductThumbEvent(type, product);
+    }
+}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-examples/blob/c652cfba/FlexStore/spark/src/FlexStore.mxml
----------------------------------------------------------------------
diff --git a/FlexStore/spark/src/FlexStore.mxml b/FlexStore/spark/src/FlexStore.mxml
new file mode 100644
index 0000000..7a82cb9
--- /dev/null
+++ b/FlexStore/spark/src/FlexStore.mxml
@@ -0,0 +1,280 @@
+<?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:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
+               xmlns:s="library://ns.adobe.com/flex/spark" 
+               xmlns="*"
+				minWidth="990" minHeight="550"
+				preinitialize="loadStyle()"
+				creationComplete="startService()"
+                stateChangeComplete="chainStatesIfNeeded()"
+				pageTitle="FlexStore">
+	
+	<fx:Script>
+		<![CDATA[
+			import mx.collections.IViewCursor;
+			import mx.collections.ArrayCollection;
+			import samples.flexstore.Product;
+			import mx.rpc.events.ResultEvent;
+			import mx.events.StyleEvent;
+			import mx.styles.StyleManager;
+            import mx.managers.LayoutManager;
+			
+			[Bindable]
+			private var catalog:ArrayCollection;
+			
+			private var currentTheme:String = "beige";
+			
+			private function toggleTheme():void
+			{
+				if (currentTheme == "beige")
+				{
+					currentTheme = "blue";
+				}
+				else
+				{
+					currentTheme = "beige";
+				}
+				
+				loadStyle();
+			}
+			
+			private function startService():void
+			{
+				productService.send();
+			}
+			
+			private function loadStyle():void
+			{
+				var eventDispatcher:IEventDispatcher =
+					styleManager.loadStyleDeclarations(currentTheme + ".swf");
+				eventDispatcher.addEventListener(StyleEvent.COMPLETE, completeHandler);
+			}
+			
+			private function completeHandler(event:StyleEvent):void
+			{
+				image.source = acb.getStyle("storeLogo");
+				homeView.updateMapImage();
+				super.initialized = true;
+                callLater(prebake);
+			}
+			
+			private function productServiceResultHandler(event:ResultEvent):void
+			{
+				//HTTPService returns an ArrayCollection for nested arrays
+				var products:ArrayCollection = event.result.catalog.product;
+				var temp:ArrayCollection = new ArrayCollection();
+				var cursor:IViewCursor = products.createCursor();
+				while (!cursor.afterLast)
+				{
+					var product:Product = new Product();
+					product.fill(cursor.current);
+					temp.addItem(product);
+					cursor.moveNext();
+				}
+				catalog = temp;
+			}
+			
+			override public function set initialized(value:Boolean):void
+			{
+				// Hold off until the Runtime CSS SWF is done loading.
+			}
+            
+            private var stateChain:Array;
+            
+            private function headHome():void
+            {
+                homeButton.selected = true;
+                if (currentState == "ProductsState")
+                {
+                    productsButton.selected = false;
+                    stateChain = ["ProductsWipeUp", "HomeWipeDown", "HomeState"];
+                    currentState = "ProductsWipeUp";
+                }
+                else if (currentState == "SupportState")
+                {
+                    supportButton.selected = false;
+                    stateChain = ["SupportWipeUp", "HomeWipeDown", "HomeState"];
+                    currentState = "SupportWipeUp";                    
+                }
+            }
+            
+            private function headToProducts():void
+            {
+                productsButton.selected = true;
+                if (currentState == "SupportState")
+                {
+                    supportButton.selected = false;
+                    stateChain = ["SupportWipeUp", "ProductsWipeDown", "ProductsState"];
+                    currentState = "SupportWipeUp";                    
+                }
+                if (currentState == "HomeState")
+                {
+                    homeButton.selected = false;
+                    stateChain = ["HomeWipeUp", "ProductsWipeDown", "ProductsState"];
+                    currentState = "HomeWipeUp";                    
+                }
+            }
+            
+            private function headToSupport():void
+            {
+                supportButton.selected = true;
+                if (currentState == "ProductsState")
+                {
+                    productsButton.selected = false;
+                    stateChain = ["ProductsWipeUp", "SupportWipeDown", "SupportState"];
+                    currentState = "ProductsWipeUp";                    
+                }
+                if (currentState == "HomeState")
+                {
+                    homeButton.selected = false;
+                    stateChain = ["HomeWipeUp", "SupportWipeDown", "SupportState"];
+                    currentState = "HomeWipeUp";                    
+                }
+            }
+            
+            private function prebake():void
+            {
+                if (LayoutManager.getInstance().isInvalid())
+                {
+                    callLater(prebake);
+                    return;
+                }
+                addEventListener("enterFrame", prebake2);
+            }
+            
+            private function prebake2(event:Event):void
+            {
+                removeEventListener("enterFrame", prebake2);
+                trace("prebake2");
+                stateChain = ["ProductsPreBake", "HomeState"];
+                currentState = "ProductsPreBake";
+            }
+                
+            private function chainStatesIfNeeded():void
+            {
+                if (LayoutManager.getInstance().isInvalid())
+                {
+                    callLater(chainStatesIfNeeded);
+                    return;
+                }
+                if (stateChain != null)
+                {
+                    if (currentState == stateChain[0])
+                    {
+                        addEventListener("enterFrame", nextState);
+                    }
+                }
+            }
+            
+            private function nextState(event:Event):void
+            {
+                removeEventListener("enterFrame", nextState);
+                stateChain.shift();
+                if (stateChain.length)
+                    currentState = stateChain[0];
+                else
+                    stateChain == null;
+            }
+		]]>
+	</fx:Script>
+	
+	<fx:Style source="main.css"/>
+	
+    <fx:Declarations>
+        <s:HTTPService id="productService" url="data/catalog.xml"
+                       result="productServiceResultHandler(event)"/>        
+    </fx:Declarations>
+	
+    <s:controlBarContent>
+        <s:HGroup id="acb" width="100%" styleName="storeControlBar">
+            <s:Image id="image" 
+                     click="toggleTheme()"
+                     toolTip="Change Theme"/>
+            <s:ToggleButton id="homeButton"
+                            label="Home"
+                            height="100%"
+                            selected="true"
+                            styleName="storeButtonBar"
+                            click="headHome()" />
+            <s:ToggleButton id="productsButton"
+                            label="Products"
+                            height="100%"
+                            styleName="storeButtonBar"
+                            click="headToProducts()"/>
+            <s:ToggleButton id="supportButton"
+                            label="Support"
+                            height="100%"
+                            styleName="storeButtonBar"
+                            click="headToSupport()"/>            
+        </s:HGroup>
+    </s:controlBarContent>
+    
+    <s:states>
+        <s:State name="HomeState" stateGroups="['Home']" />
+        <s:State name="HomeWipeUp" stateGroups="['Home']" />
+        <s:State name="HomeWipeDown" stateGroups="['Home']" />
+        <s:State name="ProductsPreBake" stateGroups="['Home', 'Products']" />
+        <s:State name="ProductsState" stateGroups="['Products']" />
+        <s:State name="ProductsWipeUp" stateGroups="['Products']" />
+        <s:State name="ProductsWipeDown" stateGroups="['Products']" />
+        <s:State name="SupportState" stateGroups="['Support']" />
+        <s:State name="SupportWipeUp" stateGroups="['Support']" />
+        <s:State name="SupportWipeDown" stateGroups="['Support']" />
+    </s:states>
+    
+    <s:transitions>
+        <s:Transition fromState="HomeState" toState="HomeWipeUp">
+            <s:Wipe direction="up" target="{homeView}" />
+        </s:Transition>
+        <s:Transition fromState="HomeWipeDown" toState="HomeState">
+            <s:Wipe direction="down" target="{homeView}" />
+        </s:Transition>
+        <s:Transition fromState="ProductsState" toState="ProductsWipeUp">
+            <s:Wipe direction="up" target="{pView}" />
+        </s:Transition>
+        <s:Transition fromState="ProductsWipeDown" toState="ProductsState">
+            <s:Wipe direction="down" target="{pView}" />
+        </s:Transition>
+        <s:Transition fromState="SupportState" toState="SupportWipeUp">
+            <s:Wipe direction="up" target="{supportView}" />
+        </s:Transition>
+        <s:Transition fromState="SupportWipeDown" toState="SupportState">
+            <s:Wipe direction="down" target="{supportView}" />
+        </s:Transition>
+    </s:transitions>
+	<s:VGroup width="990" paddingLeft="0" paddingRight="0" horizontalCenter="0" top="12">
+				
+			<HomeView id="homeView" width="100%" height="550" includeIn="Home"
+                      visible.HomeWipeUp="false"
+                      visible.HomeWipeDown="false"
+					  />
+			<ProductsView id="pView" includeIn="Products" visible.ProductsPreBake="false"
+                          visible.ProductsWipeUp="false"
+                          visible.ProductsWipeDown="false"
+                          width="100%" height="550" creationComplete="pView.catalog = catalog"
+						  />
+			<SupportView id="supportView" includeIn="Support"
+                         visible.SupportWipeUp="false"
+                         visible.SupportWipeDown="false"
+                         width="100%" height="550"
+						 />
+	</s:VGroup>
+	
+</s:Application>