1package com.yahoo.astra.fl.charts.series
2{
3	import com.yahoo.astra.fl.charts.ChartUtil;
4	import com.yahoo.astra.fl.charts.IChart;
5	import com.yahoo.astra.fl.charts.axes.IAxis;
6	import com.yahoo.astra.fl.charts.axes.IOriginAxis;
7	import com.yahoo.astra.fl.charts.axes.IClusteringAxis;
8
9	/**
10	 * A column series type that stacks.
11	 *
12	 * @author Josh Tynjala
13	 */
14	public class StackedColumnSeries extends ColumnSeries implements IStackedSeries
15	{
16
17	//--------------------------------------
18	//  Constructor
19	//--------------------------------------
20
21		/**
22		 * Constructor.
23		 */
24		public function StackedColumnSeries(data:Object = null)
25		{
26			super(data);
27		}
28
29	//--------------------------------------
30	//  Protected Methods
31	//--------------------------------------
32
33		/**
34		 * @private
35		 * @inheritDoc
36		 */
37		override protected function calculateXOffset(valueAxis:IOriginAxis, otherAxis:IAxis, markerSizes:Array, totalMarkerSize:Number, allSeriesOfType:Array):Number
38		{
39			if(!ChartUtil.isStackingAllowed(valueAxis, this))
40			{
41				return super.calculateXOffset(valueAxis, otherAxis, markerSizes, totalMarkerSize, allSeriesOfType);
42			}
43
44			var seriesIndex:int = allSeriesOfType.indexOf(this);
45			return -(markerSizes[seriesIndex] as Number) / 2;
46		}
47
48		/**
49		 * @private
50		 * @inheritDoc
51		 */
52		override protected function calculateTotalMarkerSize(axis:IAxis, sizes:Array):Number
53		{
54			if(!ChartUtil.isStackingAllowed(axis, this))
55			{
56				return super.calculateTotalMarkerSize(axis, sizes);
57			}
58
59			var totalMarkerSize:Number = 0;
60			var allSeriesOfType:Array = ChartUtil.findSeriesOfType(this, this.chart as IChart);
61			var seriesCount:int = allSeriesOfType.length;
62			for(var i:int = 0; i < seriesCount; i++)
63			{
64				var series:ColumnSeries = ColumnSeries(allSeriesOfType[i]);
65				var markerSize:Number = this.calculateMarkerSize(series, axis);
66				sizes.push(markerSize);
67				totalMarkerSize = Math.max(totalMarkerSize, markerSize);
68			}
69			return totalMarkerSize;
70		}
71
72		/**
73		 * @private
74		 * @inheritDoc
75		 */
76		override protected function calculateMaximumAllowedMarkerSize(axis:IAxis):Number
77		{
78			if(axis is IClusteringAxis)
79			{
80				var allSeriesOfType:Array = ChartUtil.findSeriesOfType(this, this.chart as IChart);
81				return (this.width / IClusteringAxis(axis).clusterCount);
82			}
83			return Number.POSITIVE_INFINITY;
84		}
85
86		/**
87		 * @private
88		 * Determines the origin of the column. Either the axis origin or the
89		 * stacked value.
90		 */
91		override protected function calculateOriginValue(index:int, axis:IOriginAxis, allSeriesOfType:Array):Object
92		{
93			if(!ChartUtil.isStackingAllowed(axis, this))
94			{
95				return super.calculateOriginValue(index, axis, allSeriesOfType);
96			}
97
98			var seriesIndex:int = allSeriesOfType.indexOf(this);
99			var originValue:Object = axis.origin;
100			if(seriesIndex > 0)
101			{
102				var previousSeries:StackedColumnSeries = StackedColumnSeries(allSeriesOfType[seriesIndex - 1]);
103
104				var isPositive:Boolean = IChart(this.chart).itemToAxisValue(this, index, axis) >= 0;
105
106				for(var i:int = seriesIndex - 1; i > -1; i--)
107				{
108					if(isPositive)
109					{
110						if(IChart(this.chart).itemToAxisValue(StackedColumnSeries(allSeriesOfType[i]), index, axis) > 0)
111						{
112							originValue = IChart(this.chart).itemToAxisValue(StackedColumnSeries(allSeriesOfType[i]), index, axis);
113							break;
114						}
115					}
116					else
117					{
118						if(IChart(this.chart).itemToAxisValue(StackedColumnSeries(allSeriesOfType[i]), index, axis) < 0)
119						{
120							originValue = IChart(this.chart).itemToAxisValue(StackedColumnSeries(allSeriesOfType[i]), index, axis);
121							break;
122						}
123					}
124				}
125			}
126			return originValue;
127		}
128	}
129}