Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

YUI.add('yui2-charts', function(Y) {
    var YAHOO    = Y.YUI2;
    /*
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 <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.9.0", build: "2800"});

}, '2.9.0' ,{"requires": ["yui2-yahoo", "yui2-dom", "yui2-event", "yui2-element", "yui2-swf", "yui2-json", "yui2-datasource"]});