/**
* Provides functionality for creating a chart series.
*
* @module charts
* @submodule series-base
*/
/**
* An abstract class for creating series instances.
* SeriesBase is used by the following classes:
* <ul>
* <li>{{#crossLink "CartesianSeries"}}{{/crossLink}}</li>
* <li>{{#crossLink "PieSeries"}}{{/crossLink}}</li>
* </ul>
*
* @class SeriesBase
* @extends Base
* @uses Renderer
* @constructor
* @param {Object} config (optional) Configuration parameters.
* @submodule series-base
*/
Y.SeriesBase = Y.Base.create("seriesBase", Y.Base, [Y.Renderer], {
/**
* @method render
* @private
*/
render: function()
{
this._setCanvas();
this.addListeners();
this.validate();
},
/**
* Creates a `Graphic` instance.
*
* @method _setCanvas
* @protected
*/
_setCanvas: function()
{
var graph = this.get("graph"),
graphic = graph.get("graphic");
this.set("graphic", graphic);
},
/**
* Returns a reference to the parent container to which all chart elements are contained.
* When the series is bound to a `Chart` instance, the `Chart` instance is the reference.
* If nothing is set as the `chart` attribute, the `_getChart` method will return a reference
* to the `graphic` attribute.
*
* @method _getChart
* @return {Object}
* @private
*/
_getChart:function() {
var chart,
graph = this.get("graph");
if(graph)
{
chart = graph.get("chart");
}
if(!chart)
{
chart = this.get("graphic");
}
return chart;
},
/**
* Returns the sum of all values for the series.
*
* @method getTotalValues
* @return Number
*/
getTotalValues: function()
{
var valueCoord = this.get("direction") === "vertical" ? "x" : "y",
total = this.get(valueCoord + "Axis").getTotalByKey(this.get(valueCoord + "Key"));
return total;
},
/**
* Gets the default value for the `styles` attribute. Overrides
* base implementation.
*
* @method _getDefaultStyles
* @return Object
* @protected
*/
_getDefaultStyles: function()
{
return {padding:{
top: 0,
left: 0,
right: 0,
bottom: 0
}};
},
/**
* Shows/hides contents of the series.
*
* @method _handleVisibleChange
* @param {Object} e Event object.
* @protected
*/
_handleVisibleChange: function()
{
this._toggleVisible(this.get("visible"));
},
/**
* Destructor implementation for the CartesianSeries class. Calls destroy on all Graphic instances.
*
* @method destructor
* @protected
*/
destructor: function()
{
var marker,
markers = this.get("markers");
if(this.get("rendered"))
{
if(this._stylesChangeHandle)
{
this._stylesChangeHandle.detach();
}
if(this._widthChangeHandle)
{
this._widthChangeHandle.detach();
}
if(this._heightChangeHandle)
{
this._heightChangeHandle.detach();
}
if(this._visibleChangeHandle)
{
this._visibleChangeHandle.detach();
}
}
while(markers && markers.length > 0)
{
marker = markers.shift();
if(marker && marker instanceof Y.Shape)
{
marker.destroy();
}
}
if(this._path)
{
this._path.destroy();
this._path = null;
}
if(this._lineGraphic)
{
this._lineGraphic.destroy();
this._lineGraphic = null;
}
if(this._groupMarker)
{
this._groupMarker.destroy();
this._groupMarker = null;
}
},
/**
* Collection of default colors used for lines in a series when not specified by user.
*
* @property _defaultLineColors
* @type Array
* @protected
*/
_defaultLineColors:[
"#426ab3",
"#d09b2c",
"#000000",
"#b82837",
"#b384b5",
"#ff7200",
"#779de3",
"#cbc8ba",
"#7ed7a6",
"#007a6c"
],
/**
* Collection of default colors used for marker fills in a series when not specified by user.
*
* @property _defaultFillColors
* @type Array
* @protected
*/
_defaultFillColors:[
"#6084d0",
"#eeb647",
"#6c6b5f",
"#d6484f",
"#ce9ed1",
"#ff9f3b",
"#93b7ff",
"#e0ddd0",
"#94ecba",
"#309687"
],
/**
* Collection of default colors used for marker borders in a series when not specified by user.
*
* @property _defaultBorderColors
* @type Array
* @protected
*/
_defaultBorderColors:[
"#205096",
"#b38206",
"#000000",
"#94001e",
"#9d6fa0",
"#e55b00",
"#5e85c9",
"#adab9e",
"#6ac291",
"#006457"
],
/**
* Collection of default colors used for area fills, histogram fills and pie fills in a series when not specified by user.
*
* @property _defaultSliceColors
* @type Array
* @protected
*/
_defaultSliceColors: [
"#66007f",
"#a86f41",
"#295454",
"#996ab2",
"#e8cdb7",
"#90bdbd",
"#000000",
"#c3b8ca",
"#968373",
"#678585"
],
/**
* Parses a color based on a series order and type.
*
* @method _getDefaultColor
* @param {Number} index Index indicating the series order.
* @param {String} type Indicates which type of object needs the color.
* @return String
* @protected
*/
_getDefaultColor: function(index, type)
{
var colors = {
line: this._defaultLineColors,
fill: this._defaultFillColors,
border: this._defaultBorderColors,
slice: this._defaultSliceColors
},
col = colors[type] || colors.fill,
l = col.length;
index = index || 0;
if(index >= l)
{
index = index % l;
}
type = type || "fill";
return colors[type][index];
}
}, {
ATTRS: {
/*
* Returns the width of the parent graph
*
* @attribute width
* @type Number
*/
width: {
readOnly: true,
getter: function()
{
return this.get("graphic").get("width");
}
},
/**
* Returns the height of the parent graph
*
* @attribute height
* @type Number
*/
height: {
readOnly: true,
getter: function()
{
return this.get("graphic").get("height");
}
},
/**
* The graphic in which drawings will be rendered.
*
* @attribute graphic
* @type Graphic
*/
graphic: {
lazyAdd: false,
setter: function(val) {
//woraround for Attribute order of operations bug
if(!this.get("rendered")) {
this.set("rendered", true);
}
return val;
}
},
/**
* Reference to the `Chart` application. If no `Chart` application is present,
* a reference to the `Graphic` instance that the series is drawn into will be returned.
*
* @attribute chart
* @type ChartBase
*/
chart: {
getter: function()
{
var chart,
graph = this.get("graph");
if(graph)
{
chart = graph.get("chart");
}
return chart;
}
},
/**
* Reference to the `Graph` in which the series is drawn into.
*
* @attribute graph
* @type Graph
*/
graph: {},
/**
* Indicates whether the Series has been through its initial set up.
*
* @attribute rendered
* @type Boolean
*/
rendered: {
value: false
},
/**
* Indicates whether to show the series
*
* @attribute visible
* @type Boolean
* @default true
*/
visible: {
value: true
},
/**
* Indicates whether or not markers for a series will be grouped and rendered in a single complex shape instance.
*
* @attribute groupMarkers
* @type Boolean
*/
groupMarkers: {
getter: function()
{
var graph,
groupMarkers = this._groupMarkers;
if(!groupMarkers) {
graph = this.get("graph");
if(graph)
{
groupMarkers = graph.get("groupMarkers");
}
}
return groupMarkers;
},
setter: function(val)
{
this._groupMarkers = val;
return val;
}
}
}
});