/**
* Provides functionality for creating a range series.
*
* @module charts
* @submodule series-range
*/
/**
* An abstract class for creating range series instances.
* RangeSeries is used by the following classes:
* <ul>
* <li>{{#crossLink "CandlestickSeries"}}{{/crossLink}}</li>
* <li>{{#crossLink "OHLCSeries"}}{{/crossLink}}</li>
* </ul>
*
* @class RangeSeries
* @extends CartesianSeries
* @constructor
* @param {Object} config (optional) Configuration parameters.
* @submodule series-range
*/
function RangeSeries()
{
RangeSeries.superclass.constructor.apply(this, arguments);
}
RangeSeries.NAME = "rangeSeries";
RangeSeries.ATTRS = {
/**
* Read-only attribute indicating the type of series.
*
* @attribute type
* @type String
* @default range
*/
type: {
value: "range"
},
/**
* Values to be used for open, high, low and close keys.
*
* @attribute ohlc
* @type Object
*/
ohlckeys: {
valueFn: function() {
return {
open: "open",
high: "high",
low: "low",
close: "close"
};
}
}
};
Y.extend(RangeSeries, Y.CartesianSeries, {
/**
* Returns the width for each marker base on the width of the series
* and the length of the dataProvider.
*
* @method calculateMarkerWidth
* @param {Number} width The width, in pixels of the series.
* @param {Number} count The length of the datProvider.
* @return Number
* @private
*/
_calculateMarkerWidth: function(width, count, spacing)
{
var val = 0;
while(val < 3 && spacing > -1)
{
spacing = spacing - 1;
val = Math.round(width/count - spacing);
if(val % 2 === 0) {
val = val - 1;
}
}
return Math.max(1, val);
},
/**
* Draws the series.
*
* @method drawSeries
* @protected
*/
drawSeries: function()
{
var xcoords = this.get("xcoords"),
ycoords = this.get("ycoords"),
styles = this.get("styles"),
padding = styles.padding,
len = xcoords.length,
dataWidth = this.get("width") - (padding.left + padding.right),
keys = this.get("ohlckeys"),
opencoords = ycoords[keys.open],
highcoords = ycoords[keys.high],
lowcoords = ycoords[keys.low],
closecoords = ycoords[keys.close],
width = this._calculateMarkerWidth(dataWidth, len, styles.spacing),
halfwidth = width/2;
this._drawMarkers(xcoords, opencoords, highcoords, lowcoords, closecoords, len, width, halfwidth, styles);
},
/**
* Gets the default value for the `styles` attribute. Overrides
* base implementation.
*
* @method _getDefaultStyles
* @return Object
* @private
*/
_getDefaultStyles: function()
{
var styles = {
spacing: 3
};
return this._mergeStyles(styles, RangeSeries.superclass._getDefaultStyles());
}
});
Y.RangeSeries = RangeSeries;