File: charts/js/OHLCSeries.js
/**
* Provides functionality for creating a ohlc series.
*
* @module charts
* @submodule series-ohlc
*/
/**
* The OHLCSeries class renders lines representing the open, high, low and close
* values for a chart.
*
* @class OHLCSeries
* @extends RangeSeries
* @constructor
* @param {Object} config (optional) Configuration parameters.
* @submodule series-ohlc
*/
function OHLCSeries()
{
OHLCSeries.superclass.constructor.apply(this, arguments);
}
OHLCSeries.NAME = "ohlcSeries";
OHLCSeries.ATTRS = {
/**
* Read-only attribute indicating the type of series.
*
* @attribute type
* @type String
* @readOnly
* @default ohlc
*/
type: {
value: "ohlc"
},
/**
* 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);
}
this.set("upmarker", val.addShape({
type: "path"
}));
this.set("downmarker", val.addShape({
type: "path"
}));
return val;
}
},
upmarker: {},
downmarker: {}
/**
* Style properties used for drawing markers. This attribute is inherited from `RangeSeries`. Below are the default values:
* <dl>
* <dt>upmarker</dt><dd>Properties for a marker representing a period that closes higher than it opens.
* <dl>
* <dt>fill</dt><dd>A hash containing the following values:
* <dl>
* <dt>color</dt><dd>Color of the fill. The default value is "#00aa00".</dd>
* </dd>
* <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker fill. The default value is 1.</dd>
* </dl>
* </dd>
* <dt>border</dt><dd>A hash containing the following values:
* <dl>
* <dt>color</dt><dd>Color of the border. The default value is "#000000".</dd>
* <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker border. The default value is 1.</dd>
* <dt>weight</dt><dd>Number indicating the width of the border. The default value is 0.</dd>
* </dl>
* </dd>
* </dl>
* </dd>
* <dt>downmarker</dt><dd>Properties for a marker representing a period that opens higher than it closes.
* <dl>
* <dt>fill</dt><dd>A hash containing the following values:
* <dl>
* <dt>color</dt><dd>Color of the fill. The default value is "#aa0000".</dd>
* </dd>
* <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker fill. The default value is 1.</dd>
* </dl>
* </dd>
* <dt>border</dt><dd>A hash containing the following values:
* <dl>
* <dt>color</dt><dd>Color of the border. The default value is "#000000".</dd>
* <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker border. The default value is 1.</dd>
* <dt>weight</dt><dd>Number indicating the width of the border. The default value is 0.</dd>
* </dl>
* </dd>
* </dl>
* </dd>
* </dl>
*
* @attribute styles
* @type Object
*/
};
Y.extend(OHLCSeries, Y.RangeSeries, {
/**
* Draws markers for an OHLC series.
*
* @method
* @param {Array} xcoords The xcoordinates to be plotted.
* @param {Array} opencoords The coordinates representing the open values.
* @param {Array} highcoords The coordinates representing the high values.
* @param {Array} lowcoords The coordinates representing the low values.
* @param {Array} closecoords The coordinates representing the close values.
* @param {Number} len The number of x coordinates to plot.
* @param {Number} width The width of each ohlc marker.
* @param {Number} halfwidth Half the width of each ohlc marker.
* @param {Object} styles The styles for the series.
* @private
*/
_drawMarkers: function(xcoords, opencoords, highcoords, lowcoords, closecoords, len, width, halfwidth, styles)
{
var upmarker = this.get("upmarker"),
downmarker = this.get("downmarker"),
opencoord,
highcoord,
lowcoord,
closecoord,
left,
right,
leftPadding = styles.padding.left,
marker,
up,
cx,
i,
height;
upmarker.set(styles.upmarker);
downmarker.set(styles.downmarker);
upmarker.clear();
downmarker.clear();
for(i = 0; i < len; i = i + 1)
{
cx = xcoords[i] + leftPadding;
left = cx - halfwidth;
right = cx + halfwidth;
opencoord = opencoords[i];
highcoord = highcoords[i];
lowcoord = lowcoords[i];
closecoord = closecoords[i];
up = opencoord > closecoord;
height = lowcoord - highcoord;
marker = up ? upmarker : downmarker;
marker.moveTo(left, opencoord);
marker.lineTo(cx, opencoord);
marker.moveTo(cx, highcoord);
marker.lineTo(cx, lowcoord);
marker.moveTo(cx, closecoord);
marker.lineTo(right, closecoord);
}
upmarker.end();
downmarker.end();
},
/**
* Toggles visibility
*
* @method _toggleVisible
* @param {Boolean} visible indicates visibilitye
* @private
*/
_toggleVisible: function(visible)
{
this.get("upmarker").set("visible", visible);
this.get("downmarker").set("visible", visible);
},
/**
* Destructor implementation for the CartesianSeries class. Calls destroy on all Graphic instances.
*
* @method destructor
* @protected
*/
destructor: function()
{
var upmarker = this.get("upmarker"),
downmarker = this.get("downmarker");
if(upmarker)
{
upmarker.destroy();
}
if(downmarker)
{
downmarker.destroy();
}
},
/**
* Gets the default value for the `styles` attribute. Overrides
* base implementation.
*
* @method _getDefaultStyles
* @return Object
* @private
*/
_getDefaultStyles: function()
{
var styles = {
upmarker: {
stroke: {
color: "#00aa00",
alpha: 1,
weight: 1
}
},
downmarker: {
stroke: {
color: "#aa0000",
alpha: 1,
weight: 1
}
}
};
return this._mergeStyles(styles, OHLCSeries.superclass._getDefaultStyles());
}
});
Y.OHLCSeries = OHLCSeries;