Transferred from the Adobe Open Source Subversion Repository

Revision: 18146
Author:   chiedozi@adobe.com
Date:     2010-10-14T00:23:22.539629Z

Log Message:
-----------
View and ViewNavigator PARB changes.

MobileApplication
canCancelBackKeyBehavior has been renamed exitApplicationOnBackKey (also impacts ViewNavigator and TabbedViewNavigator)

ViewNavigator
backKeyHandler method is now mx_internal, it is no longer part of public api
useDefaultTransitions property has been removed from the framework
canRemoveCurrentView is now mx_internal, it is no longer part of the public api
createVisibiliyAnimation() method has been removed and replaced with the createActionBarShowEffect() and createActionBarHideEffect() methods.
commitViewChange, beginViewChanged and endViewChanged have been renamed to commitNavigatorAction, committingNavigatorAction and navigatorActionCommitted.
maintainNavigationStack removed from ViewNavigator and moved to TabbedViewNavigator

View
VIEW_ACTIVATE, VIEW_DEACTIVATE and REMOVING have been removed from the FlexEvent class and added to the new ViewNavigatorEvent class.
ViewNavigatorEvent class now has a "action" property that indicates what the last committed navigation operation was
ViewNavigatorAction enum class added and is used to populate the action property of a ViewNavigatorEvent
View now dispatches a "backKeyPressed" (FlexEvent.BACK_KEY_PRESSED) event when the back device key is pressed.  This is a cancelable event.  When cancelled, the MobileApplication's default back behavior will not run.

TabbedViewNavigator
Added createTabBarShowEffect() and createTabBarHideEffect() methods
Added a maintainNavigationStack property to the view navigator.  When false, the navigation stack of a navigator is cleared when deactivated.

TabbedMobileApplication
Added maintainNavigationStack proxy property to the application

QE notes:
Doc notes:
Bugs:
Reviewer: Ryan
Tests run:
Is noteworthy for integration:

Modified Paths:
--------------
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/TabbedViewNavigator.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/View.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/supportClasses/ViewNavigatorBase.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/tests/performance/mobile/ComponentCatalog/src/ScriptRunner.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/MobileApplication.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/TabbedMobileApplication.as</path>
<path kind="file" action="A">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/supportClasses/ViewNavigatorAction.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/supportClasses/MobileApplicationBase.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/events/FlexEvent.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/tests/performance/mobile/ComponentCatalog/src/views/SearchView.mxml</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/components/ViewNavigator.as</path>
<path kind="file" action="A">/private/flex/sdk/branches/hero_private/frameworks/projects/mobilecomponents/src/spark/events/ViewNavigatorEvent.as</path>

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1264604 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/mobilecomponents/src/spark/components/supportClasses/ViewNavigatorBase.as
+++ frameworks/projects/mobilecomponents/src/spark/components/supportClasses/ViewNavigatorBase.as
@@ -97,12 +97,15 @@
      * Setting the active state is hidden and should be managed my
      * the components that manage navigators.
      */
-    mx_internal function setActive(value:Boolean):void
+    mx_internal function setActive(value:Boolean, clearNavigationStack:Boolean = false):void
     {
         if (_active != value)
         {
             _active = value;

+            if (clearNavigationStack)
+                _navigationStack.popToFirstView();
+
             if (activeView)
                 activeView.setActive(value);
         }
@@ -129,7 +132,7 @@
     }

     //----------------------------------
-    //  canCancelBackKeyBehavior
+    //  exitApplicationOnBackKey
     //----------------------------------
     /**
      *  This method determines if a device's default back key handler can
@@ -149,10 +152,9 @@
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    // TODO (chiedozi): PARB? exitOnBack?
-    public function get canCancelBackKeyBehavior():Boolean
-    {
-        return false;
+    public function get exitApplicationOnBackKey():Boolean
+    {
+        return true;
     }

     //----------------------------------
@@ -307,6 +309,31 @@
     }

     //----------------------------------
+    //  lastAction
+    //----------------------------------
+
+    private var _lastAction:String = ViewNavigatorAction.NONE;
+
+    /**
+     *  @private
+     *  The last action performed by the navigator.
+     *
+     *  @see spark.components.supportClasses.ViewNavigatorAction
+     */
+    mx_internal function get lastAction():String
+    {
+        return _lastAction;
+    }
+
+    /**
+     *  @private
+     */
+    mx_internal function set lastAction(value:String):void
+    {
+        _lastAction = value;
+    }
+
+    //----------------------------------
     //  navigationStack
     //----------------------------------

@@ -435,39 +462,6 @@
         _transitionsEnabled = value;
     }

-    //----------------------------------
-    //  useDefaultTransitions
-    //----------------------------------
-
-    private var _useDefaultTransitions:Boolean = true;
-
-    /**
-     *  This flag indicates whether the navigator should play its
-     *  built-in default animations for its navigation operations.
-     *  If set to false, animations will not be played when a view
-     *  is changed unless passed as the transition parameter
-     *  for one of the navigation operations.
-     *
-     *  @default true
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function get useDefaultTransitions():Boolean
-    {
-        return _useDefaultTransitions;
-    }
-
-    /**
-     *  @private
-     */
-    public function set useDefaultTransitions(value:Boolean):void
-    {
-        _useDefaultTransitions = value;
-    }
-
     //--------------------------------------------------------------------------
     //
     // Public Methods
@@ -483,13 +477,15 @@
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    public function backKeyHandler():void
-    {
-    }
-
-    /**
+    mx_internal function backKeyHandler():void
+    {
+    }
+
+    /**
+     *  @private
      *  This method checks if the current view can be removed
-     *  from the display list.
+     *  from the display list. This is mx_internal because the
+     *  TabbedViewNavigator needs to call it on its children.
      *
      *  @return Returns true if the screen can be removed
      *
@@ -498,7 +494,7 @@
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    public function canRemoveCurrentView():Boolean
+    mx_internal function canRemoveCurrentView():Boolean
     {
     	// This is a method instead of a property because the default
     	// implementation in ViewNavigator has a side effect


Transferred from the Adobe Open Source Subversion Repository

Revision: 23243
Author:   cframpto@adobe.com
Date:     2011-12-20T00:59:57.384047Z

Log Message:
-----------
In frameworks, remove Adobe headers from all files except xml/mxml file types.  There are also a few .txt files that are license files that I didn't touch yet.

Modified Paths:
--------------
2361 paths were modified

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1251471 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/automation/src/mx/automation/delegates/controls/ScrollBarAutomationImpl.as
+++ frameworks/projects/automation/src/mx/automation/delegates/controls/ScrollBarAutomationImpl.as
@@ -1,13 +1,3 @@
-////////////////////////////////////////////////////////////////////////////////
-//
-//  ADOBE SYSTEMS INCORPORATED
-//  Copyright 2009 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.
-//
-////////////////////////////////////////////////////////////////////////////////

 package mx.automation.delegates.controls
 {


91 MapUtil.mergeSubset

91 MapUtil.mergeSubset

--- raw/src/org/yellcorp/map/MapUtil.as
+++ raw/src/org/yellcorp/map/MapUtil.as
@@ -83,6 +83,15 @@
         }
     }

+    public static function mergeSubset(source:*, target:*, keyList:Array):void
+    {
+        var key:*;
+        for each (key in keyList)
+        {
+            target[key] = source[key];
+        }
+    }
+
     public static function count(map:*):uint
     {
         var key:*;


Transferred from the Adobe Open Source Subversion Repository

Revision: 12850
Author:   jimurphy@adobe.com
Date:     2009-12-11T14:57:14.623098Z

Log Message:
-----------
add 6 new DMV projects to the SDK:
automation
automation_air
automation_dmv
automation_flashflexkit
automation_spark
datavisualization

These projects are setup to build in an ant main call.  There are currently several warnings in the datavisualization project that will be cleaned up.  No checkintests exist for these projects as of yet.

I also modified the exisitng projects build files for easier management of the localization targets, bundle and fat-swc. If the projects that I updated:airframework,airspark,framework,playerglobal,rpc,and spark.  All the new projects have been implemented this same way.

QE notes: DMV folks should run through their tests
Doc notes: probably
Bugs: nope
Reviewer:
Tests run: ran the following targets: compile,checkintests,other.locales and doc
Is noteworthy for integration: no

Modified Paths:
--------------
1404 paths were modified

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1248690 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/advancedgrids/src/mx/olap/IOLAPElement.as
+++ frameworks/projects/advancedgrids/src/mx/olap/IOLAPElement.as
@@ -0,0 +1,93 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  ADOBE SYSTEMS INCORPORATED
+//  Copyright 2009 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.olap
+{
+/**
+*  The IOLAPElement interface defines a base interface that provides
+*  common properties for all OLAP elements.
+*.
+*  @see mx.olap.OLAPElement
+*
+*  @langversion 3.0
+*  @playerversion Flash 9
+*  @playerversion AIR 1.1
+*  @productversion Flex 3
+*/
+public interface IOLAPElement
+{
+	//--------------------------------------------------------------------------
+	//
+	//  Properties
+	//
+	//--------------------------------------------------------------------------
+
+	//----------------------------------
+	//  dimension
+	//----------------------------------
+
+    /**
+     *  The dimension to which this element belongs.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    function get dimension():IOLAPDimension;
+
+    //----------------------------------
+	//  displayName
+	//----------------------------------
+
+    /**
+     *  The name of the OLAP element, as a String, which can be used for display.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    function get displayName():String;
+
+    //----------------------------------
+	//  name
+	//----------------------------------
+
+    /**
+     *  The name of the OLAP element that includes the OLAP schema hierarchy of the element.
+     *  For example, "Time_Year" is the name of the OLAP element,
+     *  where "Year" is a level of the "Time" dimension in an OLAP schema.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    function get name():String;
+
+    //----------------------------------
+	//  uniqueName
+	//----------------------------------
+
+    /**
+     *  The unique name of the OLAP element in the cube.
+     *  For example, "[Time][Year][2007]" is a unique name,
+     *  where 2007 is the element name belonging to the "Year" level of the "Time" dimension.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    function get uniqueName():String;
+}
+}


Transferred from the Adobe Open Source Subversion Repository

Revision: 23246
Author:   cframpto@adobe.com
Date:     2011-12-20T17:40:08.069454Z

Log Message:
-----------
Rollback 23243.  If comment followed header it was stripped as well.

Modified Paths:
--------------
2361 paths were modified

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1253050 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/charts/src/mx/charts/chartClasses/IBar.as
+++ frameworks/projects/charts/src/mx/charts/chartClasses/IBar.as
@@ -1,3 +1,13 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  ADOBE SYSTEMS INCORPORATED
+//  Copyright 2009 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.
+//
+////////////////////////////////////////////////////////////////////////////////

 package mx.charts.chartClasses
 {


Transferred from the Adobe Open Source Subversion Repository

Revision: 12850
Author:   jimurphy@adobe.com
Date:     2009-12-11T14:57:14.623098Z

Log Message:
-----------
add 6 new DMV projects to the SDK:
automation
automation_air
automation_dmv
automation_flashflexkit
automation_spark
datavisualization

These projects are setup to build in an ant main call.  There are currently several warnings in the datavisualization project that will be cleaned up.  No checkintests exist for these projects as of yet.

I also modified the exisitng projects build files for easier management of the localization targets, bundle and fat-swc. If the projects that I updated:airframework,airspark,framework,playerglobal,rpc,and spark.  All the new projects have been implemented this same way.

QE notes: DMV folks should run through their tests
Doc notes: probably
Bugs: nope
Reviewer:
Tests run: ran the following targets: compile,checkintests,other.locales and doc
Is noteworthy for integration: no

Modified Paths:
--------------
1404 paths were modified

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1253291 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/charts/src/mx/charts/series/LineSeries.as
+++ frameworks/projects/charts/src/mx/charts/series/LineSeries.as
@@ -0,0 +1,2122 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  ADOBE SYSTEMS INCORPORATED
+//  Copyright 2009 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.charts.series
+{
+
+import flash.display.DisplayObject;
+import flash.display.Graphics;
+import flash.geom.Point;
+import flash.geom.Rectangle;
+
+import mx.charts.DateTimeAxis;
+import mx.charts.HitData;
+import mx.charts.chartClasses.BoundedValue;
+import mx.charts.chartClasses.CartesianChart;
+import mx.charts.chartClasses.CartesianTransform;
+import mx.charts.chartClasses.DataDescription;
+import mx.charts.chartClasses.GraphicsUtilities;
+import mx.charts.chartClasses.IAxis;
+import mx.charts.chartClasses.InstanceCache;
+import mx.charts.chartClasses.LegendData;
+import mx.charts.chartClasses.NumericAxis;
+import mx.charts.chartClasses.Series;
+import mx.charts.renderers.LineRenderer;
+import mx.charts.series.items.LineSeriesItem;
+import mx.charts.series.items.LineSeriesSegment;
+import mx.charts.series.renderData.LineSeriesRenderData;
+import mx.charts.styles.HaloDefaults;
+import mx.collections.CursorBookmark;
+import mx.core.ClassFactory;
+import mx.core.IDataRenderer;
+import mx.core.IFactory;
+import mx.core.IFlexDisplayObject;
+import mx.core.mx_internal;
+import mx.graphics.IFill;
+import mx.graphics.IStroke;
+import mx.graphics.LinearGradientStroke;
+import mx.graphics.SolidColor;
+import mx.graphics.Stroke;
+import mx.styles.CSSStyleDeclaration;
+import mx.styles.ISimpleStyleClient;
+import mx.core.IFlexModuleFactory;
+
+use namespace mx_internal;
+
+include "../styles/metadata/FillStrokeStyles.as"
+include "../styles/metadata/ItemRendererStyles.as"
+
+/**
+ *  Specifies the number of pixels by which radius of the chart item is to be
+ *  increased when highlighted or selected.
+ *
+ *  @default 2
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+[Style(name="adjustedRadius", type="Number", format="Length", inherit="yes")]
+
+/**
+ *  Specifies an Array of fill objects that define the fill for
+ *  each item in the series. This takes precedence over the fill style property.
+ *  If a custom method is specified by the fillFunction property, that takes precedence over this Array.
+ *  If you do not provide enough Array elements for every item,
+ *  Flex repeats the fill from the beginning of the Array.
+ *
+ *
To set the value of this property using CSS:
+ *

+ *    LineSeries {
+ *      fills:#CC66FF, #9966CC, #9999CC;
+ *    }
+ *

+ *

+ *
+ *
To set the value of this property using MXML:
+ *

+ *    <mx:LineSeries ... >
+ *     <mx:fills>
+ *      <mx:SolidColor color="0xCC66FF"/>
+ *      <mx:SolidColor color="0x9966CC"/>
+ *      <mx:SolidColor color="0x9999CC"/>
+ *     </mx:fills>
+ *    </mx:LineSeries>
+ *

+ *

+ *
+ *

+ *  If you specify the fills property and you
+ *  want to have a Legend control, you must manually create a Legend control and
+ *  add LegendItems to it.
+ *

+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+[Style(name="fills", type="Array", arrayType="mx.graphics.IFill", inherit="no")]
+
+/**
+ *  Specifies the line type for the chart.
+ *  Possible values are:
+ *

+ *
"curve":
+ *    Draws curves between data points.

+ *
+ *
"horizontal":
+ *    Draws only the vertical line from the x-coordinate
+ *    of the first point to the x-coordinate of the second point
+ *    at the y-coordinate of the second point.
+ *    Repeats this for each data point.

+ *
+ *
"vertical":
+ *    Draws only the vertical line from the y-coordinate
+ *    of the first point to the y-coordinate of the second point
+ *    at the x-coordinate of the second point.
+ *    Repeats this for each data point.

+ *
+ *
"segment":
+ *    Draws lines as connected segments that are angled
+ *    to connect at each data point in the series.

+ *
+ *
"step":
+ *    Draws lines as horizontal segments.
+ *    At the first data point, draws a horizontal line
+ *    and then a vertical line to the second point,
+ *    and repeats for each data point.

+ *
+ *
"reverseStep":
+ *    Draws lines as horizontal segments.
+ *    At the first data point, draws a vertical line
+ *    and then a horizontal line to the second point,
+ *    and repeats for each data point.

+ *

+ *  The default is "segment".
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+[Style(name="form", type="String", enumeration="segment,step,reverseStep,vertical,horizontal,curve", inherit="no")]
+
+/**
+ *  A factory that represents the class the series uses
+ *  to represent the individual line segments in the series.
+ *  This class is instantiated once
+ *  for each distinct segment of the series.
+ *  Classes used as lineSegmentRenderers should implement
+ *  the IFlexDisplayObject, ISimpleStyleClient, and IDataRenderer interfaces.
+ *  The data property is assigned an instance of
+ *  mx.charts.series.items.LineSeriesSegment
+ *  that describes the segment to render.
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+[Style(name="lineSegmentRenderer", type="mx.core.IFactory", inherit="no")]
+
+/**
+  *  Sets the stroke for the actual line segments.
+  *  The default value for a LineChart control is orange (0xE48701).
+  *  The default color for a LineSeries used in a CartesianChart control is black (0x000000).
+  *  The default value for the width is 3.
+  *
+  *  @langversion 3.0
+  *  @playerversion Flash 9
+  *  @playerversion AIR 1.1
+  *  @productversion Flex 3
+  */
+[Style(name="lineStroke", type="mx.graphics.IStroke", inherit="no")]
+
+/**
+ *  Specifies the radius, in pixels, of the chart elements for the data points.
+ *  This property applies only if you specify an item renderer
+ *  using the itemRenderer property.
+ *  You can specify the itemRenderer in MXML or using styles.
+ *
+ *  @default 4
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+[Style(name="radius", type="Number", format="Length", inherit="no")]
+
+/**
+ *  Defines a data series for a LineChart control.
+ *  By default, this class uses the ShadowLineRenderer class.
+ *  Optionally, you can define an itemRenderer for the data series.
+ *  The itemRenderer must implement the ILineRenderer interface.
+ *
+ *  @mxml
+ *
+ *
The <mx:LineSeries> tag inherits all the properties
+ *  of its parent classes and adds the following properties:

+ *
+ *

+ *  <mx:LineSeries
+ *    Properties
+ *    fillFunction="Internal fill function"
+ *    horizontalAxis="No default"
+ *    interpolateValues="false|true"
+ *    sortOnXField="false|true"
+ *    verticalAxis="No default"
+ *    xField="null"
+ *    yField="null"
+ *
+ *    Styles
+ *    adjustedRadius="2"
+ *    fill="0xFFFFFF"
+ *    fills="IFill; no default"
+ *    form="segment|curve|horizontal|reverseStep|step|vertical"
+ *    itemRenderer="itemRenderer"
+ *    legendMarkerRenderer="Defaults to series's itemRenderer"
+ *    lineSegmentRenderer="ShadowLineRenderer"
+ *    lineStroke="Stroke(0xE47801,3)"
+ *    radius="4"
+ *    stroke="IStroke; no default"
+ *  />
+ *

+ *
+ *  @see mx.charts.LineChart
+ *
+ *  @includeExample ../examples/Line_AreaChartExample.mxml
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+public class LineSeries extends Series
+{
+    include "../../core/Version.as";
+
+    //--------------------------------------------------------------------------
+    //
+    //  Class initialization
+    //
+    //--------------------------------------------------------------------------
+
+
+    //--------------------------------------------------------------------------
+    //
+    //  Constructor
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  Constructor.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function LineSeries()
+    {
+        super();
+
+        _pointInstanceCache = new InstanceCache(null, this, 1000);
+        _pointInstanceCache.creationCallback = applyItemRendererProperties;
+
+        _segmentInstanceCache = new InstanceCache(null, this, 0);
+        _segmentInstanceCache.properties = { styleName: this };
+
+        dataTransform = new CartesianTransform();
+    }
+
+    //--------------------------------------------------------------------------
+    //
+    //  Variables
+    //
+    //--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 */
+	private var _moduleFactoryInitialized:Boolean = false;
+
+
+    /**
+     *  @private
+     */
+    private var _pointInstanceCache:InstanceCache;
+
+    /**
+     *  @private
+     */
+    private var _renderData:LineSeriesRenderData;
+
+    /**
+     *  @private
+     */
+    private var _segmentInstanceCache:InstanceCache;
+
+    /**
+     *  @private
+     */
+    private var _localFills:Array /* of IFill */;
+
+
+    /**
+     *  @private
+     */
+    private var _fillCount:int;
+
+    /**
+     * @private
+     */
+    private var _bAxesDirty:Boolean = false;
+
+    //--------------------------------------------------------------------------
+    //
+    //  Overridden properties
+    //
+    //--------------------------------------------------------------------------
+
+    //----------------------------------
+    //  legendData
+    //----------------------------------
+
+    /**
+     *  @private
+     */
+    override public function get legendData():Array /* of LegendData */
+    {
+        if (fillFunction!=defaultFillFunction || _fillCount!=0)
+        {
+            var keyItems:Array /* of LegendData */ = [];
+            return keyItems;
+        }
+        var radius:Number = getStyle("radius")
+        var itemRenderer:IFactory = getStyle("itemRenderer");
+
+        var markerAspectRatio:Number;
+        var color:int = 0;
+        var marker:IFlexDisplayObject;
+
+        var ld:LegendData = new LegendData();
+        ld.element = this;
+        ld.label = displayName;
+
+
+        var markerFactory:IFactory = getStyle("legendMarkerRenderer");
+        if (markerFactory)
+        {
+            marker = markerFactory.newInstance();
+            if (marker is ISimpleStyleClient)
+                (marker as ISimpleStyleClient).styleName = this;
+            ld.aspectRatio = 1;
+        }
+        else if (!itemRenderer || radius == 0 || isNaN(radius))
+        {
+            marker = new LineSeriesLegendMarker(this);
+        }
+        else
+        {
+            markerFactory = getStyle("itemRenderer");
+            marker = markerFactory.newInstance();
+            ld.aspectRatio = 1;
+            if (marker as ISimpleStyleClient)
+                (marker as ISimpleStyleClient).styleName = this;
+        }
+
+        ld.marker = marker;
+
+        return [ld];
+    }
+
+    //----------------------------------
+    //  renderData
+    //----------------------------------
+
+    /**
+     *  @private
+     */
+    override protected function get renderData():Object
+    {
+        if (!_renderData||
+            !(_renderData.cache) ||
+            _renderData.cache.length == 0)
+        {
+            var renderDataType:Class = this.renderDataType;
+            var ld:LineSeriesRenderData = new renderDataType();
+            ld.cache = ld.filteredCache = [];
+            ld.segments = [];
+            ld.radius = 0;
+            return ld;
+        }
+
+        _renderData.radius = getStyle("radius");
+
+        return _renderData;
+    }
+
+    //--------------------------------------------------------------------------
+    //
+    //  Properties
+    //
+    //--------------------------------------------------------------------------
+
+    //-----------------------------------
+    // fillFunction
+    //-----------------------------------
+
+    [Bindable]
+    [Inspectable(category="General")]
+
+    /**
+     * @private
+     * Storage for fillFunction property
+     */
+    private var _fillFunction:Function=defaultFillFunction;
+
+    /**
+     * Specifies a method that returns the fill for the current chart item in the series.
+     * If this property is set, the return value of the custom fill function takes precedence over the
+     * fill and fills style properties.
+     * But if it returns null, then fills and fill will be
+     * prefered in that order.
+     *
+     *
The custom fillFunction has the following signature:
+     *
+     *

+     * function_name (item:ChartItem, index:Number):IFill { ... }
+     *

+     *
+     * item is a reference to the chart item that is being rendered.
+     * index is the index of the chart item in the renderData's cache. This is different
+     * from the index of the chart's data provider because it is sorted based on the x, y, and z values.
+     * This function returns an object that implements the IFill interface.
+     *

+     *
+     *
An example usage of a customized fillFunction is to return a fill
+     * based on some threshold.

+     *
+     * @example
+     *

+     * public function myFillFunction(item:ChartItem, index:Number):IFill {
+     *      var curItem:LineSeriesItem = LineSeriesItem(item);
+     *      if (curItem.yNumber > 10)
+     *          return(new SolidColor(0x123456, .75));
+     *      else
+     *          return(new SolidColor(0x563412, .75));
+     * }
+     *

+     *
+     *

+     *  If you specify a custom fill function for your chart series and you
+     *  want to have a Legend control, you must manually create a Legend control and
+     *  add LegendItems to it.
+     *

+     *
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+	public function get fillFunction():Function
+    {
+        return _fillFunction;
+    }
+
+    /**
+     * @private
+     */
+    public function set fillFunction(value:Function):void
+    {
+        if (value ==_fillFunction)
+            return;
+
+        if (value != null)
+            _fillFunction = value;
+
+        else
+            _fillFunction = defaultFillFunction;
+
+        invalidateDisplayList();
+        legendDataChanged();
+    }
+
+    //----------------------------------
+    //  horizontalAxis
+    //----------------------------------
+
+    /**
+     *  @private
+     *  Storage for the horizontalAxis property.
+     */
+    private var _horizontalAxis:IAxis;
+
+    [Inspectable(category="Data")]
+
+    /**
+     *  Defines the labels, tick marks, and data position
+     *  for items on the x-axis.
+     *  Use either the LinearAxis class or the CategoryAxis class
+     *  to set the properties of the horizontalAxis as a child tag in MXML
+     *  or create a LinearAxis or CategoryAxis object in ActionScript.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function get horizontalAxis():IAxis
+    {
+        return _horizontalAxis;
+    }
+
+    /**
+     *  @private
+     */
+    public function set horizontalAxis(value:IAxis):void
+    {
+        _horizontalAxis = value;
+        _bAxesDirty = true;
+
+        invalidateData();
+        invalidateProperties();
+    }
+
+    //----------------------------------
+    //  interpolateValues
+    //----------------------------------
+
+    /**
+     *  @private
+     *  Storage for the interpolateValues property.
+     */
+    private var _interpolateValues:Boolean = false;
+
+    [Inspectable(category="General")]
+
+    /**
+     *  Specifies how to represent missing data.
+     *
+     *
Set to false to break the line at the missing value.
+     *  Set to true to draw a continuous line by interpolating the missing value.

+     *
+     *  @default false
+    *
+    *  @langversion 3.0
+    *  @playerversion Flash 9
+    *  @playerversion AIR 1.1
+    *  @productversion Flex 3
+    */
+    public function get interpolateValues():Boolean
+    {
+        return _interpolateValues;
+    }
+
+    /**
+     *  @private
+     */
+    public function set interpolateValues(value:Boolean):void
+    {
+        if (_interpolateValues != value)
+        {
+            _interpolateValues = value;
+
+            invalidateData();
+        }
+    }
+
+    //----------------------------------
+    //  items
+    //----------------------------------
+
+    /**
+     *  @inheritDoc
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    override public function get items():Array /* of LineSeriesItem */
+    {
+        return _renderData ?
+               _renderData.filteredCache :
+               null;
+    }
+
+    //----------------------------------
+    //  itemType
+    //----------------------------------
+
+    [Inspectable(environment="none")]
+
+    /**
+     *  The subtype of ChartItem used by this series
+     *  to represent individual items.
+     *  Subclasses can override and return a more specialized class
+     *  if they need to store additional information in the items.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    protected function get itemType():Class
+    {
+        return LineSeriesItem;
+    }
+
+    //----------------------------------
+    //  lineSegmentType
+    //----------------------------------
+
+    [Inspectable(environment="none")]
+
+    /**
+     *  The class used by this series to store all data
+     *  necessary to represent a line segment.
+     *  Subclasses can override and return a more specialized class
+     *  if they need to store additional information for rendering.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    protected function get lineSegmentType():Class
+    {
+        return LineSeriesSegment;
+    }
+
+    //----------------------------------
+    //  radius
+    //----------------------------------
+
+    [Inspectable(category="Styles")]
+
+    /**
+     *  Specifies the radius, in pixels, of the chart elements
+     *  for the data points.
+     *  This property applies only if you specify an item renderer
+     *  using the itemRenderer property.
+     *  You can specify the itemRenderer in MXML or using styles.
+     *
+     *  @default 0
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function get radius():Number
+    {
+        return getStyle("radius");
+    }
+
+    /**
+     *  @private
+     */
+    public function set radius(value:Number):void
+    {
+        setStyle("radius", value);
+    }
+
+    //----------------------------------
+    //  renderDataType
+    //----------------------------------
+
+    [Inspectable(environment="none")]
+
+    /**
+     *  The subtype of ChartRenderData used by this series
+     *  to store all data necessary to render.
+     *  Subclasses can override and return a more specialized class
+     *  if they need to store additional information for rendering.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    protected function get renderDataType():Class
+    {
+        return LineSeriesRenderData;
+    }
+
+    //----------------------------------
+    //  sortOnXField
+    //----------------------------------
+
+    /**
+     *  @private
+     *  Storage for the sortOnXField property.
+     */
+    private var _sortOnXField:Boolean = true;
+
+    [Inspectable]
+
+    /**
+     *  Requests the line datapoints be sorted from left to right
+     *  before rendering.
+     *
+     *
By default, the LineSeries renders points from left to right.
+     *  Set this property to false to render the items
+     *  in the order they appear in the data provider.

+     *
+     *  @default true
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function get sortOnXField():Boolean
+    {
+        return _sortOnXField;
+    }
+
+    /**
+     *  @private
+     */
+    public function set sortOnXField(value:Boolean):void
+    {
+        if (_sortOnXField == value)
+            return;
+        _sortOnXField = value;
+
+        invalidateMapping();
+    }
+
+    //----------------------------------
+    //  verticalAxis
+    //----------------------------------
+
+    /**
+     *  @private
+     *  Storage for the verticalAxis property.
+     */
+    private var _verticalAxis:IAxis;
+
+    [Inspectable(category="Data")]
+
+    /**
+     *  Defines the labels, tick marks, and data position
+     *  for items on the y-axis.
+     *  Use either the LinearAxis class or the CategoryAxis class
+     *  to set the properties of the verticalAxis as a child tag in MXML
+     *  or create a LinearAxis or CategoryAxis object in ActionScript.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function get verticalAxis():IAxis
+    {
+        return _verticalAxis;
+    }
+
+    /**
+     *  @private
+     */
+    public function set verticalAxis(value:IAxis):void
+    {
+        _verticalAxis = value;
+        _bAxesDirty = true;
+
+        invalidateData();
+        //invalidateChildOrder();
+        invalidateProperties();
+    }
+
+    //----------------------------------
+    //  xField
+    //----------------------------------
+
+    /**
+     *  @private
+     *  Storage for the xField property.
+     */
+    private var _xField:String = "";
+
+    [Inspectable(category="General")]
+
+    /**
+     *  Specifies the field of the data provider
+     *  that determines the x-axis location of each data point.
+     *  If null, the data points are rendered
+     *  in the order they appear in the data provider.
+     *
+     *  @default null
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function get xField():String
+    {
+        return _xField;
+    }
+
+    /**
+     *  @private
+     */
+    public function set xField(value:String):void
+    {
+        _xField = value;
+
+        dataChanged();
+    }
+
+    //----------------------------------
+    //  yField
+    //----------------------------------
+
+    /**
+     *  @private
+     *  Storage for the yField property.
+     */
+    private var _yField:String = "";
+
+    [Inspectable(category="General")]
+
+    /**
+     *  Specifies the field of the data provider
+     *  that determines the y-axis location of each data point.
+     *  If null, the LineSeries assumes the data provider
+     *  is an Array of numbers, and uses the numbers as values.
+     *
+     *  @default null
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function get yField():String
+    {
+        return _yField;
+    }
+
+    /**
+     *  @private
+     */
+    public function set yField(value:String):void
+    {
+        _yField = value;
+
+        dataChanged();
+    }
+
+
+    //--------------------------------------------------------------------------
+    //
+    //  Overridden methods: UIComponent
+    //
+    //--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 */
+	private function initStyles():Boolean
+	{
+		HaloDefaults.init(styleManager);
+
+		var seriesStyle:CSSStyleDeclaration =
+			HaloDefaults.createSelector("mx.charts.series.LineSeries", styleManager);
+
+		seriesStyle.defaultFactory = function():void
+		{
+			this.adjustedRadius = 2;
+			this.fill = new SolidColor(0xFFFFFF);
+			this.lineSegmentRenderer = new ClassFactory(LineRenderer);
+			this.lineStroke = new Stroke(0, 3);
+			this.radius = 4;
+			this.fills = [];
+		}
+
+		return true;
+	}
+
+	/**
+	 *  @inheritDoc
+	 *
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	override public function set moduleFactory(factory:IFlexModuleFactory):void
+	{
+		super.moduleFactory = factory;
+
+		if (_moduleFactoryInitialized)
+			return;
+
+		_moduleFactoryInitialized = true;
+
+		// our style settings
+		initStyles();
+	}
+
+    /**
+     *  @inheritDoc
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    override protected function commitProperties():void
+    {
+        super.commitProperties();
+
+        if (dataTransform)
+        {
+            if (_horizontalAxis)
+            {
+                _horizontalAxis.chartDataProvider = dataProvider;
+                CartesianTransform(dataTransform).setAxis(
+                    CartesianTransform.HORIZONTAL_AXIS,_horizontalAxis);
+            }
+
+            if (_verticalAxis)
+            {
+                _verticalAxis.chartDataProvider = dataProvider;
+                CartesianTransform(dataTransform).setAxis(
+                    CartesianTransform.VERTICAL_AXIS, _verticalAxis);
+            }
+        }
+
+        var c:CartesianChart = CartesianChart(chart);
+        if (c)
+        {
+            if (!_horizontalAxis)
+            {
+                if (c.secondSeries.indexOf(this) != -1 && c.secondHorizontalAxis)
+                {
+                    if (dataTransform.axes[CartesianTransform.HORIZONTAL_AXIS] != c.secondHorizontalAxis)
+                        CartesianTransform(dataTransform).setAxis(
+                            CartesianTransform.HORIZONTAL_AXIS,c.secondHorizontalAxis);
+                }
+                else if (dataTransform.axes[CartesianTransform.HORIZONTAL_AXIS] != c.horizontalAxis)
+                        CartesianTransform(dataTransform).setAxis(
+                            CartesianTransform.HORIZONTAL_AXIS,c.horizontalAxis);
+            }
+
+            if (!_verticalAxis)
+            {
+                if (c.secondSeries.indexOf(this) != -1 && c.secondVerticalAxis)
+                {
+                    if (dataTransform.axes[CartesianTransform.VERTICAL_AXIS] != c.secondVerticalAxis)
+                        CartesianTransform(dataTransform).setAxis(
+                            CartesianTransform.VERTICAL_AXIS,c.secondVerticalAxis);
+                }
+                else if (dataTransform.axes[CartesianTransform.VERTICAL_AXIS] != c.verticalAxis)
+                        CartesianTransform(dataTransform).setAxis(
+                            CartesianTransform.VERTICAL_AXIS, c.verticalAxis);
+            }
+        }
+        dataTransform.elements = [this];
+    }
+
+    /**
+     *  @private
+     */
+    override protected function updateDisplayList(unscaledWidth:Number,
+                                                  unscaledHeight:Number):void
+    {
+        super.updateDisplayList(unscaledWidth, unscaledHeight);
+
+        var renderData:LineSeriesRenderData = (transitionRenderData)? LineSeriesRenderData(transitionRenderData) :_renderData;
+        if (!renderData || !(renderData.filteredCache))
+            return;
+
+        var g:Graphics = graphics;
+
+        g.clear();
+
+        var radius:Number = getStyle("radius");
+        var sampleCount:int = renderData.filteredCache.length;
+        var i:int;
+
+
+        var segCount:int = renderData.segments.length;
+
+
+        var activeRenderCache:Array /* of LineSeriesItem */;
+
+        // figure out what cache we're rendering from. If there's a bounds based transtion underway, we need
+        // to rebuild our cache from the bounds
+        if (renderData == transitionRenderData && renderData.elementBounds)
+        {
+            var elementBounds:Array /* of Rectangle */ = renderData.elementBounds;
+            sampleCount= elementBounds.length;
+            activeRenderCache = renderData.filteredCache;
+
+
+            for (i = 0; i < sampleCount; i++)
+            {
+                var rcBounds:Object = elementBounds[i];
+                var localData:LineSeriesItem = activeRenderCache[i];
+                localData.x = (rcBounds.left + rcBounds.right)/2;
+                localData.y = (rcBounds.bottom + rcBounds.top)/2;
+            }
+        }
+        else
+        {
+            activeRenderCache = renderData.filteredCache;
+        }
+
+        // now position each segment
+
+        _segmentInstanceCache.factory = getStyle("lineSegmentRenderer");
+        _segmentInstanceCache.count = segCount;
+        var instances:Array /* of IFlexDisplayObject */ = _segmentInstanceCache.instances;
+        var v:LineSeriesItem;
+
+        for (i = 0; i < segCount; i++)
+        {
+            var segment:IFlexDisplayObject = instances[i];
+            if (segment is IDataRenderer)
+                IDataRenderer(segment).data = renderData.segments[i];
+            segment.setActualSize(unscaledWidth,unscaledHeight);
+        }
+
+
+        // if the user has asked for markers at each datapoint, position those as well
+        if (radius > 0)
+        {
+            _pointInstanceCache.factory = getStyle("itemRenderer");
+            _pointInstanceCache.count = renderData.validPoints;
+
+            instances = _pointInstanceCache.instances;
+            var nextInstanceIdx:int = 0;
+
+            var bSetData:Boolean = (sampleCount > 0 && (instances[0] is IDataRenderer))
+
+            var rc:Rectangle;
+            var inst:IFlexDisplayObject;
+
+            if (renderData == transitionRenderData && renderData.elementBounds)
+            {
+                for (i = 0; i < sampleCount; i++)
+                {
+                    v = activeRenderCache[i];
+                    inst = instances[nextInstanceIdx++];
+                    v.itemRenderer = inst;
+                    v.fill = fillFunction(v,i);
+                    if (!(v.fill))
+                        v.fill = defaultFillFunction(v,i);
+                    if (v.itemRenderer && (v.itemRenderer as Object).hasOwnProperty('invalidateDisplayList'))
+                        (v.itemRenderer as Object).invalidateDisplayList();
+                    if (inst)
+                    {
+                        if (bSetData)
+                            IDataRenderer(inst).data = v;
+                        rc = elementBounds[i];
+                        inst.move(rc.left,rc.top);
+                        inst.setActualSize(rc.width,rc.height);
+                    }
+                }
+            }
+            else
+            {
+                for (i = 0; i < sampleCount; i++)
+                {
+                    v  = activeRenderCache[i];
+                    var e:Object = renderData.filteredCache[i];
+                    //if (filterData && (isNaN(e.xFilter) || isNaN(e.yFilter)))
+                    if(filterFunction == defaultFilterFunction &&
+                       		((filterDataValues == "outsideRange" && (isNaN(e.xFilter) || isNaN(e.yFilter))) ||
+                       		 (filterDataValues == "nulls" && (isNaN(e.xNumber) || isNaN(e.yNumber)))))
+                        continue;
+
+                    inst = instances[nextInstanceIdx++];
+                    v.itemRenderer = inst;
+                    v.fill = fillFunction(v,i);
+                    if (!(v.fill))
+                        v.fill = defaultFillFunction(v,i);
+                    if (v.itemRenderer && (v.itemRenderer as Object).hasOwnProperty('invalidateDisplayList'))
+                        (v.itemRenderer as Object).invalidateDisplayList();
+                    if (inst)
+                    {
+                        if (bSetData)
+                            IDataRenderer(inst).data = v;
+                        inst.move(v.x-radius,v.y - radius);
+                        inst.setActualSize(2*radius,2*radius);
+                    }
+                }
+                if (chart && allSeriesTransform && chart.chartState == 0)
+                    chart.updateAllDataTips();
+            }
+        }
+    }
+
+    /**
+     *  @private
+     */
+    override public function stylesInitialized():void
+    {
+        _localFills = getStyle('fills');
+        if (_localFills != null)
+        	_fillCount = _localFills.length;
+        else
+        	_fillCount = 0;
+        super.stylesInitialized();
+    }
+
+    /**
+     *  @private
+     */
+    override public function styleChanged(styleProp:String):void
+    {
+        super.styleChanged(styleProp);
+        var styles:String = "fills"
+        if (styles.indexOf(styleProp)!=-1)
+        {
+            _localFills = getStyle('fills');
+            if (_localFills != null)
+        		_fillCount = _localFills.length;
+	        else
+    	    	_fillCount = 0;
+        }
+        if (styleProp == "itemRenderer")
+        {
+            _pointInstanceCache.remove = true;
+            _pointInstanceCache.discard = true;
+            _pointInstanceCache.count = 0;
+            _pointInstanceCache.discard = false;
+            _pointInstanceCache.remove = false;
+        }
+        if (styleProp == "lineSegmentRenderer")
+        {
+            _segmentInstanceCache.remove = true;
+            _segmentInstanceCache.discard = true;
+            _segmentInstanceCache.count = 0;
+            _segmentInstanceCache.discard = false;
+        	_segmentInstanceCache.remove = false;
+        }
+
+        invalidateDisplayList();
+
+        legendDataChanged();
+    }
+
+    //--------------------------------------------------------------------------
+    //
+    //  Overridden methods: ???
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     */
+    override protected function updateData():void
+    {
+        var renderDataType:Class = this.renderDataType;
+        _renderData= new renderDataType();
+
+        _renderData.cache = [];
+
+        if (dataProvider)
+        {
+            cursor.seek(CursorBookmark.FIRST);
+            var i:int = 0;
+            var itemClass:Class = itemType;
+            while (!cursor.afterLast)
+            {
+                _renderData.cache[i] = new itemClass(this,cursor.current,i);
+                i++;
+                cursor.moveNext();
+            }
+
+            cacheDefaultValues(_yField,_renderData.cache,"yValue");
+            cacheIndexValues(_xField,_renderData.cache,"xValue");
+        }
+		if(dataTransform && dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS) is NumericAxis &&
+			!(dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS) is DateTimeAxis) &&
+        	(dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS) as NumericAxis).direction == "inverted")
+        	_renderData.cache = reverseYValues(_renderData.cache);
+        if(dataTransform && dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS) is NumericAxis &&
+        	!(dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS) is DateTimeAxis) &&
+        	(dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS) as NumericAxis).direction == "inverted")
+        	_renderData.cache = reverseXValues(_renderData.cache);
+        _renderData.validPoints = _renderData.cache.length;
+        super.updateData();
+    }
+
+    /**
+     *  @private
+     */
+    override protected function updateMapping():void
+    {
+        dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS).mapCache(_renderData.cache,"xValue","xNumber", (_xField == ""));
+        dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).mapCache(_renderData.cache,"yValue","yNumber");
+        // now convert
+        if (_xField != "" && _sortOnXField)
+            _renderData.cache.sortOn("xNumber",Array.NUMERIC);
+
+        super.updateMapping();
+
+    }
+
+    /**
+     *  @private
+     */
+    override protected function updateFilter():void
+    {
+        _renderData.segments = [];
+        var lineSegmentType:Class = this.lineSegmentType;
+        _renderData.filteredCache = filterFunction(_renderData.cache);
+
+		if(filterFunction != defaultFilterFunction)
+		// we do this only for custom filter function because default filter function
+		//already does this as part of the function.
+		{
+			createLineSegments(_renderData.filteredCache);
+		}
+        super.updateFilter();
+    }
+
+    /**
+     *  @private
+     */
+    override protected function updateTransform():void
+    {
+        dataTransform.transformCache(_renderData.filteredCache,"xNumber","x","yNumber","y");
+        super.updateTransform();
+        allSeriesTransform = true;
+
+        if (chart && chart is CartesianChart)
+        {
+            var cChart:CartesianChart = CartesianChart(chart);
+            var n:int = cChart.series.length;
+
+            for (var i:int = 0; i < n; i++)
+            {
+                if (cChart.getSeriesTransformState(cChart.series[i]))
+                    allSeriesTransform = false;
+            }
+
+            n = cChart.secondSeries.length;
+            for (i = 0; i < n; i++)
+            {
+                if (cChart.getSeriesTransformState(cChart.secondSeries[i]))
+                    allSeriesTransform = false;
+            }
+            if (allSeriesTransform)
+                cChart.measureLabels();
+        }
+    }
+
+    /**
+     *  @private
+     */
+    override public function describeData(dimension:String,
+                                          requiredFields:uint):Array /* of DataDescription */
+    {
+        validateData();
+
+        if (_renderData.cache.length == 0)
+            return [];
+
+        var description:DataDescription = new DataDescription();
+        description.boundedValues = null;
+
+        var dataMargin:Number;
+        var stroke:IStroke;
+        var radius:Number;
+        var renderer:Object;
+
+        if (dimension == CartesianTransform.VERTICAL_AXIS)
+        {
+            extractMinMax(_renderData.cache,"yNumber",description);
+            if ((requiredFields & DataDescription.REQUIRED_BOUNDED_VALUES) != 0)
+            {
+                dataMargin = 0;
+
+                stroke = getStyle("lineStroke");
+                if (stroke)
+                    dataMargin = stroke.weight/2;
+
+                radius = getStyle("radius");
+                renderer = getStyle("itemRenderer");
+                if (radius > 0 && renderer)
+                {
+                    stroke = getStyle("stroke");
+                    if (stroke)
+                        radius += stroke.weight/2;
+
+                    dataMargin = Math.max(radius,dataMargin);
+                }
+
+                if (dataMargin > 0)
+                {
+                    description.boundedValues= [];
+                    description.boundedValues.push(new BoundedValue(description.max,0,dataMargin));
+                    description.boundedValues.push(new BoundedValue(description.min,dataMargin,0));
+                }
+            }
+        }
+        else if (dimension == CartesianTransform.HORIZONTAL_AXIS)
+        {
+            if (_xField != "")
+            {
+                if ((requiredFields & DataDescription.REQUIRED_MIN_INTERVAL) != 0)
+                {
+                    // if we need to know the min interval, then we rely on the cache being in order. So we need to sort it if it
+                    // hasn't already been sorted
+                    var cache:Array /* of LineSeriesItem */ = _renderData.cache;
+                    if (_sortOnXField == false)
+                    {
+                        cache = _renderData.cache.concat();
+                        cache.sortOn("xNumber",Array.NUMERIC);
+                    }
+                    extractMinMax(cache,"xNumber",description,(0 != (requiredFields & DataDescription.REQUIRED_MIN_INTERVAL)));
+                }
+                else
+                {
+                    extractMinMax(_renderData.cache,"xNumber",description, (requiredFields & DataDescription.REQUIRED_MIN_INTERVAL) != 0);
+                }
+            }
+            else
+            {
+                description.min = _renderData.cache[0].xNumber;
+                description.max = _renderData.cache[_renderData.cache.length-1].xNumber;
+                if ((requiredFields & DataDescription.REQUIRED_MIN_INTERVAL) != 0)
+                {
+                    extractMinInterval(_renderData.cache,"xNumber",description);
+                }
+            }
+
+            if ((requiredFields & DataDescription.REQUIRED_BOUNDED_VALUES) != 0)
+            {
+                dataMargin = 0;
+
+                stroke = getStyle("lineStroke");
+                if (stroke)
+                    dataMargin = stroke.weight/2;
+
+                radius = getStyle("radius");
+                renderer = getStyle("itemRenderer");
+                if (radius > 0 && renderer)
+                {
+                    stroke = getStyle("stroke");
+                    if (stroke)
+                        radius += stroke.weight/2;
+
+                    dataMargin = Math.max(radius,dataMargin);
+                }
+
+                if (dataMargin > 0)
+                {
+                    description.boundedValues= [];
+                    description.boundedValues.push(new BoundedValue(description.max,0,dataMargin));
+                    description.boundedValues.push(new BoundedValue(description.min,dataMargin,0));
+                }
+            }
+        }
+        else
+        {
+            return [];
+        }
+
+        return [ description ];
+    }
+
+    /**
+     *  @private
+     */
+    override public function getAllDataPoints():Array /* of HitData */
+    {
+        if (!_renderData)
+            return [];
+        if (!(_renderData.filteredCache))
+            return [];
+
+        var itemArr:Array /* of LineSeriesItem */ = [];
+        if (chart && chart.dataTipItemsSet && dataTipItems)
+            itemArr = dataTipItems;
+        else if (chart && chart.showAllDataTips && _renderData.filteredCache)
+            itemArr = _renderData.filteredCache;
+        else
+            itemArr = [];
+
+        var n:uint = itemArr.length;
+        var i:uint;
+        var result:Array /* of HitData */ = [];
+
+        for (i = 0; i < n; i++)
+        {
+            var v:LineSeriesItem = itemArr[i];
+            if (_renderData.filteredCache.indexOf(v) == -1)
+            {
+                var itemExists:Boolean = false;
+                var m:int  = _renderData.filteredCache.length;
+                for (var j:int = 0; j < m; j++)
+                {
+                    if (v.item == _renderData.filteredCache[j].item)
+                    {
+                        v = _renderData.filteredCache[j];
+                        itemExists = true;
+                        break;
+                    }
+                }
+                if (!itemExists)
+                    continue;
+            }
+            if (v)
+            {
+                var hd:HitData = new HitData(createDataID(v.index),Math.sqrt(0),v.x,v.y,v);
+
+                var istroke:IStroke = getStyle("lineStroke");
+                if (istroke is Stroke)
+                    hd.contextColor = Stroke(istroke).color;
+                else if (istroke is LinearGradientStroke)
+                {
+                    var gb:LinearGradientStroke = LinearGradientStroke(istroke);
+                    if (gb.entries.length > 0)
+                        hd.contextColor = gb.entries[0].color;
+                }
+                hd.dataTipFunction = formatDataTip;
+                result.push(hd);
+            }
+        }
+        return result;
+    }
+
+    /**
+     *  @private
+     */
+    override public function findDataPoints(x:Number,y:Number,sensitivity:Number):Array /* of HitData */
+    {
+        // esg, 8/7/06: if your mouse is over a series when it gets added and displayed for the first time, this can get called
+        // before updateData, and before and render data is constructed. The right long term fix is to make sure a stubbed out
+        // render data is _always_ present, but that's a little disruptive right now.
+        if (interactive == false || !_renderData)
+            return [];
+
+        var pr:Number = getStyle("radius");
+        var minDist2:Number  = pr + sensitivity;
+        minDist2 *= minDist2;
+        var minItem:LineSeriesItem = null;
+        var pr2:Number = pr * pr;
+
+        var n:int = _renderData.filteredCache.length;
+
+        if (n == 0)
+            return [];
+
+        if (sortOnXField == true)
+        {
+            var low:Number = 0;
+            var high:Number = n;
+            var cur:Number = Math.floor((low+high)/2);
+
+            var bFirstIsNaN:Boolean = isNaN(_renderData.filteredCache[0]);
+
+            while (true)
+            {
+                var v:LineSeriesItem = _renderData.filteredCache[cur];
+                if (!isNaN(v.yNumber) && !isNaN(v.xNumber))
+                {
+                    var dist:Number = (v.x  - x)*(v.x  - x) + (v.y - y)*(v.y -y);
+                    if (dist <= minDist2)
+                    {
+                        minDist2 = dist;
+                        minItem = v;
+                    }
+                }
+                var a:Number;
+            	var b:Number;
+            	if(dataTransform && dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS) is NumericAxis &&
+        		(dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS) as NumericAxis).direction == "inverted")
+        		{
+        			a = x;
+        			b = v.x;
+        		}
+        		else
+        		{
+        			a = v.x;
+        			b = x;
+        		}
+                // if there are NaNs in this array, it's for one of a couple of reasons:
+                // 1) there were NaNs in the data, which menas an xField was provided, which means they got sorted to the end
+                // 2) some values got filtered out, in which case we can (sort of) safely assumed that the got filtered from one side, the other, or the entire thing.
+                // we'll assume that an axis hasn't filtered a middle portion of the array.
+                // since we can assume that any NaNs are at the beginning or the end, we'll rely on that in our binary search.  If there was a NaN in the first slot,
+                // then we'll assume it's safe to move up the array if we encounter a NaN.  It's possible the entire array is NaN, but then nothing will match, so that's ok.
+                if (a < b || (isNaN(v.x) && bFirstIsNaN))
+                {
+                    low = cur;
+                    cur = Math.floor((low + high)/2);
+                    if (cur == low)
+                        break;
+                }
+                else
+                {
+                    high = cur;
+                    cur = Math.floor((low + high)/2);
+                    if (cur == high)
+                        break;
+                }
+            }
+        }
+        else
+        {
+            var i:uint;
+            for (i = 0; i < n; i++)
+            {
+               v = _renderData.filteredCache[i];
+               if (!isNaN(v.yNumber) && !isNaN(v.xNumber))
+                {
+                   dist = (v.x  - x)*(v.x  - x) + (v.y - y)*(v.y -y);
+                   if (dist <= minDist2)
+                   {
+                       minDist2 = dist;
+                       minItem = v;
+                   }
+                }
+           }
+        }
+
+        if (minItem)
+        {
+            var hd:HitData = new HitData(createDataID(minItem.index),Math.sqrt(minDist2),minItem.x,minItem.y,minItem);
+
+            var istroke:IStroke = getStyle("lineStroke");
+            if (istroke is Stroke)
+                hd.contextColor = Stroke(istroke).color;
+            else if (istroke is LinearGradientStroke)
+            {
+                var gb:LinearGradientStroke = LinearGradientStroke(istroke);
+                if (gb.entries.length > 0)
+                    hd.contextColor = gb.entries[0].color;
+            }
+            hd.dataTipFunction = formatDataTip;
+            return [ hd ];
+        }
+
+        return [];
+    }
+
+
+    /**
+     *  @private
+     */
+    override public function getElementBounds(renderData:Object):void
+    {
+        var cache :Array /* of LineSeriesItem */ = renderData.cache;
+        var segments:Array /* of LineSeriesSegment */ = renderData.segments;
+
+        var rb :Array /* of Rectangle */ = [];
+        var sampleCount:int = cache.length;
+
+        if (sampleCount == 0)
+            maxBounds  = new Rectangle();
+        else
+        {
+            var radius:Number = renderData.radius;
+
+            if (radius == 0 || isNaN(radius))
+                radius = 1;
+
+            var segCount:int = segments.length;
+            if (segCount)
+            {
+                var v:Object = cache[renderData.segments[0].start];
+                var maxBounds:Rectangle = new Rectangle(v.x,v.y,0,0);
+            }
+
+
+            for (var i:int = 0; i < segCount; i++)
+            {
+            	var j:int;
+                var seg:Object = renderData.segments[i];
+            	if (i > 0){
+            		var prevSeg:Object = renderData.segments[i-1];
+            		if (seg.start > prevSeg.end + 1){
+            			for (j = prevSeg.end + 1; j < seg.start ; j++){
+            				var rect:Rectangle = new Rectangle(0, 0, 0, 0);
+            				rb[j] = rect;
+            			}
+            		}
+            	}
+                for (j = seg.start; j <= seg.end; j++)
+                {
+                    v = cache[j];
+                    var b:Rectangle = new Rectangle(v.x-radius,v.y-radius,2*radius,2*radius);
+
+                    maxBounds.left = Math.min(maxBounds.left,b.left);
+                    maxBounds.top = Math.min(maxBounds.top,b.top);
+                    maxBounds.right = Math.max(maxBounds.right,b.right);
+                    maxBounds.bottom = Math.max(maxBounds.bottom,b.bottom);
+                    rb[j] = b;
+                }
+            }
+        }
+
+
+        renderData.elementBounds = rb;
+        renderData.bounds =  maxBounds;
+    }
+
+    /**
+     *  @private
+     */
+    override public function beginInterpolation(sourceRenderData:Object,
+                                                destRenderData:Object):Object
+    {
+        var idata:Object = initializeInterpolationData(
+            sourceRenderData.cache, destRenderData.cache,
+            { x: true, y: true }, itemType,
+            { sourceRenderData: sourceRenderData,
+              destRenderData: destRenderData });
+
+        var interpolationRenderData:LineSeriesRenderData = LineSeriesRenderData(destRenderData.clone());
+
+        interpolationRenderData.cache = idata.cache;
+        interpolationRenderData.filteredCache = idata.cache;
+
+        /* the segments in the renderdata have pointers back to the filetered cache.  since we just replaced the filtered cache, we need to iterate through and
+        /  update those */
+        var segs:Array /* of LineSeriesSegment */ = interpolationRenderData.segments;
+        var n:int = segs.length;
+        for (var i:int = 0; i < n; i++)
+        {
+            segs[i].items = idata.cache;
+        }
+
+        transitionRenderData = interpolationRenderData;
+        return idata;
+    }
+
+    /**
+     *  @private
+     */
+    override protected function getMissingInterpolationValues(
+                                    sourceProps:Object, srcCache:Array /* of LineSeriesItem */,
+                                    destProps:Object, destCache:Array /* of LineSeriesItem */,
+                                    index:Number, customData:Object):void
+    {
+        var cache:Array /* of LineSeriesItem */ = customData.sourceRenderData.cache;
+        var dstCache:Array /* of LineSeriesItem */ = customData.destRenderData.cache;
+
+        for (var p:String in sourceProps)
+        {
+            var src:Number = sourceProps[p];
+            var dst:Number = destProps[p];
+
+
+            var lastValidIndex:int = index;
+            if (isNaN(src))
+            {
+                if (cache.length == 0)
+                {
+                    src = (p == "x")? dstCache[index].x : unscaledHeight;
+                }
+                else
+                {
+                    if (lastValidIndex >= cache.length)
+                        lastValidIndex = cache.length-1;
+                    while (lastValidIndex >= 0 && isNaN(cache[lastValidIndex][p]))
+                    {
+                        lastValidIndex--;
+                    }
+                    if (lastValidIndex >= 0)
+                        src =   cache[lastValidIndex][p] + .01 * (lastValidIndex - index);
+                    if (isNaN(src))
+                    {
+                        lastValidIndex = index+1;
+                        var cachelen:int = cache.length;
+                        while (lastValidIndex < cachelen && isNaN(cache[lastValidIndex][p]))
+                        {
+                            lastValidIndex++;
+                        }
+                        if (lastValidIndex < cachelen)
+                        {
+                            src = cache[lastValidIndex][p] + .01 * (lastValidIndex - index);
+                        }
+                    }
+                }
+            }
+
+            sourceProps[p] = src;
+            destProps[p] = dst;
+        }
+    }
+
+    /**
+     *  @private
+     */
+    override public function dataToLocal(... dataValues):Point
+    {
+        var data:Object = {};
+        var da:Array /* of Object */ = [ data ];
+        var n:int = dataValues.length;
+
+        if (n > 0)
+        {
+            data["d0"] = dataValues[0];
+            dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS).
+                mapCache(da, "d0", "v0");
+        }
+
+        if (n > 1)
+        {
+            data["d1"] = dataValues[1];
+            dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).
+                mapCache(da, "d1", "v1");
+        }
+
+        dataTransform.transformCache(da,"v0","s0","v1","s1");
+
+        return new Point(data.s0 + this.x,
+                         data.s1 + this.y);
+    }
+
+    /**
+     *  @private
+     */
+    override public function localToData(v:Point):Array /* of Object */
+    {
+        var values:Array /* of Object */ = dataTransform.invertTransform(
+                                            v.x - this.x,
+                                            v.y - this.y);
+        return values;
+    }
+
+    /**
+     *  @private
+     */
+    override public function getItemsInRegion(r:Rectangle):Array /* of LineSeriesItem */
+    {
+        if (interactive == false || !_renderData)
+            return [];
+
+        var arrItems:Array /* of LineSeriesItem */ = [];
+        var rc:Rectangle = new Rectangle();
+        var localRectangle:Rectangle = new Rectangle();
+        var n:uint = _renderData.filteredCache.length;
+
+        localRectangle.topLeft = globalToLocal(r.topLeft);
+        localRectangle.bottomRight = globalToLocal(r.bottomRight);
+
+
+        for (var i:int = 0; i < n; i++)
+        {
+            var v:LineSeriesItem = _renderData.filteredCache[i];
+
+            if (localRectangle.contains(v.x,v.y))
+                arrItems.push(v);
+        }
+        return arrItems;
+    }
+
+     /**
+     * @private
+     */
+    override protected function defaultFilterFunction(cache:Array /*of LineSeriesItem */ ):Array /*of LineeriesItem*/
+    {
+    	var filteredCache:Array /*of LineSeriesItem*/ = [];
+    	var start:int;
+        var end:int = -1;
+        var n:int;
+        var i:int;
+        var v:LineSeriesItem;
+
+    	if (filterDataValues == "outsideRange")
+        {
+            filteredCache = cache.concat();
+
+            dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS).filterCache(filteredCache,"xNumber","xFilter")
+            dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).filterCache(filteredCache,"yNumber","yFilter");
+
+            // since all nulls will end up out at the edges, we can safely strip this early
+
+           if (xField != "" && sortOnXField)
+                stripNaNs(filteredCache,"xFilter");
+
+            _renderData.validPoints = filteredCache.length;
+
+            if (_interpolateValues == false)
+            {
+                n = filteredCache.length;
+
+                while (end<n)
+                {
+                    for (i = end + 1; i < n; i++)
+                    {
+                        v = LineSeriesItem(filteredCache[i]);
+                        if (!isNaN(v.xFilter) && !isNaN(v.yFilter))
+                            break;
+                        _renderData.validPoints--;
+                    }
+                    if (i == n)
+                        break;
+
+                    start = i;
+
+                    for (i = start + 1; i < n; i++)
+                    {
+                        v = LineSeriesItem(filteredCache[i]);
+                        if (isNaN(v.xFilter) || isNaN(v.yFilter))
+                            break;
+                    }
+                    end = i-1;
+                    if (end != start)
+                    {
+                        _renderData.segments.push(new lineSegmentType(this,_renderData.segments.length,filteredCache,start,end));
+                    }
+                }
+            }
+            else
+            {
+                stripNaNs(filteredCache,"yFilter");
+                _renderData.validPoints = filteredCache.length;
+                if (filteredCache.length > 1)
+                    _renderData.segments.push(new lineSegmentType(this,0,filteredCache,start,filteredCache.length-1));
+            }
+        }
+        else if (filterDataValues == "nulls")
+        {
+        	filteredCache = cache.concat();
+        	 // since all nulls will end up out at the edges, we can safely strip this early
+			if (xField != "" && sortOnXField)
+                stripNaNs(filteredCache,"xNumber");
+
+            _renderData.validPoints = filteredCache.length;
+
+            if (_interpolateValues == false)
+            {
+            	n = filteredCache.length;
+                while (end<n)
+                {
+                    for (i = end + 1; i < n; i++)
+                    {
+                        v = LineSeriesItem(filteredCache[i]);
+                        if (!isNaN(v.xNumber) && !isNaN(v.yNumber))
+                            break;
+                        _renderData.validPoints--;
+                    }
+                    if (i == n)
+                        break;
+
+                    start = i;
+
+                    for (i = start + 1; i < n; i++)
+                    {
+                        v = LineSeriesItem(filteredCache[i]);
+                        if (isNaN(v.xNumber) || isNaN(v.yNumber))
+                            break;
+                    }
+                    end = i-1;
+                    if (end != start)
+                    {
+                        _renderData.segments.push(new lineSegmentType(this,_renderData.segments.length,filteredCache,start,end));
+                    }
+                }
+            }
+
+            else
+            {
+                stripNaNs(filteredCache,"yNumber");
+                _renderData.validPoints = filteredCache.length;
+                if (filteredCache.length > 1)
+                    _renderData.segments.push(new lineSegmentType(this,0,filteredCache,start,filteredCache.length-1));
+            }
+        }
+        else if (filterDataValues == "none")
+        {
+            filteredCache = cache;
+            _renderData.segments.push(new lineSegmentType(this,0,filteredCache,start,filteredCache.length-1));
+        }
+        return filteredCache;
+    }
+
+    //--------------------------------------------------------------------------
+    //
+    //  Methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     *  This method is to create line segments for the cache returned
+     *  by custom filter function
+     */
+    private function createLineSegments(filteredCache:Array /* of LineSeriesItem */):void
+    {
+    		_renderData.validPoints = filteredCache.length;
+
+            if (_interpolateValues == false)
+            {
+                var start:int;
+                var end:int = -1;
+                var n:int = filteredCache.length;
+                var i:int;
+                var v:LineSeriesItem;
+
+                while (end<n)
+                {
+                    for (i = end + 1; i < n; i++)
+                    {
+                        v = LineSeriesItem(filteredCache[i]);
+                        if (!isNaN(v.xNumber) && !isNaN(v.yNumber))
+                            break;
+                        _renderData.validPoints--;
+                    }
+                    if (i == n)
+                        break;
+
+                    start = i;
+
+                    for (i = start + 1; i < n; i++)
+                    {
+                        v = LineSeriesItem(filteredCache[i]);
+                        if (isNaN(v.xNumber) || isNaN(v.yNumber))
+                            break;
+                    }
+                    end = i-1;
+                    if (end != start)
+                    {
+                        _renderData.segments.push(new lineSegmentType(this,_renderData.segments.length,filteredCache,start,end));
+                    }
+                }
+            }
+
+            else
+            {
+                _renderData.validPoints = filteredCache.length;
+                if (filteredCache.length > 1)
+                    _renderData.segments.push(new lineSegmentType(this,0,filteredCache,start,filteredCache.length-1));
+            }
+    }
+
+    /**
+     *  Customizes the item renderer instances that are used to represent the chart. This method is called automatically
+     *  whenever a new item renderer is needed while the chart is being rendered. You can override this method to add your own customization as necessary.
+     *  @param instance The new item renderer instance that is being created.
+     *  @param cache The InstanceCache that is used to manage the item renderer instances.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    protected function applyItemRendererProperties(instance:DisplayObject,
+                                                   cache:InstanceCache):void
+    {
+        if (instance is ISimpleStyleClient)
+            ISimpleStyleClient(instance).styleName = this;
+    }
+
+    /**
+     *  @private
+     */
+    private function formatDataTip(hd:HitData):String
+    {
+        var dt:String = "";
+
+        var n:String = displayName;
+        if (n && n != "")
+            dt += "" + n + "
";
+
+        var xName:String = dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS).displayName;
+        if (xName != "")
+            dt += "" + xName+ ": ";
+        dt += dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS).formatForScreen(
+            LineSeriesItem(hd.chartItem).xValue) + "\n";
+
+        var yName:String = dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).displayName;
+        if (yName != "")
+            dt += "" + yName + ": ";
+        dt += dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).formatForScreen(
+            LineSeriesItem(hd.chartItem).yValue) + "\n";
+
+        return dt;
+    }
+
+    /**
+     * @private
+     */
+    private function defaultFillFunction(element:LineSeriesItem,i:Number):IFill
+    {
+        if (_fillCount!=0)
+        {
+          return(GraphicsUtilities.fillFromStyle(_localFills[i % _fillCount]));
+        }
+        else
+          return(GraphicsUtilities.fillFromStyle(getStyle("fill")));
+    }
+
+
+    private function reverseYValues(cache:Array):Array
+    {
+    	var i:int = 0;
+        var n:int = cache.length;
+        for(i = 0; i < n ; i++)
+        {
+        	cache[i]["yValue"] = -(cache[i]["yValue"]);
+        }
+    	return cache;
+    }
+
+    private function reverseXValues(cache:Array):Array
+    {
+    	var i:int = 0;
+        var n:int = cache.length;
+        for(i = 0; i < n ; i++)
+        {
+        	cache[i]["xValue"] = -(cache[i]["xValue"]);
+        }
+    	return cache;
+    }
+}
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Helper class: LineSeriesLegendMarker
+//
+////////////////////////////////////////////////////////////////////////////////
+
+
+import flash.display.Graphics;
+import mx.charts.series.LineSeries;
+import mx.graphics.IStroke;
+import mx.graphics.Stroke;
+import mx.graphics.LinearGradientStroke;
+import mx.skins.ProgrammaticSkin;
+
+/**
+ *  @private
+ */
+class LineSeriesLegendMarker extends ProgrammaticSkin
+{
+    //--------------------------------------------------------------------------
+    //
+    //  Constructor
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     *  Constructor.
+     */
+    public function LineSeriesLegendMarker(element:LineSeries)
+    {
+        super();
+
+        _element = element;
+        styleName = _element;
+    }
+
+    //--------------------------------------------------------------------------
+    //
+    //  Variables
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     */
+    private var _element:LineSeries;
+
+
+    //--------------------------------------------------------------------------
+    //
+    //  Overridden methods
+    //
+    //--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     */
+    override protected function updateDisplayList(unscaledWidth:Number,
+                                                  unscaledHeight:Number):void
+    {
+        super.updateDisplayList(unscaledWidth,unscaledHeight);
+
+        var fillStroke:IStroke = getStyle("lineStroke");
+        var color:Number;
+
+        if (fillStroke is Stroke)
+        {
+            color = Stroke(fillStroke).color;
+        }
+        else if (fillStroke is LinearGradientStroke)
+        {
+            var gb:LinearGradientStroke = LinearGradientStroke(fillStroke);
+            if (gb.entries.length > 0)
+                color = gb.entries[0].color;
+        }
+
+        var g:Graphics = graphics;
+        g.clear();
+        g.moveTo(0, 0);
+        g.lineStyle(0, 0, 0);
+        g.beginFill(color);
+        g.lineTo(width, 0);
+        g.lineTo(width, height);
+        g.lineTo(0, height);
+        g.lineTo(0, 0);
+        g.endFill();
+    }
+}


Transferred from the Adobe Open Source Subversion Repository

Revision: 20219
Author:   dthakkar@adobe.com
Date:     2011-02-09T00:31:57.411477Z

Log Message:
-----------
QE notes:
Doc notes: Added alternative metatag
Bugs: SDK-28163
Reviewer: Masa,Harish
Tests run: Cyclone
Is noteworthy for integration: No

Modified Paths:
--------------
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/validators/CurrencyValidator.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/collections/SortField.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/formatters/NumberFormatter.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/formatters/CurrencyFormatter.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/collections/Sort.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/validators/NumberValidator.as</path>
<path kind="file" action="M">/private/flex/sdk/branches/hero_private/frameworks/projects/framework/src/mx/formatters/DateFormatter.as</path>

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1258738 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/framework/src/mx/collections/SortField.as
+++ frameworks/projects/framework/src/mx/collections/SortField.as
@@ -22,6 +22,7 @@
 import mx.utils.ObjectUtil;

 [ResourceBundle("collections")]
+[Alternative(replacement="spark.collections.SortField", since="4.5")]

 /**
  *  Provides the sorting information required to establish a sort on a field


Transferred from the Adobe Open Source Subversion Repository

Revision: 4044
Author:   jimurphy@adobe.com
Date:     2008-11-07T14:29:32.944581Z

Log Message:
-----------
Merged 3.x revisions 3849,3900,3904,3948,4008,4015 -> trunk

Modified Paths:
--------------
<path kind="file" action="M">/flex/sdk/trunk/build.xml</path>
<path kind="file" action="M">/flex/sdk/trunk/frameworks/libs/textLayout_core.swc</path>
<path kind="file" action="M">/flex/sdk/trunk/in/air/air_version.txt</path>
<path kind="dir" action="M">/flex/sdk/trunk</path>
<path kind="file" action="M">/flex/sdk/trunk/frameworks/projects/utilities/src/FlashComponentPlaceholder.as</path>
<path kind="file" action="M">/flex/sdk/trunk/frameworks/projects/utilities/src/FlashContainerPlaceholder.as</path>
<path kind="file" action="D">/flex/sdk/trunk/frameworks/projects/framework/src/mx/core/SandboxBridgeGroup.as</path>
<path kind="file" action="D">/flex/sdk/trunk/modules/antTasks/FlexAntTasks-license.txt</path>
<path kind="file" action="M">/flex/sdk/trunk/in/air/win/AIR Integration Kit.zip</path>
<path kind="file" action="M">/flex/sdk/trunk/in/air/mac/AIR Integration Kit.tbz2</path>
<path kind="file" action="M">/flex/sdk/trunk/frameworks/projects/framework/src/mx/managers/FocusManager.as</path>
<path kind="file" action="M">/flex/sdk/trunk/frameworks/libs/textLayout_conversion.swc</path>
<path kind="file" action="M">/flex/sdk/trunk/frameworks/libs/textLayout_edit.swc</path>
<path kind="file" action="M">/flex/sdk/trunk/frameworks/projects/airframework/src/mx/controls/FlexNativeMenu.as</path>

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1261494 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/framework/src/mx/managers/FocusManager.as
+++ frameworks/projects/framework/src/mx/managers/FocusManager.as
@@ -1592,7 +1592,8 @@
      */
     private function creationCompleteHandler(event:FlexEvent):void
     {
-        if (DisplayObject(form).visible && !activated)
+        var o:DisplayObject = DisplayObject(form);
+        if (o.parent && o.visible && !activated)
             form.systemManager.activate(form);
     }


Transferred from the Adobe Open Source Subversion Repository

Revision: 11909
Author:   rfrishbe@adobe.com
Date:     2009-11-17T21:38:09.638135Z

Log Message:
-----------
Updating OSMF to new flex4 branch.  We will eventually take a pre-built SWC from them as well, but for now we will continue building it.

With this update, some events that we dispatch change. This update also fixes several bugs for us.

I also got rid of a FIXME in VolumeBar around commitData in closeDropDown().

QE notes: -
Doc notes: -
Bugs: SDK-24192, SDK-24194, SDK-24289
Reviewer: Jason for the VolumeBar changes, Kevin for the rest
Tests run: checkintests
Is noteworthy for integration: No

Modified Paths:
--------------
222 paths were modified

git-svn-id: 7146a936b37d36e51ea0d66f8acbe0b8281bc7b7@1281195 13f79535-47bb-0310-9956-ffa450edef68

--- frameworks/projects/spark/src/spark/components/VideoPlayer.as
+++ frameworks/projects/spark/src/spark/components/VideoPlayer.as
@@ -18,7 +18,6 @@
 import flash.events.FullScreenEvent;
 import flash.events.KeyboardEvent;
 import flash.events.MouseEvent;
-import flash.events.ProgressEvent;
 import flash.events.TimerEvent;
 import flash.geom.Rectangle;
 import flash.utils.Timer;
@@ -29,11 +28,9 @@
 import mx.events.FlexEvent;
 import mx.utils.BitFlagUtil;

-import org.osmf.events.BytesDownloadedChangeEvent;
-import org.osmf.events.DurationChangeEvent;
+import org.osmf.events.LoadEvent;
 import org.osmf.events.MediaPlayerStateChangeEvent;
-import org.osmf.events.PlayheadChangeEvent;
-import org.osmf.media.MediaPlayerState;
+import org.osmf.events.TimeEvent;

 import spark.components.mediaClasses.MuteButton;
 import spark.components.mediaClasses.ScrubBar;
@@ -51,34 +48,54 @@
 //--------------------------------------

 /**
- * Dispatched when the data is received as a download operation progresses.
+ *  Dispatched when the data is received as a download operation progresses.
  *
- * @eventType flash.events.ProgressEvent
+ *  @eventType org.osmf.events.LoadEvent.BYTES_LOADED_CHANGE
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.0
+ *  @productversion OSMF 1.0
  */
-[Event(name="bytesDownloadedChange",type="org.osmf.events.BytesDownloadedChangeEvent")]
-
-/**
- * Dispatched when the MediaPlayer's state has changed.
+[Event(name="bytesLoadedChange",type="org.osmf.events.LoadEvent")]
+
+/**
+ *  Dispatched when the currentTime property of the MediaPlayer has changed.
+ *  This value is updated at the interval set by
+ *  the MediaPlayer's currentTimeUpdateInterval property.
+ *
+ *  @eventType org.osmf.events.TimeEvent.CURRENT_TIME_CHANGE
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.0
+ *  @productversion OSMF 1.0
+ **/
+[Event(name="currentTimeChange",type="org.osmf.events.TimeEvent")]
+
+/**
+ *  Dispatched when the duration property of the media has changed.
  *
- * @eventType org.osmf.events.PlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE
+ *  @eventType org.osmf.events.TimeEvent.DURATION_CHANGE
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.0
+ *  @productversion OSMF 1.0
+ */
+[Event(name="durationChange", type="org.osmf.events.TimeEvent")]
+
+/**
+ *  Dispatched when the MediaPlayer's state has changed.
+ *
+ *  @eventType org.osmf.events.MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.0
+ *  @productversion OSMF 1.0
  */
 [Event(name="mediaPlayerStateChange", type="org.osmf.events.MediaPlayerStateChangeEvent")]
-
-/**
- * Dispatched when the playhead property of the MediaPlayer has changed.
- * This value is updated at the interval set by
- * the MediaPlayer's playheadUpdateInterval property.
- *
- * @eventType org.osmf.events.PlayheadChangeEvent.PLAYHEAD_CHANGE
- **/
-[Event(name="playheadChange",type="org.osmf.events.PlayheadChangeEvent")]
-
-/**
- * Dispatched when the duration property of the media has changed.
- *
- * @eventType org.osmf.events.DurationChangeEvent.DURATION_CHANGE
- */
-[Event(name="durationChange", type="org.osmf.events.DurationChangeEvent")]

 //--------------------------------------
 //  Styles
@@ -127,7 +144,7 @@
 [SkinState("uninitialized")]

 /**
- *  Initializing State of the VideoPlayer.
+ *  Loading State of the VideoPlayer.
  *  The VideoPlayer is loading or connecting to the source.
  *
  *  @langversion 3.0
@@ -135,7 +152,7 @@
  *  @playerversion AIR 1.5
  *  @productversion Flex 4
  */
-[SkinState("initializing")]
+[SkinState("loading")]

 /**
  *  Ready State of the VideoPlayer.
@@ -214,7 +231,7 @@
 [SkinState("uninitializedAndFullScreen")]

 /**
- *  Initializing State of the VideoPlayer when
+ *  Loading State of the VideoPlayer when
  *  in full screen mode.
  *  The VideoPlayer is loading or connecting to the source.
  *
@@ -223,7 +240,7 @@
  *  @playerversion AIR 1.5
  *  @productversion Flex 4
  */
-[SkinState("initializingAndFullScreen")]
+[SkinState("loadingAndFullScreen")]

 /**
  *  Ready State of the VideoPlayer when
@@ -1210,7 +1227,7 @@
      */
     override protected function getCurrentSkinState():String
     {
-        var state:String = videoDisplay.videoPlayer.state.name;
+        var state:String = videoDisplay.videoPlayer.state;

         // now that we have our video player's current state (atleast the one we care about)
         // and that we've set the previous state to something we care about, let's figure
@@ -1232,10 +1249,10 @@
     {
         if (instance == videoDisplay)
         {
-            videoDisplay.addEventListener(PlayheadChangeEvent.PLAYHEAD_CHANGE, videoDisplay_playHeadChangeHandler);
-            videoDisplay.addEventListener(BytesDownloadedChangeEvent.BYTES_DOWNLOADED_CHANGE, videoDisplay_bytesDownloadedChangeHandler);
+            videoDisplay.addEventListener(TimeEvent.CURRENT_TIME_CHANGE, videoDisplay_currentTimeChangeHandler);
+            videoDisplay.addEventListener(LoadEvent.BYTES_LOADED_CHANGE, videoDisplay_bytesLoadedChangeHandler);
             videoDisplay.addEventListener(MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE, videoDisplay_mediaPlayerStateChangeHandler);
-            videoDisplay.addEventListener(DurationChangeEvent.DURATION_CHANGE, videoDisplay_durationChangeHandler);
+            videoDisplay.addEventListener(TimeEvent.DURATION_CHANGE, videoDisplay_durationChangeHandler);

             // just strictly for binding purposes
             videoDisplay.addEventListener("sourceChanged", dispatchEvent);
@@ -1496,10 +1513,10 @@

             videoDisplayProperties = newVideoProperties;

-            videoDisplay.removeEventListener(PlayheadChangeEvent.PLAYHEAD_CHANGE, videoDisplay_playHeadChangeHandler);
-            videoDisplay.removeEventListener(DurationChangeEvent.DURATION_CHANGE, videoDisplay_durationChangeHandler);
-            videoDisplay.removeEventListener(BytesDownloadedChangeEvent.BYTES_DOWNLOADED_CHANGE, videoDisplay_bytesDownloadedChangeHandler);
+            videoDisplay.removeEventListener(TimeEvent.CURRENT_TIME_CHANGE, videoDisplay_currentTimeChangeHandler);
+            videoDisplay.removeEventListener(LoadEvent.BYTES_LOADED_CHANGE, videoDisplay_bytesLoadedChangeHandler);
             videoDisplay.removeEventListener(MediaPlayerStateChangeEvent.MEDIA_PLAYER_STATE_CHANGE, videoDisplay_mediaPlayerStateChangeHandler);
+            videoDisplay.removeEventListener(TimeEvent.DURATION_CHANGE, videoDisplay_durationChangeHandler);

             // just strictly for binding purposes
             videoDisplay.removeEventListener("sourceChanged", dispatchEvent);
@@ -1655,9 +1672,11 @@
     protected function formatTimeValue(value:Number):String
     {
         // default format: hours:minutes:seconds
+        value = Math.round(value);
+
         var hours:uint = Math.floor(value/3600) % 24;
         var minutes:uint = Math.floor(value/60) % 60;
-        var seconds:uint = Math.round(value) % 60;
+        var seconds:uint = value % 60;

         var result:String = "";
         if (hours != 0)
@@ -1693,7 +1712,7 @@
     /**
      *  @private
      */
-    private function videoDisplay_playHeadChangeHandler(event:PlayheadChangeEvent):void
+    private function videoDisplay_currentTimeChangeHandler(event:TimeEvent):void
     {
         if (scrubBar)
             updateScrubBar();
@@ -1707,7 +1726,7 @@
     /**
      *  @private
      */
-    private function videoDisplay_bytesDownloadedChangeHandler(event:BytesDownloadedChangeEvent):void
+    private function videoDisplay_bytesLoadedChangeHandler(event:LoadEvent):void
     {
         if (scrubBar)
             updateScrubBar();
@@ -1737,7 +1756,7 @@
     /**
      *  @private
      */
-    private function videoDisplay_durationChangeHandler(event:DurationChangeEvent):void
+    private function videoDisplay_durationChangeHandler(event:TimeEvent):void
     {
         if (scrubBar)
             updateScrubBar();
@@ -1900,7 +1919,7 @@
         playerControls.visible = false;

         if (volumeBar)
-            volumeBar.closeDropDown(true);
+            volumeBar.closeDropDown();
     }

     /**


Fixed bug where opening requirements map twice in same session caused a crash

--- flexEditor/src/org/arisgames/editor/view/RequirementsEditorView.as
+++ flexEditor/src/org/arisgames/editor/view/RequirementsEditorView.as
@@ -29,6 +29,7 @@
     // Associated Data
     private var requirementObjectId:Number; //The object id to impose requirements
 	private var requirementObjectType:String; //One of the REQUIREMENTTYPES defined in constants
+	private var edMapOpened:Boolean;

     // Data For GUI
     [Bindable] public var requirements:ArrayCollection;
@@ -47,6 +48,7 @@
     public function RequirementsEditorView()
     {
         super();
+		edMapOpened = false;
         requirements = new ArrayCollection();
         reqTypes = new ArrayCollection();
         this.addEventListener(FlexEvent.CREATION_COMPLETE, handleInit);
@@ -398,7 +400,11 @@
 			//requirementsEditorMap.setPlacemarkLocation(pm.latitude, pm.longitude);
         }

-        this.parent.addChild(requirementsEditorMap);
+		if(!edMapOpened){
+        	this.parent.addChild(requirementsEditorMap);
+			edMapOpened = true;
+		}
+
         // Need to validate the display so that entire component is rendered
         requirementsEditorMap.validateNow();