Show:
                            /**
                             * Provides functionality for drawing fills in a series.
                             *
                             * @module charts
                             * @submodule series-fill-util
                             */
                            var Y_Lang = Y.Lang;
                            
                            /**
                             * Utility class used for drawing area fills.
                             *
                             * @class Fills
                             * @constructor
                             * @submodule series-fill-util
                             */
                            function Fills() {}
                            
                            Fills.ATTRS = {
                                area: {
                                    getter: function()
                                    {
                                        return this._defaults || this._getAreaDefaults();
                                    },
                            
                                    setter: function(val)
                                    {
                                        var defaults = this._defaults || this._getAreaDefaults();
                                        this._defaults = Y.merge(defaults, val);
                                    }
                                }
                            };
                            
                            Fills.prototype = {
                                /**
                                 * Returns a path shape used for drawing fills.
                                 *
                                 * @method _getPath
                                 * @return Path
                                 * @private
                                 */
                                _getPath: function()
                                {
                                    var path = this._path;
                                    if(!path)
                                    {
                                        path = this.get("graphic").addShape({type:"path"});
                                        this._path = path;
                                    }
                                    return path;
                                },
                            
                                /**
                                 * Toggles visibility
                                 *
                                 * @method _toggleVisible
                                 * @param {Boolean} visible indicates visibilitye
                                 * @private
                                 */
                                _toggleVisible: function(visible)
                                {
                                    if(this._path)
                                    {
                                        this._path.set("visible", visible);
                                    }
                                },
                            
                                /**
                                 * Draws fill
                                 *
                                 * @method drawFill
                                 * @param {Array} xcoords The x-coordinates for the series.
                                 * @param {Array} ycoords The y-coordinates for the series.
                                 * @protected
                                 */
                                drawFill: function(xcoords, ycoords)
                                {
                                    if(xcoords.length < 1)
                                    {
                                        return;
                                    }
                                    var isNumber = Y_Lang.isNumber,
                                        len = xcoords.length,
                                        firstX = xcoords[0],
                                        firstY = ycoords[0],
                                        lastValidX = firstX,
                                        lastValidY = firstY,
                                        nextX,
                                        nextY,
                                        pointValid,
                                        noPointsRendered = true,
                                        i = 0,
                                        styles = this.get("styles").area,
                                        path = this._getPath(),
                                        color = styles.color || this._getDefaultColor(this.get("graphOrder"), "slice");
                                    path.clear();
                                    path.set("fill", {
                                        color: color,
                                        opacity: styles.alpha
                                    });
                                    path.set("stroke", {weight: 0});
                                    for(; i < len; i = ++i)
                                    {
                                        nextX = xcoords[i];
                                        nextY = ycoords[i];
                                        pointValid = isNumber(nextX) && isNumber(nextY);
                                        if(!pointValid)
                                        {
                                            continue;
                                        }
                                        if(noPointsRendered)
                                        {
                                            this._firstValidX = nextX;
                                            this._firstValidY = nextY;
                                            noPointsRendered = false;
                                            path.moveTo(nextX, nextY);
                                        }
                                        else
                                        {
                                            path.lineTo(nextX, nextY);
                                        }
                                        lastValidX = nextX;
                                        lastValidY = nextY;
                                    }
                                    this._lastValidX = lastValidX;
                                    this._lastValidY = lastValidY;
                                    path.end();
                                },
                            
                                /**
                                 * Draws a fill for a spline
                                 *
                                 * @method drawAreaSpline
                                 * @protected
                                 */
                                drawAreaSpline: function()
                                {
                                    if(this.get("xcoords").length < 1)
                                    {
                                        return;
                                    }
                                    var xcoords = this.get("xcoords"),
                                        ycoords = this.get("ycoords"),
                                        curvecoords = this.getCurveControlPoints(xcoords, ycoords),
                                        len = curvecoords.length,
                                        cx1,
                                        cx2,
                                        cy1,
                                        cy2,
                                        x,
                                        y,
                                        i = 0,
                                        firstX = xcoords[0],
                                        firstY = ycoords[0],
                                        styles = this.get("styles").area,
                                        path = this._getPath(),
                                        color = styles.color || this._getDefaultColor(this.get("graphOrder"), "slice");
                                    path.set("fill", {
                                        color: color,
                                        opacity: styles.alpha
                                    });
                                    path.set("stroke", {weight: 0});
                                    path.moveTo(firstX, firstY);
                                    for(; i < len; i = ++i)
                                    {
                                        x = curvecoords[i].endx;
                                        y = curvecoords[i].endy;
                                        cx1 = curvecoords[i].ctrlx1;
                                        cx2 = curvecoords[i].ctrlx2;
                                        cy1 = curvecoords[i].ctrly1;
                                        cy2 = curvecoords[i].ctrly2;
                                        path.curveTo(cx1, cy1, cx2, cy2, x, y);
                                    }
                                    if(this.get("direction") === "vertical")
                                    {
                                        path.lineTo(this._leftOrigin, y);
                                        path.lineTo(this._leftOrigin, firstY);
                                    }
                                    else
                                    {
                                        path.lineTo(x, this._bottomOrigin);
                                        path.lineTo(firstX, this._bottomOrigin);
                                    }
                                    path.lineTo(firstX, firstY);
                                    path.end();
                                },
                            
                                /**
                                 * Draws a a stacked area spline
                                 *
                                 * @method drawStackedAreaSpline
                                 * @protected
                                 */
                                drawStackedAreaSpline: function()
                                {
                                    if(this.get("xcoords").length < 1)
                                    {
                                        return;
                                    }
                                    var xcoords = this.get("xcoords"),
                                        ycoords = this.get("ycoords"),
                                        curvecoords,
                                        order = this.get("order"),
                                        seriesCollection = this.get("seriesTypeCollection"),
                                        prevXCoords,
                                        prevYCoords,
                                        len,
                                        cx1,
                                        cx2,
                                        cy1,
                                        cy2,
                                        x,
                                        y,
                                        i = 0,
                                        firstX,
                                        firstY,
                                        styles = this.get("styles").area,
                                        path = this._getPath(),
                                        color = styles.color || this._getDefaultColor(this.get("graphOrder"), "slice");
                                    firstX = xcoords[0];
                                    firstY = ycoords[0];
                                    curvecoords = this.getCurveControlPoints(xcoords, ycoords);
                                    len = curvecoords.length;
                                    path.set("fill", {
                                        color: color,
                                        opacity: styles.alpha
                                    });
                                    path.set("stroke", {weight: 0});
                                    path.moveTo(firstX, firstY);
                                    for(; i < len; i = ++i)
                                    {
                                        x = curvecoords[i].endx;
                                        y = curvecoords[i].endy;
                                        cx1 = curvecoords[i].ctrlx1;
                                        cx2 = curvecoords[i].ctrlx2;
                                        cy1 = curvecoords[i].ctrly1;
                                        cy2 = curvecoords[i].ctrly2;
                                        path.curveTo(cx1, cy1, cx2, cy2, x, y);
                                    }
                                    if(order > 0)
                                    {
                                        prevXCoords = seriesCollection[order - 1].get("xcoords").concat().reverse();
                                        prevYCoords = seriesCollection[order - 1].get("ycoords").concat().reverse();
                                        curvecoords = this.getCurveControlPoints(prevXCoords, prevYCoords);
                                        i = 0;
                                        len = curvecoords.length;
                                        path.lineTo(prevXCoords[0], prevYCoords[0]);
                                        for(; i < len; i = ++i)
                                        {
                                            x = curvecoords[i].endx;
                                            y = curvecoords[i].endy;
                                            cx1 = curvecoords[i].ctrlx1;
                                            cx2 = curvecoords[i].ctrlx2;
                                            cy1 = curvecoords[i].ctrly1;
                                            cy2 = curvecoords[i].ctrly2;
                                            path.curveTo(cx1, cy1, cx2, cy2, x, y);
                                        }
                                    }
                                    else
                                    {
                                        if(this.get("direction") === "vertical")
                                        {
                                            path.lineTo(this._leftOrigin, ycoords[ycoords.length-1]);
                                            path.lineTo(this._leftOrigin, firstY);
                                        }
                                        else
                                        {
                                            path.lineTo(xcoords[xcoords.length-1], this._bottomOrigin);
                                            path.lineTo(firstX, this._bottomOrigin);
                                        }
                            
                                    }
                                    path.lineTo(firstX, firstY);
                                    path.end();
                                },
                            
                                /**
                                 * Storage for default area styles.
                                 *
                                 * @property _defaults
                                 * @type Object
                                 * @private
                                 */
                                _defaults: null,
                            
                                /**
                                 * Concatenates coordinate array with correct coordinates for closing an area fill.
                                 *
                                 * @method _getClosingPoints
                                 * @return Array
                                 * @protected
                                 */
                                _getClosingPoints: function()
                                {
                                    var xcoords = this.get("xcoords").concat(),
                                        ycoords = this.get("ycoords").concat(),
                                        firstValidIndex,
                                        lastValidIndex;
                                    if(this.get("direction") === "vertical")
                                    {
                                        lastValidIndex = this._getLastValidIndex(xcoords);
                                        firstValidIndex = this._getFirstValidIndex(xcoords);
                                        ycoords.push(ycoords[lastValidIndex]);
                                        ycoords.push(ycoords[firstValidIndex]);
                                        xcoords.push(this._leftOrigin);
                                        xcoords.push(this._leftOrigin);
                                    }
                                    else
                                    {
                                        lastValidIndex = this._getLastValidIndex(ycoords);
                                        firstValidIndex = this._getFirstValidIndex(ycoords);
                                        xcoords.push(xcoords[lastValidIndex]);
                                        xcoords.push(xcoords[firstValidIndex]);
                                        ycoords.push(this._bottomOrigin);
                                        ycoords.push(this._bottomOrigin);
                                    }
                                    xcoords.push(xcoords[0]);
                                    ycoords.push(ycoords[0]);
                                    return [xcoords, ycoords];
                                },
                            
                                /**
                                 * Returns the order of the series closest to the current series that has a valid value for the current index.
                                 *
                                 * @method _getHighestValidOrder
                                 * @param {Array} seriesCollection Array of series of a given type.
                                 * @param {Number} index Index of the series item.
                                 * @param {Number} order Index of the the series in the seriesCollection
                                 * @param {String} direction Indicates the direction of the series
                                 * @return Number
                                 * @private
                                 */
                                _getHighestValidOrder: function(seriesCollection, index, order, direction)
                                {
                                    var coords = direction === "vertical" ? "stackedXCoords" : "stackedYCoords",
                                        coord;
                                    while(isNaN(coord) && order > -1)
                                    {
                                      order = order - 1;
                                      if(order > -1)
                                      {
                                        coord = seriesCollection[order].get(coords)[index];
                                      }
                                    }
                                    return order;
                                },
                            
                                /**
                                 * Returns an array containing the x and y coordinates for a given series and index.
                                 *
                                 * @method _getCoordsByOrderAndIndex
                                 * @param {Array} seriesCollection Array of series of a given type.
                                 * @param {Number} index Index of the series item.
                                 * @param {Number} order Index of the the series in the seriesCollection
                                 * @param {String} direction Indicates the direction of the series
                                 * @return Array
                                 * @private
                                 */
                                _getCoordsByOrderAndIndex: function(seriesCollection, index, order, direction)
                                {
                                    var xcoord,
                                        ycoord;
                                    if(direction === "vertical")
                                    {
                                        xcoord = order < 0 ? this._leftOrigin : seriesCollection[order].get("stackedXCoords")[index];
                                        ycoord = this.get("stackedYCoords")[index];
                                    }
                                    else
                                    {
                                        xcoord = this.get("stackedXCoords")[index];
                                        ycoord = order < 0 ? this._bottomOrigin : seriesCollection[order].get("stackedYCoords")[index];
                                    }
                                    return [xcoord, ycoord];
                                },
                            
                                /**
                                 * Concatenates coordinate array with the correct coordinates for closing an area stack.
                                 *
                                 * @method _getStackedClosingPoints
                                 * @return Array
                                 * @protected
                                 */
                                _getStackedClosingPoints: function()
                                {
                                    var order = this.get("order"),
                                        direction = this.get("direction"),
                                        seriesCollection = this.get("seriesTypeCollection"),
                                        firstValidIndex,
                                        lastValidIndex,
                                        xcoords = this.get("stackedXCoords"),
                                        ycoords = this.get("stackedYCoords"),
                                        limit,
                                        previousSeries,
                                        previousSeriesFirstValidIndex,
                                        previousSeriesLastValidIndex,
                                        previousXCoords,
                                        previousYCoords,
                                        coords,
                                        closingXCoords,
                                        closingYCoords,
                                        currentIndex,
                                        highestValidOrder,
                                        oldOrder;
                                    if(order < 1)
                                    {
                                      return this._getClosingPoints();
                                    }
                            
                                    previousSeries = seriesCollection[order - 1];
                                    previousXCoords = previousSeries.get("stackedXCoords").concat();
                                    previousYCoords = previousSeries.get("stackedYCoords").concat();
                                    if(direction === "vertical")
                                    {
                                        firstValidIndex = this._getFirstValidIndex(xcoords);
                                        lastValidIndex = this._getLastValidIndex(xcoords);
                                        previousSeriesFirstValidIndex = previousSeries._getFirstValidIndex(previousXCoords);
                                        previousSeriesLastValidIndex = previousSeries._getLastValidIndex(previousXCoords);
                                    }
                                    else
                                    {
                                        firstValidIndex = this._getFirstValidIndex(ycoords);
                                        lastValidIndex = this._getLastValidIndex(ycoords);
                                        previousSeriesFirstValidIndex = previousSeries._getFirstValidIndex(previousYCoords);
                                        previousSeriesLastValidIndex = previousSeries._getLastValidIndex(previousYCoords);
                                    }
                                    if(previousSeriesLastValidIndex >= firstValidIndex && previousSeriesFirstValidIndex <= lastValidIndex)
                                    {
                                        previousSeriesFirstValidIndex = Math.max(firstValidIndex, previousSeriesFirstValidIndex);
                                        previousSeriesLastValidIndex = Math.min(lastValidIndex, previousSeriesLastValidIndex);
                                        previousXCoords = previousXCoords.slice(previousSeriesFirstValidIndex, previousSeriesLastValidIndex + 1);
                                        previousYCoords = previousYCoords.slice(previousSeriesFirstValidIndex, previousSeriesLastValidIndex + 1);
                                        limit = previousSeriesFirstValidIndex;
                                    }
                                    else
                                    {
                                        limit = lastValidIndex;
                                    }
                            
                                    closingXCoords = [xcoords[firstValidIndex]];
                                    closingYCoords = [ycoords[firstValidIndex]];
                                    currentIndex = firstValidIndex;
                                    while((isNaN(highestValidOrder) || highestValidOrder < order - 1) && currentIndex <= limit)
                                    {
                                        oldOrder = highestValidOrder;
                                        highestValidOrder = this._getHighestValidOrder(seriesCollection, currentIndex, order, direction);
                                        if(!isNaN(oldOrder) && highestValidOrder > oldOrder)
                                        {
                                            coords = this._getCoordsByOrderAndIndex(seriesCollection, currentIndex, oldOrder, direction);
                                            closingXCoords.push(coords[0]);
                                            closingYCoords.push(coords[1]);
                                        }
                                        coords = this._getCoordsByOrderAndIndex(seriesCollection, currentIndex, highestValidOrder, direction);
                                        closingXCoords.push(coords[0]);
                                        closingYCoords.push(coords[1]);
                                        currentIndex = currentIndex + 1;
                                    }
                                    if(previousXCoords &&
                                        previousXCoords.length > 0 &&
                                        previousSeriesLastValidIndex > firstValidIndex &&
                                        previousSeriesFirstValidIndex < lastValidIndex)
                                    {
                                        closingXCoords = closingXCoords.concat(previousXCoords);
                                        closingYCoords = closingYCoords.concat(previousYCoords);
                                        highestValidOrder = order -1;
                                    }
                                    currentIndex = Math.max(firstValidIndex, previousSeriesLastValidIndex);
                                    order = order - 1;
                                    highestValidOrder = NaN;
                                    while(currentIndex <= lastValidIndex)
                                    {
                                        oldOrder = highestValidOrder;
                                        highestValidOrder = this._getHighestValidOrder(seriesCollection, currentIndex, order, direction);
                                        if(!isNaN(oldOrder))
                                        {
                                            if(highestValidOrder > oldOrder)
                                            {
                                                coords = this._getCoordsByOrderAndIndex(seriesCollection, currentIndex, oldOrder, direction);
                                                closingXCoords.push(coords[0]);
                                                closingYCoords.push(coords[1]);
                                            }
                                            else if(highestValidOrder < oldOrder)
                                            {
                                                coords = this._getCoordsByOrderAndIndex(seriesCollection, currentIndex - 1, highestValidOrder, direction);
                                                closingXCoords.push(coords[0]);
                                                closingYCoords.push(coords[1]);
                                            }
                                        }
                                        coords = this._getCoordsByOrderAndIndex(seriesCollection, currentIndex, highestValidOrder, direction);
                                        closingXCoords.push(coords[0]);
                                        closingYCoords.push(coords[1]);
                                        currentIndex = currentIndex + 1;
                                    }
                            
                                    closingXCoords.reverse();
                                    closingYCoords.reverse();
                                    return [xcoords.concat(closingXCoords), ycoords.concat(closingYCoords)];
                                },
                            
                                /**
                                 * Returns default values for area styles.
                                 *
                                 * @method _getAreaDefaults
                                 * @return Object
                                 * @private
                                 */
                                _getAreaDefaults: function()
                                {
                                    return {
                                    };
                                }
                            };
                            Y.augment(Fills, Y.Attribute);
                            Y.Fills = Fills;