/* Copyright (c) 2011, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.html version: 2.9.0 */ /** * The Charts widget provides a Flash control for displaying data * graphically by series across A-grade browsers with Flash Player installed. * * @module charts * @requires yahoo, dom, event, datasource * @title Charts Widget */ /****************************************************************************/ /****************************************************************************/ /****************************************************************************/ /** * Chart class for the YUI Charts widget. * * @namespace YAHOO.widget * @class Chart * @uses YAHOO.util.AttributeProvider * @constructor * @param type {String} The char type. May be "line", "column", "bar", or "pie" * @param containerId {HTMLElement} Container element for the Flash Player instance. * @param dataSource {YAHOO.util.DataSource} DataSource instance. * @param attributes {object} (optional) Object literal of configuration values. */ YAHOO.widget.Chart = function(type, containerId, dataSource, configurationAttributes) { this._type = type; this._dataSource = dataSource; var possibleParams = {align:"", allowNetworking:"", allowScriptAccess:"", base:"", bgcolor:"", menu:"", name:"", quality:"", salign:"", scale:"", tabindex:"", wmode:""}; var attributes = {fixedAttributes:{allowScriptAccess:"always"}, flashVars:{allowedDomain : document.location.hostname}, backgroundColor:"#ffffff", host:this, version:9.045}; for(var i in configurationAttributes) { if(possibleParams.hasOwnProperty(i)) { attributes.fixedAttributes[i] = configurationAttributes[i]; } else { attributes[i] = configurationAttributes[i]; } } this._id = attributes.id = attributes.id || YAHOO.util.Dom.generateId(null, "yuigen"); this._swfURL = YAHOO.widget.Chart.SWFURL; this._containerID = containerId; this._attributes = attributes; this._swfEmbed = new YAHOO.widget.SWF(containerId, YAHOO.widget.Chart.SWFURL, attributes); this._swf = this._swfEmbed.swf; this._swfEmbed.subscribe("swfReady", this._eventHandler, this, true); /** * Fires when the SWF is initialized and communication is possible. * @event contentReady */ //Fix for iframe cross-domain issue with FF2x try { this.createEvent("contentReady"); } catch(e){} /** * Fires when the user moves the mouse over the bounds of an item renderer in the chart. * * @event itemMouseOverEvent * @param event.type {String} The event type * @param event.item {Object} The data displayed by the renderer * @param event.index {Number} The position within the series that the item appears. * @param event.seriesIndex {Number} The position within the series definition that the series appears. * @param event.x {Number} The horizontal position of the mouse, relative to the SWF. * @param event.y {Number} The vertical position of the mouse, relative to the SWF. */ this.createEvent("itemMouseOverEvent"); /** * Fires when the user moves the mouse out of the bounds of an item renderer in the chart. * * @event itemMouseOutEvent * @param event.type {String} The event type * @param event.item {Object} The data displayed by the renderer * @param event.index {Number} The position within the series that the item appears. * @param event.seriesIndex {Number} The position within the series definition that the series appears. * @param event.x {Number} The horizontal position of the mouse, relative to the SWF. * @param event.y {Number} The vertical position of the mouse, relative to the SWF. */ this.createEvent("itemMouseOutEvent"); /** * Fires when the user clicks an item renderer in the chart with the mouse. * * @event itemClickEvent * @param event.type {String} The event type * @param event.item {Object} The data displayed by the renderer * @param event.index {Number} The position within the series that the item appears. * @param event.seriesIndex {Number} The position within the series definition that the series appears. * @param event.x {Number} The horizontal position of the mouse, relative to the SWF. * @param event.y {Number} The vertical position of the mouse, relative to the SWF. */ this.createEvent("itemClickEvent"); /** * Fires when the user double-clicks an item renderer in the chart with the mouse. * * @event itemDoubleClickEvent * @param event.type {String} The event type * @param event.item {Object} The data displayed by the renderer * @param event.index {Number} The position within the series that the item appears. * @param event.seriesIndex {Number} The position within the series definition that the series appears. * @param event.x {Number} The horizontal position of the mouse, relative to the SWF. * @param event.y {Number} The vertical position of the mouse, relative to the SWF. */ this.createEvent("itemDoubleClickEvent"); /** * Fires when the user presses the mouse down on an item to initiate a drag action. * * @event itemDragStartEvent * @param event.type {String} The event type * @param event.item {Object} The data displayed by the renderer * @param event.index {Number} The position within the series that the item appears. * @param event.seriesIndex {Number} The position within the series definition that the series appears. * @param event.x {Number} The horizontal position of the mouse, relative to the SWF. * @param event.y {Number} The vertical position of the mouse, relative to the SWF. */ this.createEvent("itemDragStartEvent"); /** * Fires when the user moves the mouse during a drag action. * * @event itemDragEvent * @param event.type {String} The event type * @param event.item {Object} The data displayed by the renderer * @param event.index {Number} The position within the series that the item appears. * @param event.seriesIndex {Number} The position within the series definition that the series appears. * @param event.x {Number} The horizontal position of the mouse, relative to the SWF. * @param event.y {Number} The vertical position of the mouse, relative to the SWF. */ this.createEvent("itemDragEvent"); /** * Fires when the user releases the mouse during a drag action. * * @event itemDragEndEvent * @param event.type {String} The event type * @param event.item {Object} The data displayed by the renderer * @param event.index {Number} The position within the series that the item appears. * @param event.seriesIndex {Number} The position within the series definition that the series appears. * @param event.x {Number} The horizontal position of the mouse, relative to the SWF. * @param event.y {Number} The vertical position of the mouse, relative to the SWF. */ this.createEvent("itemDragEndEvent"); }; YAHOO.extend(YAHOO.widget.Chart, YAHOO.util.AttributeProvider, { /** * The type of this chart instance. * @property _type * @type String * @private */ _type: null, /** * The id returned from the DataSource's setInterval function. * @property _pollingID * @type Number * @private */ _pollingID: null, /** * The time, in ms, between requests for data. * @property _pollingInterval * @type Number * @private */ _pollingInterval: null, /** * Stores a reference to the dataTipFunction created by * YAHOO.widget.Chart.createProxyFunction() * @property _dataTipFunction * @type String * @private */ _dataTipFunction: null, /** * Stores a reference to the legendLabelFunction created by * YAHOO.widget.Chart.createProxyFunction() * @property _legendLabelFunction * @type String * @private */ _legendLabelFunction: null, /** * Stores references to series function values created by * YAHOO.widget.Chart.createProxyFunction() * @property _seriesFunctions * @type Array * @private */ _seriesFunctions: null, /** * Public accessor to the unique name of the Chart instance. * * @method toString * @return {String} Unique name of the Chart instance. */ toString: function() { return "Chart " + this._id; }, /** * Sets a single style value on the Chart instance. * * @method setStyle * @param name {String} Name of the Chart style value to change. * @param value {Object} New value to pass to the Chart style. */ setStyle: function(name, value) { //we must jsonify this because Flash Player versions below 9.0.60 don't handle //complex ExternalInterface parsing correctly value = YAHOO.lang.JSON.stringify(value); this._swf.setStyle(name, value); }, /** * Resets all styles on the Chart instance. * * @method setStyles * @param styles {Object} Initializer for all Chart styles. */ setStyles: function(styles) { //we must jsonify this because Flash Player versions below 9.0.60 don't handle //complex ExternalInterface parsing correctly styles = YAHOO.lang.JSON.stringify(styles); this._swf.setStyles(styles); }, /** * Sets the styles on all series in the Chart. * * @method setSeriesStyles * @param styles {Array} Initializer for all Chart series styles. */ setSeriesStyles: function(styles) { //we must jsonify this because Flash Player versions below 9.0.60 don't handle //complex ExternalInterface parsing correctly for(var i = 0; i < styles.length; i++) { styles[i] = YAHOO.lang.JSON.stringify(styles[i]); } this._swf.setSeriesStyles(styles); }, destroy: function() { //stop polling if needed if(this._dataSource !== null) { if(this._pollingID !== null) { this._dataSource.clearInterval(this._pollingID); this._pollingID = null; } } //remove proxy functions if(this._dataTipFunction) { YAHOO.widget.Chart.removeProxyFunction(this._dataTipFunction); } if(this._legendLabelFunction) { YAHOO.widget.Chart.removeProxyFunction(this._legendLabelFunction); } //kill the Flash Player instance if(this._swf) { var container = YAHOO.util.Dom.get(this._containerID); container.removeChild(this._swf); } var instanceName = this._id; //null out properties for(var prop in this) { if(YAHOO.lang.hasOwnProperty(this, prop)) { this[prop] = null; } } }, /** * Initializes the attributes. * * @method _initAttributes * @private */ _initAttributes: function(attributes) { //YAHOO.widget.Chart.superclass._initAttributes.call(this, attributes); /** * @attribute wmode * @description Sets the window mode of the Flash Player control. May be * "window", "opaque", or "transparent". Only available in the constructor * because it may not be set after Flash Player has been embedded in the page. * @type String */ /** * @attribute expressInstall * @description URL pointing to a SWF file that handles Flash Player's express * install feature. Only available in the constructor because it may not be * set after Flash Player has been embedded in the page. * @type String */ /** * @attribute version * @description Minimum required version for the SWF file. Only available in the constructor because it may not be * set after Flash Player has been embedded in the page. * @type String */ /** * @attribute backgroundColor * @description The background color of the SWF. Only available in the constructor because it may not be * set after Flash Player has been embedded in the page. * @type String */ /** * @attribute altText * @description The alternative text to provide for screen readers and other assistive technology. * @type String */ this.setAttributeConfig("altText", { method: this._setAltText, getter: this._getAltText }); /** * @attribute swfURL * @description Absolute or relative URL to the SWF displayed by the Chart. Only available in the constructor because it may not be * set after Flash Player has been embedded in the page. * @type String */ this.setAttributeConfig("swfURL", { getter: this._getSWFURL }); /** * @attribute request * @description Request to be sent to the Chart's DataSource. * @type String */ this.setAttributeConfig("request", { method: this._setRequest, getter: this._getRequest }); /** * @attribute dataSource * @description The DataSource instance to display in the Chart. * @type DataSource */ this.setAttributeConfig("dataSource", { method: this._setDataSource, getter: this._getDataSource }); /** * @attribute series * @description Defines the series to be displayed by the Chart. * @type Array */ this.setAttributeConfig("series", { method: this._setSeriesDefs, getter: this._getSeriesDefs }); /** * @attribute categoryNames * @description Defines the names of the categories to be displayed in the Chart.. * @type Array */ this.setAttributeConfig("categoryNames", { validator: YAHOO.lang.isArray, method: this._setCategoryNames, getter: this._getCategoryNames }); /** * @attribute dataTipFunction * @description The string representation of a globally-accessible function * that may be called by the SWF to generate the datatip text for a Chart's item. * @type String */ this.setAttributeConfig("dataTipFunction", { method: this._setDataTipFunction, getter: this._getDataTipFunction }); /** * @attribute legendLabelFunction * @description The string representation of a globally-accessible function * that may be called by the SWF to format the labels of a Chart's legend. * @type String */ this.setAttributeConfig("legendLabelFunction", { method: this._setLegendLabelFunction, getter: this._getLegendLabelFunction }); /** * @attribute polling * @description A numeric value indicating the number of milliseconds between * polling requests to the DataSource. * @type Number */ this.setAttributeConfig("polling", { method: this._setPolling, getter: this._getPolling }); }, /** * Handles swfReady event from SWF. * * @method _eventHandler * @private */ _eventHandler: function(event) { if(event.type == "swfReady") { this._swf = this._swfEmbed._swf; this._loadHandler(); this.fireEvent("contentReady"); } }, /** * Called when the SWF is ready for communication. Sets the type, initializes * the styles, and sets the DataSource. * * @method _loadHandler * @private */ _loadHandler: function() { //the type is set separately because it must be first! if(!this._swf || !this._swf.setType) return; this._swf.setType(this._type); //set initial styles if(this._attributes.style) { var style = this._attributes.style; this.setStyles(style); } this._initialized = false; this._initAttributes(this._attributes); this.setAttributes(this._attributes, true); this._initialized = true; if(this._dataSource) { this.set("dataSource", this._dataSource); } }, /** * Sends (or resends) the request to the DataSource. * * @method refreshData */ refreshData: function() { if(!this._initialized) { return; } if(this._dataSource !== null) { if(this._pollingID !== null) { this._dataSource.clearInterval(this._pollingID); this._pollingID = null; } if(this._pollingInterval > 0) { this._pollingID = this._dataSource.setInterval(this._pollingInterval, this._request, this._loadDataHandler, this); } this._dataSource.sendRequest(this._request, this._loadDataHandler, this); } }, /** * Called when the DataSource receives new data. The series definitions are used * to build a data provider for the SWF chart. * * @method _loadDataHandler * @private */ _loadDataHandler: function(request, response, error) { if(this._swf) { if(error) { } else { var i; if(this._seriesFunctions) { var count = this._seriesFunctions.length; for(i = 0; i < count; i++) { YAHOO.widget.Chart.removeProxyFunction(this._seriesFunctions[i]); } this._seriesFunctions = null; } this._seriesFunctions = []; //make a copy of the series definitions so that we aren't //editing them directly. var dataProvider = []; var seriesCount = 0; var currentSeries = null; if(this._seriesDefs !== null) { seriesCount = this._seriesDefs.length; for(i = 0; i < seriesCount; i++) { currentSeries = this._seriesDefs[i]; var clonedSeries = {}; for(var prop in currentSeries) { if(YAHOO.lang.hasOwnProperty(currentSeries, prop)) { if(prop == "style") { if(currentSeries.style !== null) { clonedSeries.style = YAHOO.lang.JSON.stringify(currentSeries.style); } } else if(prop == "labelFunction") { if(currentSeries.labelFunction !== null) { clonedSeries.labelFunction = YAHOO.widget.Chart.getFunctionReference(currentSeries.labelFunction); this._seriesFunctions.push(clonedSeries.labelFunction); } } else if(prop == "dataTipFunction") { if(currentSeries.dataTipFunction !== null) { clonedSeries.dataTipFunction = YAHOO.widget.Chart.getFunctionReference(currentSeries.dataTipFunction); this._seriesFunctions.push(clonedSeries.dataTipFunction); } } else if(prop == "legendLabelFunction") { if(currentSeries.legendLabelFunction !== null) { clonedSeries.legendLabelFunction = YAHOO.widget.Chart.getFunctionReference(currentSeries.legendLabelFunction); this._seriesFunctions.push(clonedSeries.legendLabelFunction); } } else { clonedSeries[prop] = currentSeries[prop]; } } } dataProvider.push(clonedSeries); } } if(seriesCount > 0) { for(i = 0; i < seriesCount; i++) { currentSeries = dataProvider[i]; if(!currentSeries.type) { currentSeries.type = this._type; } currentSeries.dataProvider = response.results; } } else { var series = {type: this._type, dataProvider: response.results}; dataProvider.push(series); } try { if(this._swf.setDataProvider) this._swf.setDataProvider(dataProvider); } catch(e) { this._swf.setDataProvider(dataProvider); } } } }, /** * Storage for the request attribute. * * @property _request * @private */ _request: "", /** * Getter for the request attribute. * * @method _getRequest * @private */ _getRequest: function() { return this._request; }, /** * Setter for the request attribute. * * @method _setRequest * @private */ _setRequest: function(value) { this._request = value; this.refreshData(); }, /** * Storage for the dataSource attribute. * * @property _dataSource * @private */ _dataSource: null, /** * Getter for the dataSource attribute. * * @method _getDataSource * @private */ _getDataSource: function() { return this._dataSource; }, /** * Setter for the dataSource attribute. * * @method _setDataSource * @private */ _setDataSource: function(value) { this._dataSource = value; this.refreshData(); }, /** * Storage for the series attribute. * * @property _seriesDefs * @private */ _seriesDefs: null, /** * Getter for the series attribute. * * @method _getSeriesDefs * @private */ _getSeriesDefs: function() { return this._seriesDefs; }, /** * Setter for the series attribute. * * @method _setSeriesDefs * @private */ _setSeriesDefs: function(value) { this._seriesDefs = value; this.refreshData(); }, /** * Getter for the categoryNames attribute. * * @method _getCategoryNames * @private */ _getCategoryNames: function() { return this._swf.getCategoryNames(); }, /** * Setter for the categoryNames attribute. * * @method _setCategoryNames * @private */ _setCategoryNames: function(value) { this._swf.setCategoryNames(value); }, /** * Setter for the dataTipFunction attribute. * * @method _setDataTipFunction * @private */ _setDataTipFunction: function(value) { if(this._dataTipFunction) { YAHOO.widget.Chart.removeProxyFunction(this._dataTipFunction); } if(value) { this._dataTipFunction = value = YAHOO.widget.Chart.getFunctionReference(value); } this._swf.setDataTipFunction(value); }, /** * Setter for the legendLabelFunction attribute. * * @method _setLegendLabelFunction * @private */ _setLegendLabelFunction: function(value) { if(this._legendLabelFunction) { YAHOO.widget.Chart.removeProxyFunction(this._legendLabelFunction); } if(value) { this._legendLabelFunction = value = YAHOO.widget.Chart.getFunctionReference(value); } this._swf.setLegendLabelFunction(value); }, /** * Getter for the legendLabelFunction attribute. * * @method _getLegendLabelFunction * @private */ _getLegendLabelFunction: function() { return this._legendLabelFunction; }, /** * Getter for the polling attribute. * * @method _getPolling * @private */ _getPolling: function() { return this._pollingInterval; }, /** * Setter for the polling attribute. * * @method _setPolling * @private */ _setPolling: function(value) { this._pollingInterval = value; this.refreshData(); }, /** * The javascript wrapper for the swf object * * @property _swfEmbed * @type swf * @private */ _swfEmbed: null, /** * The URL of the SWF file. * @property _swfURL * @type String * @private */ _swfURL: null, /** * The ID of the containing DIV. * @property _containerID * @type String * @private */ _containerID: null, /** * A reference to the embedded SWF file. * @property _swf * @private */ _swf: null, /** * The id of this instance. * @property _id * @type String * @private */ _id: null, /** * Indicates whether the SWF has been initialized and is ready * to communicate with JavaScript * @property _initialized * @type Boolean * @private */ _initialized: false, /** * The initializing attributes are stored here until the SWF is ready. * @property _attributes * @type Object * @private */ _attributes: null, //the intializing attributes set: function(name, value) { //save all the attributes in case the swf reloads //so that we can pass them in again this._attributes[name] = value; YAHOO.widget.Chart.superclass.set.call(this, name, value); }, /** * Getter for swfURL attribute. * * @method _getSWFURL * @private */ _getSWFURL: function() { return this._swfURL; }, /** * Getter for altText attribute. * * @method _getAltText * @private */ _getAltText: function() { return this._swf.getAltText(); }, /** * Setter for altText attribute. * * @method _setAltText * @private */ _setAltText: function(value) { this._swf.setAltText(value); } }); /** * The number of proxy functions that have been created. * @static * @private */ YAHOO.widget.Chart.proxyFunctionCount = 0; /** * Creates a globally accessible function that wraps a function reference. * Returns the proxy function's name as a string for use by the SWF through * ExternalInterface. * * @method YAHOO.widget.Chart.createProxyFunction * @static * @private */ YAHOO.widget.Chart.createProxyFunction = function(func, scope) { var scope = scope || null; var index = YAHOO.widget.Chart.proxyFunctionCount; YAHOO.widget.Chart["proxyFunction" + index] = function() { return func.apply(scope, arguments); }; YAHOO.widget.Chart.proxyFunctionCount++; return "YAHOO.widget.Chart.proxyFunction" + index.toString(); }; /** * Uses YAHOO.widget.Chart.createProxyFunction to return string * reference to a function. * * @method YAHOO.widget.Chart.getFunctionReference * @static * @private */ YAHOO.widget.Chart.getFunctionReference = function(value) { if(typeof value == "function") { value = YAHOO.widget.Chart.createProxyFunction(value); } else if(value.func && typeof value.func == "function") { var args = [value.func]; if(value.scope && typeof value.scope == "object") { args.push(value.scope); } value = YAHOO.widget.Chart.createProxyFunction.apply(this, args); } return value; } /** * Removes a function created with createProxyFunction() * * @method YAHOO.widget.Chart.removeProxyFunction * @static * @private */ YAHOO.widget.Chart.removeProxyFunction = function(funcName) { //quick error check if(!funcName || funcName.indexOf("YAHOO.widget.Chart.proxyFunction") < 0) { return; } funcName = funcName.substr(26); YAHOO.widget.Chart[funcName] = null; }; /** * Storage for the dataTipFunction attribute. * * @property Chart.SWFURL * @private * @static * @final * @default "assets/charts.swf" */ YAHOO.widget.Chart.SWFURL = "assets/charts.swf"; /** * PieChart class for the YUI Charts widget. * * @namespace YAHOO.widget * @class PieChart * @uses YAHOO.widget.Chart * @constructor * @param containerId {HTMLElement} Container element for the Flash Player instance. * @param dataSource {YAHOO.util.DataSource} DataSource instance. * @param attributes {object} (optional) Object literal of configuration values. */ YAHOO.widget.PieChart = function(containerId, dataSource, attributes) { YAHOO.widget.PieChart.superclass.constructor.call(this, "pie", containerId, dataSource, attributes); }; YAHOO.lang.extend(YAHOO.widget.PieChart, YAHOO.widget.Chart, { /** * Initializes the attributes. * * @method _initAttributes * @private */ _initAttributes: function(attributes) { YAHOO.widget.PieChart.superclass._initAttributes.call(this, attributes); /** * @attribute dataField * @description The field in each item that corresponds to the data value. * @type String */ this.setAttributeConfig("dataField", { validator: YAHOO.lang.isString, method: this._setDataField, getter: this._getDataField }); /** * @attribute categoryField * @description The field in each item that corresponds to the category value. * @type String */ this.setAttributeConfig("categoryField", { validator: YAHOO.lang.isString, method: this._setCategoryField, getter: this._getCategoryField }); }, /** * Getter for the dataField attribute. * * @method _getDataField * @private */ _getDataField: function() { return this._swf.getDataField(); }, /** * Setter for the dataField attribute. * * @method _setDataField * @private */ _setDataField: function(value) { this._swf.setDataField(value); }, /** * Getter for the categoryField attribute. * * @method _getCategoryField * @private */ _getCategoryField: function() { return this._swf.getCategoryField(); }, /** * Setter for the categoryField attribute. * * @method _setCategoryField * @private */ _setCategoryField: function(value) { this._swf.setCategoryField(value); } }); /** * CartesianChart class for the YUI Charts widget. * * @namespace YAHOO.widget * @class CartesianChart * @uses YAHOO.widget.Chart * @constructor * @param type {String} The char type. May be "line", "column", or "bar" * @param containerId {HTMLElement} Container element for the Flash Player instance. * @param dataSource {YAHOO.util.DataSource} DataSource instance. * @param attributes {object} (optional) Object literal of configuration values. */ YAHOO.widget.CartesianChart = function(type, containerId, dataSource, attributes) { YAHOO.widget.CartesianChart.superclass.constructor.call(this, type, containerId, dataSource, attributes); }; YAHOO.lang.extend(YAHOO.widget.CartesianChart, YAHOO.widget.Chart, { /** * Stores a reference to the xAxis labelFunction created by * YAHOO.widget.Chart.createProxyFunction() * @property _xAxisLabelFunctions * @type String * @private */ _xAxisLabelFunctions: [], /** * Stores a reference to the yAxis labelFunctions created by * YAHOO.widget.Chart.createProxyFunction() * @property _yAxisLabelFunctions * @type Array * @private */ _yAxisLabelFunctions: [], destroy: function() { //remove proxy functions this._removeAxisFunctions(this._xAxisLabelFunctions); this._removeAxisFunctions(this._yAxisLabelFunctions); //call last YAHOO.widget.CartesianChart.superclass.destroy.call(this); }, /** * Initializes the attributes. * * @method _initAttributes * @private */ _initAttributes: function(attributes) { YAHOO.widget.CartesianChart.superclass._initAttributes.call(this, attributes); /** * @attribute xField * @description The field in each item that corresponds to a value on the x axis. * @type String */ this.setAttributeConfig("xField", { validator: YAHOO.lang.isString, method: this._setXField, getter: this._getXField }); /** * @attribute yField * @description The field in each item that corresponds to a value on the x axis. * @type String */ this.setAttributeConfig("yField", { validator: YAHOO.lang.isString, method: this._setYField, getter: this._getYField }); /** * @attribute xAxis * @description A custom configuration for the horizontal x axis. * @type Axis */ this.setAttributeConfig("xAxis", { method: this._setXAxis }); /** * @attribute xAxes * @description Custom configurations for the horizontal x axes. * @type Array */ this.setAttributeConfig("xAxes", { method: this._setXAxes }); /** * @attribute yAxis * @description A custom configuration for the vertical y axis. * @type Axis */ this.setAttributeConfig("yAxis", { method: this._setYAxis }); /** * @attribute yAxes * @description Custom configurations for the vertical y axes. * @type Array */ this.setAttributeConfig("yAxes", { method: this._setYAxes }); /** * @attribute constrainViewport * @description Determines whether the viewport is constrained to prevent series data from overflow. * @type Boolean */ this.setAttributeConfig("constrainViewport", { method: this._setConstrainViewport }); }, /** * Getter for the xField attribute. * * @method _getXField * @private */ _getXField: function() { return this._swf.getHorizontalField(); }, /** * Setter for the xField attribute. * * @method _setXField * @private */ _setXField: function(value) { this._swf.setHorizontalField(value); }, /** * Getter for the yField attribute. * * @method _getYField * @private */ _getYField: function() { return this._swf.getVerticalField(); }, /** * Setter for the yField attribute. * * @method _setYField * @private */ _setYField: function(value) { this._swf.setVerticalField(value); }, /** * Receives an axis object, creates a proxy function for * the labelFunction and returns the updated object. * * @method _getClonedAxis * @private */ _getClonedAxis: function(value) { var clonedAxis = {}; for(var prop in value) { if(prop == "labelFunction") { if(value.labelFunction && value.labelFunction !== null) { clonedAxis.labelFunction = YAHOO.widget.Chart.getFunctionReference(value.labelFunction); } } else { clonedAxis[prop] = value[prop]; } } return clonedAxis; }, /** * Removes axis functions contained in an array * * @method _removeAxisFunctions * @private */ _removeAxisFunctions: function(axisFunctions) { if(axisFunctions && axisFunctions.length > 0) { var len = axisFunctions.length; for(var i = 0; i < len; i++) { if(axisFunctions[i] !== null) { YAHOO.widget.Chart.removeProxyFunction(axisFunctions[i]); } } axisFunctions = []; } }, /** * Setter for the xAxis attribute. * * @method _setXAxis * @private */ _setXAxis: function(value) { if(value.position != "bottom" && value.position != "top") value.position = "bottom"; this._removeAxisFunctions(this._xAxisLabelFunctions); value = this._getClonedAxis(value); this._xAxisLabelFunctions.push(value.labelFunction); this._swf.setHorizontalAxis(value); }, /** * Setter for the xAxes attribute * * @method _setXAxes * @private */ _setXAxes: function(value) { this._removeAxisFunctions(this._xAxisLabelFunctions); var len = value.length; for(var i = 0; i < len; i++) { if(value[i].position == "left") value[i].position = "bottom"; value[i] = this._getClonedAxis(value[i]); if(value[i].labelFunction) this._xAxisLabelFunctions.push(value[i].labelFunction); this._swf.setHorizontalAxis(value[i]); } }, /** * Setter for the yAxis attribute. * * @method _setYAxis * @private */ _setYAxis: function(value) { this._removeAxisFunctions(this._yAxisLabelFunctions); value = this._getClonedAxis(value); this._yAxisLabelFunctions.push(value.labelFunction); this._swf.setVerticalAxis(value); }, /** * Setter for the yAxes attribute. * * @method _setYAxes * @private */ _setYAxes: function(value) { this._removeAxisFunctions(this._yAxisLabelFunctions); var len = value.length; for(var i = 0; i < len; i++) { value[i] = this._getClonedAxis(value[i]); if(value[i].labelFunction) this._yAxisLabelFunctions.push(value[i].labelFunction); this._swf.setVerticalAxis(value[i]); } }, /** * Setter for the constrainViewport attribute * * @method _setConstrainViewport * @private */ _setConstrainViewport: function(value) { this._swf.setConstrainViewport(value); }, /** * Sets the style object for a single series based on its index * * @method setSeriesStylesByIndex * @param index {Number} The position within the series definition to apply the style * @param style {object} Style object to be applied to the selected series */ setSeriesStylesByIndex:function(index, style) { style = YAHOO.lang.JSON.stringify(style); if(this._swf && this._swf.setSeriesStylesByIndex) this._swf.setSeriesStylesByIndex(index, style); } }); /** * LineChart class for the YUI Charts widget. * * @namespace YAHOO.widget * @class LineChart * @uses YAHOO.widget.CartesianChart * @constructor * @param containerId {HTMLElement} Container element for the Flash Player instance. * @param dataSource {YAHOO.util.DataSource} DataSource instance. * @param attributes {object} (optional) Object literal of configuration values. */ YAHOO.widget.LineChart = function(containerId, dataSource, attributes) { YAHOO.widget.LineChart.superclass.constructor.call(this, "line", containerId, dataSource, attributes); }; YAHOO.lang.extend(YAHOO.widget.LineChart, YAHOO.widget.CartesianChart); /** * ColumnChart class for the YUI Charts widget. * * @namespace YAHOO.widget * @class ColumnChart * @uses YAHOO.widget.CartesianChart * @constructor * @param containerId {HTMLElement} Container element for the Flash Player instance. * @param dataSource {YAHOO.util.DataSource} DataSource instance. * @param attributes {object} (optional) Object literal of configuration values. */ YAHOO.widget.ColumnChart = function(containerId, dataSource, attributes) { YAHOO.widget.ColumnChart.superclass.constructor.call(this, "column", containerId, dataSource, attributes); }; YAHOO.lang.extend(YAHOO.widget.ColumnChart, YAHOO.widget.CartesianChart); /** * BarChart class for the YUI Charts widget. * * @namespace YAHOO.widget * @class BarChart * @uses YAHOO.widget.CartesianChart * @constructor * @param containerId {HTMLElement} Container element for the Flash Player instance. * @param dataSource {YAHOO.util.DataSource} DataSource instance. * @param attributes {object} (optional) Object literal of configuration values. */ YAHOO.widget.BarChart = function(containerId, dataSource, attributes) { YAHOO.widget.BarChart.superclass.constructor.call(this, "bar", containerId, dataSource, attributes); }; YAHOO.lang.extend(YAHOO.widget.BarChart, YAHOO.widget.CartesianChart); /** * StackedColumnChart class for the YUI Charts widget. * * @namespace YAHOO.widget * @class StackedColumnChart * @uses YAHOO.widget.CartesianChart * @constructor * @param containerId {HTMLElement} Container element for the Flash Player instance. * @param dataSource {YAHOO.util.DataSource} DataSource instance. * @param attributes {object} (optional) Object literal of configuration values. */ YAHOO.widget.StackedColumnChart = function(containerId, dataSource, attributes) { YAHOO.widget.StackedColumnChart.superclass.constructor.call(this, "stackcolumn", containerId, dataSource, attributes); }; YAHOO.lang.extend(YAHOO.widget.StackedColumnChart, YAHOO.widget.CartesianChart); /** * StackedBarChart class for the YUI Charts widget. * * @namespace YAHOO.widget * @class StackedBarChart * @uses YAHOO.widget.CartesianChart * @constructor * @param containerId {HTMLElement} Container element for the Flash Player instance. * @param dataSource {YAHOO.util.DataSource} DataSource instance. * @param attributes {object} (optional) Object literal of configuration values. */ YAHOO.widget.StackedBarChart = function(containerId, dataSource, attributes) { YAHOO.widget.StackedBarChart.superclass.constructor.call(this, "stackbar", containerId, dataSource, attributes); }; YAHOO.lang.extend(YAHOO.widget.StackedBarChart, YAHOO.widget.CartesianChart); /** * Defines a CartesianChart's vertical or horizontal axis. * * @namespace YAHOO.widget * @class Axis * @constructor */ YAHOO.widget.Axis = function() { }; YAHOO.widget.Axis.prototype = { /** * The type of axis. * * @property type * @type String */ type: null, /** * If true, the items on the axis will be drawn in opposite direction. * * @property reverse * @type Boolean */ reverse: false, /** * A string reference to the globally-accessible function that may be called to * determine each of the label values for this axis. Also accepts function references. * * @property labelFunction * @type String */ labelFunction: null, /** * The space, in pixels, between labels on an axis. * * @property labelSpacing * @type Number */ labelSpacing: 2, /** * The text that will appear next to the axis to indicate information about the data that it displays. * * @property title * @type String */ title: null }; /** * A type of axis whose units are measured in numeric values. * * @namespace YAHOO.widget * @class NumericAxis * @extends YAHOO.widget.Axis * @constructor */ YAHOO.widget.NumericAxis = function() { YAHOO.widget.NumericAxis.superclass.constructor.call(this); }; YAHOO.lang.extend(YAHOO.widget.NumericAxis, YAHOO.widget.Axis, { type: "numeric", /** * The minimum value drawn by the axis. If not set explicitly, the axis minimum * will be calculated automatically. * * @property minimum * @type Number */ minimum: NaN, /** * The maximum value drawn by the axis. If not set explicitly, the axis maximum * will be calculated automatically. * * @property maximum * @type Number */ maximum: NaN, /** * The spacing between major intervals on this axis. * * @property majorUnit * @type Number */ majorUnit: NaN, /** * The spacing between minor intervals on this axis. * * @property minorUnit * @type Number */ minorUnit: NaN, /** * If true, the labels, ticks, gridlines, and other objects will snap to * the nearest major or minor unit. If false, their position will be based * on the minimum value. * * @property snapToUnits * @type Boolean */ snapToUnits: true, /** * Series that are stackable will only stack when this value is set to true. * * @property stackingEnabled * @type Boolean */ stackingEnabled: false, /** * If true, and the bounds are calculated automatically, either the minimum or * maximum will be set to zero. * * @property alwaysShowZero * @type Boolean */ alwaysShowZero: true, /** * The scaling algorithm to use on this axis. May be "linear" or "logarithmic". * * @property scale * @type String */ scale: "linear", /** * Indicates whether to round the major unit. * * @property roundMajorUnit * @type Boolean */ roundMajorUnit: true, /** * Indicates whether to factor in the size of the labels when calculating a major unit. * * @property calculateByLabelSize * @type Boolean */ calculateByLabelSize: true, /** * Indicates the position of the axis relative to the chart * * @property position * @type String */ position:"left", /** * Indicates whether to extend maximum beyond data's maximum to the nearest * majorUnit. * * @property adjustMaximumByMajorUnit * @type Boolean */ adjustMaximumByMajorUnit:true, /** * Indicates whether to extend the minimum beyond data's minimum to the nearest * majorUnit. * * @property adjustMinimumByMajorUnit * @type Boolean */ adjustMinimumByMajorUnit:true }); /** * A type of axis whose units are measured in time-based values. * * @namespace YAHOO.widget * @class TimeAxis * @constructor */ YAHOO.widget.TimeAxis = function() { YAHOO.widget.TimeAxis.superclass.constructor.call(this); }; YAHOO.lang.extend(YAHOO.widget.TimeAxis, YAHOO.widget.Axis, { type: "time", /** * The minimum value drawn by the axis. If not set explicitly, the axis minimum * will be calculated automatically. * * @property minimum * @type Date */ minimum: null, /** * The maximum value drawn by the axis. If not set explicitly, the axis maximum * will be calculated automatically. * * @property maximum * @type Number */ maximum: null, /** * The spacing between major intervals on this axis. * * @property majorUnit * @type Number */ majorUnit: NaN, /** * The time unit used by the majorUnit. * * @property majorTimeUnit * @type String */ majorTimeUnit: null, /** * The spacing between minor intervals on this axis. * * @property majorUnit * @type Number */ minorUnit: NaN, /** * The time unit used by the minorUnit. * * @property majorTimeUnit * @type String */ minorTimeUnit: null, /** * If true, the labels, ticks, gridlines, and other objects will snap to * the nearest major or minor unit. If false, their position will be based * on the minimum value. * * @property snapToUnits * @type Boolean */ snapToUnits: true, /** * Series that are stackable will only stack when this value is set to true. * * @property stackingEnabled * @type Boolean */ stackingEnabled: false, /** * Indicates whether to factor in the size of the labels when calculating a major unit. * * @property calculateByLabelSize * @type Boolean */ calculateByLabelSize: true }); /** * A type of axis that displays items in categories. * * @namespace YAHOO.widget * @class CategoryAxis * @constructor */ YAHOO.widget.CategoryAxis = function() { YAHOO.widget.CategoryAxis.superclass.constructor.call(this); }; YAHOO.lang.extend(YAHOO.widget.CategoryAxis, YAHOO.widget.Axis, { type: "category", /** * A list of category names to display along this axis. * * @property categoryNames * @type Array */ categoryNames: null, /** * Indicates whether or not to calculate the number of categories (ticks and labels) * when there is not enough room to display all labels on the axis. If set to true, the axis * will determine the number of categories to plot. If not, all categories will be plotted. * * @property calculateCategoryCount * @type Boolean */ calculateCategoryCount: false }); /** * Functionality common to most series. Generally, a Series * object shouldn't be instantiated directly. Instead, a subclass with a * concrete implementation should be used. * * @namespace YAHOO.widget * @class Series * @constructor */ YAHOO.widget.Series = function() {}; YAHOO.widget.Series.prototype = { /** * The type of series. * * @property type * @type String */ type: null, /** * The human-readable name of the series. * * @property displayName * @type String */ displayName: null }; /** * Functionality common to most series appearing in cartesian charts. * Generally, a CartesianSeries object shouldn't be * instantiated directly. Instead, a subclass with a concrete implementation * should be used. * * @namespace YAHOO.widget * @class CartesianSeries * @uses YAHOO.widget.Series * @constructor */ YAHOO.widget.CartesianSeries = function() { YAHOO.widget.CartesianSeries.superclass.constructor.call(this); }; YAHOO.lang.extend(YAHOO.widget.CartesianSeries, YAHOO.widget.Series, { /** * The field used to access the x-axis value from the items from the data source. * * @property xField * @type String */ xField: null, /** * The field used to access the y-axis value from the items from the data source. * * @property yField * @type String */ yField: null, /** * Indicates which axis the series will bind to * * @property axis * @type String */ axis: "primary", /** * When a Legend is present, indicates whether the series will show in the legend. * * @property showInLegend * @type Boolean */ showInLegend: true }); /** * ColumnSeries class for the YUI Charts widget. * * @namespace YAHOO.widget * @class ColumnSeries * @uses YAHOO.widget.CartesianSeries * @constructor */ YAHOO.widget.ColumnSeries = function() { YAHOO.widget.ColumnSeries.superclass.constructor.call(this); }; YAHOO.lang.extend(YAHOO.widget.ColumnSeries, YAHOO.widget.CartesianSeries, { type: "column" }); /** * LineSeries class for the YUI Charts widget. * * @namespace YAHOO.widget * @class LineSeries * @uses YAHOO.widget.CartesianSeries * @constructor */ YAHOO.widget.LineSeries = function() { YAHOO.widget.LineSeries.superclass.constructor.call(this); }; YAHOO.lang.extend(YAHOO.widget.LineSeries, YAHOO.widget.CartesianSeries, { type: "line" }); /** * BarSeries class for the YUI Charts widget. * * @namespace YAHOO.widget * @class BarSeries * @uses YAHOO.widget.CartesianSeries * @constructor */ YAHOO.widget.BarSeries = function() { YAHOO.widget.BarSeries.superclass.constructor.call(this); }; YAHOO.lang.extend(YAHOO.widget.BarSeries, YAHOO.widget.CartesianSeries, { type: "bar" }); /** * PieSeries class for the YUI Charts widget. * * @namespace YAHOO.widget * @class PieSeries * @uses YAHOO.widget.Series * @constructor */ YAHOO.widget.PieSeries = function() { YAHOO.widget.PieSeries.superclass.constructor.call(this); }; YAHOO.lang.extend(YAHOO.widget.PieSeries, YAHOO.widget.Series, { type: "pie", /** * The field used to access the data value from the items from the data source. * * @property dataField * @type String */ dataField: null, /** * The field used to access the category value from the items from the data source. * * @property categoryField * @type String */ categoryField: null, /** * A string reference to the globally-accessible function that may be called to * determine each of the label values for this series. Also accepts function references. * * @property labelFunction * @type String */ labelFunction: null }); /** * StackedBarSeries class for the YUI Charts widget. * * @namespace YAHOO.widget * @class StackedBarSeries * @uses YAHOO.widget.CartesianSeries * @constructor */ YAHOO.widget.StackedBarSeries = function() { YAHOO.widget.StackedBarSeries.superclass.constructor.call(this); }; YAHOO.lang.extend(YAHOO.widget.StackedBarSeries, YAHOO.widget.CartesianSeries, { type: "stackbar" }); /** * StackedColumnSeries class for the YUI Charts widget. * * @namespace YAHOO.widget * @class StackedColumnSeries * @uses YAHOO.widget.CartesianSeries * @constructor */ YAHOO.widget.StackedColumnSeries = function() { YAHOO.widget.StackedColumnSeries.superclass.constructor.call(this); }; YAHOO.lang.extend(YAHOO.widget.StackedColumnSeries, YAHOO.widget.CartesianSeries, { type: "stackcolumn" }); YAHOO.register("charts", YAHOO.widget.Chart, {version: "2.9.0", build: "2800"});