/*
Copyright (c) 2010, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.com/yui/license.html
version: 2.8.1
*/
/**
* 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
* @experimental
*/
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/**
* 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");
if(attributes.version && attributes.version != null && attributes.version != undefined && attributes.version != "undefined")
{
var version = (/\w*.\w*/.exec(((attributes.version).toString()).replace(/.0./g, "."))).toString();
var verSplit = version.split(".");
version = verSplit[0] + ".";
switch((verSplit[1].toString()).length)
{
case 1:
version += "00";
break;
case 2:
version += "0";
break;
}
version += verSplit[1];
attributes.version = parseFloat(version);
}
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._legendLabelFunction
});
/**
* @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 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 <code>Series</code>
* 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 <code>CartesianSeries</code> 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.8.1", build: "19"});