--- /dev/null
+/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+/*extern ActiveXObject, __flash_unloadHandler, __flash_savedUnloadHandler */
+/*!
+ * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
+ *
+ * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ * @namespace YAHOO
+ */
+
+YAHOO.namespace("deconcept");
+
+YAHOO.deconcept = YAHOO.deconcept || {};
+
+if(typeof YAHOO.deconcept.util == "undefined" || !YAHOO.deconcept.util)
+{
+ YAHOO.deconcept.util = {};
+}
+
+if(typeof YAHOO.deconcept.SWFObjectUtil == "undefined" || !YAHOO.deconcept.SWFObjectUtil)
+{
+ YAHOO.deconcept.SWFObjectUtil = {};
+}
+
+YAHOO.deconcept.SWFObject = function(swf, id, w, h, ver, c, quality, xiRedirectUrl, redirectUrl, detectKey)
+{
+ if(!document.getElementById) { return; }
+ this.DETECT_KEY = detectKey ? detectKey : 'detectflash';
+ this.skipDetect = YAHOO.deconcept.util.getRequestParameter(this.DETECT_KEY);
+ this.params = {};
+ this.variables = {};
+ this.attributes = [];
+ if(swf) { this.setAttribute('swf', swf); }
+ if(id) { this.setAttribute('id', id); }
+ if(w) { this.setAttribute('width', w); }
+ if(h) { this.setAttribute('height', h); }
+ if(ver) { this.setAttribute('version', new YAHOO.deconcept.PlayerVersion(ver.toString().split("."))); }
+ this.installedVer = YAHOO.deconcept.SWFObjectUtil.getPlayerVersion();
+ if (!window.opera && document.all && this.installedVer.major > 7)
+ {
+ // only add the onunload cleanup if the Flash Player version supports External Interface and we are in IE
+ YAHOO.deconcept.SWFObject.doPrepUnload = true;
+ }
+ if(c)
+ {
+ this.addParam('bgcolor', c);
+ }
+ var q = quality ? quality : 'high';
+ this.addParam('quality', q);
+ this.setAttribute('useExpressInstall', false);
+ this.setAttribute('doExpressInstall', false);
+ var xir = (xiRedirectUrl) ? xiRedirectUrl : window.location;
+ this.setAttribute('xiRedirectUrl', xir);
+ this.setAttribute('redirectUrl', '');
+ if(redirectUrl)
+ {
+ this.setAttribute('redirectUrl', redirectUrl);
+ }
+};
+
+YAHOO.deconcept.SWFObject.prototype =
+{
+ useExpressInstall: function(path)
+ {
+ this.xiSWFPath = !path ? "expressinstall.swf" : path;
+ this.setAttribute('useExpressInstall', true);
+ },
+ setAttribute: function(name, value){
+ this.attributes[name] = value;
+ },
+ getAttribute: function(name){
+ return this.attributes[name];
+ },
+ addParam: function(name, value){
+ this.params[name] = value;
+ },
+ getParams: function(){
+ return this.params;
+ },
+ addVariable: function(name, value){
+ this.variables[name] = value;
+ },
+ getVariable: function(name){
+ return this.variables[name];
+ },
+ getVariables: function(){
+ return this.variables;
+ },
+ getVariablePairs: function(){
+ var variablePairs = [];
+ var key;
+ var variables = this.getVariables();
+ for(key in variables)
+ {
+ if(variables.hasOwnProperty(key))
+ {
+ variablePairs[variablePairs.length] = key +"="+ variables[key];
+ }
+ }
+ return variablePairs;
+ },
+ getSWFHTML: function() {
+ var swfNode = "";
+ var params = {};
+ var key = "";
+ var pairs = "";
+ if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { // netscape plugin architecture
+ if (this.getAttribute("doExpressInstall")) {
+ this.addVariable("MMplayerType", "PlugIn");
+ this.setAttribute('swf', this.xiSWFPath);
+ }
+ swfNode = '<embed type="application/x-shockwave-flash" src="'+ this.getAttribute('swf') +'" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'" style="'+ this.getAttribute('style') +'"';
+ swfNode += ' id="'+ this.getAttribute('id') +'" name="'+ this.getAttribute('id') +'" ';
+ params = this.getParams();
+ for(key in params)
+ {
+ if(params.hasOwnProperty(key))
+ {
+ swfNode += [key] +'="'+ params[key] +'" ';
+ }
+ }
+ pairs = this.getVariablePairs().join("&");
+ if (pairs.length > 0){ swfNode += 'flashvars="'+ pairs +'"'; }
+ swfNode += '/>';
+ } else { // PC IE
+ if (this.getAttribute("doExpressInstall")) {
+ this.addVariable("MMplayerType", "ActiveX");
+ this.setAttribute('swf', this.xiSWFPath);
+ }
+ swfNode = '<object id="'+ this.getAttribute('id') +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'" style="'+ this.getAttribute('style') +'">';
+ swfNode += '<param name="movie" value="'+ this.getAttribute('swf') +'" />';
+ params = this.getParams();
+ for(key in params)
+ {
+ if(params.hasOwnProperty(key))
+ {
+ swfNode += '<param name="'+ key +'" value="'+ params[key] +'" />';
+ }
+ }
+ pairs = this.getVariablePairs().join("&");
+ if(pairs.length > 0) {swfNode += '<param name="flashvars" value="'+ pairs +'" />';}
+ swfNode += "</object>";
+ }
+ return swfNode;
+ },
+ write: function(elementId)
+ {
+ if(this.getAttribute('useExpressInstall')) {
+ // check to see if we need to do an express install
+ var expressInstallReqVer = new YAHOO.deconcept.PlayerVersion([6,0,65]);
+ if (this.installedVer.versionIsValid(expressInstallReqVer) && !this.installedVer.versionIsValid(this.getAttribute('version'))) {
+ this.setAttribute('doExpressInstall', true);
+ this.addVariable("MMredirectURL", escape(this.getAttribute('xiRedirectUrl')));
+ document.title = document.title.slice(0, 47) + " - Flash Player Installation";
+ this.addVariable("MMdoctitle", document.title);
+ }
+ }
+ if(this.skipDetect || this.getAttribute('doExpressInstall') || this.installedVer.versionIsValid(this.getAttribute('version')))
+ {
+ var n = (typeof elementId == 'string') ? document.getElementById(elementId) : elementId;
+ n.innerHTML = this.getSWFHTML();
+ return true;
+ }
+ else
+ {
+ if(this.getAttribute('redirectUrl') !== "")
+ {
+ document.location.replace(this.getAttribute('redirectUrl'));
+ }
+ }
+ return false;
+ }
+};
+
+/* ---- detection functions ---- */
+YAHOO.deconcept.SWFObjectUtil.getPlayerVersion = function()
+{
+ var axo = null;
+ var PlayerVersion = new YAHOO.deconcept.PlayerVersion([0,0,0]);
+ if(navigator.plugins && navigator.mimeTypes.length)
+ {
+ var x = navigator.plugins["Shockwave Flash"];
+ if(x && x.description)
+ {
+ PlayerVersion = new YAHOO.deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split("."));
+ }
+ }
+ else if (navigator.userAgent && navigator.userAgent.indexOf("Windows CE") >= 0)
+ { // if Windows CE
+ var counter = 3;
+ while(axo)
+ {
+ try
+ {
+ counter++;
+ axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+ counter);
+// document.write("player v: "+ counter);
+ PlayerVersion = new YAHOO.deconcept.PlayerVersion([counter,0,0]);
+ }
+ catch(e)
+ {
+ axo = null;
+ }
+ }
+ }
+ else
+ { // Win IE (non mobile)
+ // do minor version lookup in IE, but avoid fp6 crashing issues
+ // see http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/
+ try
+ {
+ axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
+ }
+ catch(e)
+ {
+ try
+ {
+ axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
+ PlayerVersion = new YAHOO.deconcept.PlayerVersion([6,0,21]);
+ axo.AllowScriptAccess = "always"; // error if player version < 6.0.47 (thanks to Michael Williams @ Adobe for this code)
+ }
+ catch(e)
+ {
+ if(PlayerVersion.major == 6)
+ {
+ return PlayerVersion;
+ }
+ }
+ try
+ {
+ axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
+ }
+ catch(e) {}
+ }
+
+ if(axo !== null)
+ {
+ PlayerVersion = new YAHOO.deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));
+ }
+ }
+ return PlayerVersion;
+};
+
+YAHOO.deconcept.PlayerVersion = function(arrVersion)
+{
+ this.major = arrVersion[0] !== null ? parseInt(arrVersion[0], 0) : 0;
+ this.minor = arrVersion[1] !== null ? parseInt(arrVersion[1], 0) : 0;
+ this.rev = arrVersion[2] !== null ? parseInt(arrVersion[2], 0) : 0;
+};
+
+YAHOO.deconcept.PlayerVersion.prototype.versionIsValid = function(fv)
+{
+ if(this.major < fv.major)
+ {
+ return false;
+ }
+ if(this.major > fv.major)
+ {
+ return true;
+ }
+ if(this.minor < fv.minor)
+ {
+ return false;
+ }
+ if(this.minor > fv.minor)
+ {
+ return true;
+ }
+ if(this.rev < fv.rev)
+ {
+ return false;
+ }
+ return true;
+};
+
+/* ---- get value of query string param ---- */
+YAHOO.deconcept.util =
+{
+ getRequestParameter: function(param)
+ {
+ var q = document.location.search || document.location.hash;
+ if(param === null) { return q; }
+ if(q)
+ {
+ var pairs = q.substring(1).split("&");
+ for(var i=0; i < pairs.length; i++)
+ {
+ if (pairs[i].substring(0, pairs[i].indexOf("=")) == param)
+ {
+ return pairs[i].substring((pairs[i].indexOf("=") + 1));
+ }
+ }
+ }
+ return "";
+ }
+};
+
+/* fix for video streaming bug */
+YAHOO.deconcept.SWFObjectUtil.cleanupSWFs = function()
+{
+ var objects = document.getElementsByTagName("OBJECT");
+ for(var i = objects.length - 1; i >= 0; i--)
+ {
+ objects[i].style.display = 'none';
+ for(var x in objects[i])
+ {
+ if(typeof objects[i][x] == 'function')
+ {
+ objects[i][x] = function(){};
+ }
+ }
+ }
+};
+
+// fixes bug in some fp9 versions see http://blog.deconcept.com/2006/07/28/swfobject-143-released/
+if(YAHOO.deconcept.SWFObject.doPrepUnload)
+{
+ if(!YAHOO.deconcept.unloadSet)
+ {
+ YAHOO.deconcept.SWFObjectUtil.prepUnload = function()
+ {
+ __flash_unloadHandler = function(){};
+ __flash_savedUnloadHandler = function(){};
+ window.attachEvent("onunload", YAHOO.deconcept.SWFObjectUtil.cleanupSWFs);
+ };
+ window.attachEvent("onbeforeunload", YAHOO.deconcept.SWFObjectUtil.prepUnload);
+ YAHOO.deconcept.unloadSet = true;
+ }
+}
+
+/* add document.getElementById if needed (mobile IE < 5) */
+if(!document.getElementById && document.all)
+{
+ document.getElementById = function(id) { return document.all[id]; };
+}
+
+
+/**
+ * Wraps Flash embedding functionality and allows communication with SWF through
+ * attributes.
+ *
+ * @namespace YAHOO.widget
+ * @class FlashAdapter
+ * @uses YAHOO.util.AttributeProvider
+ */
+YAHOO.widget.FlashAdapter = function(swfURL, containerID, attributes)
+{
+ // set up the initial events and attributes stuff
+ this._queue = this._queue || [];
+ this._events = this._events || {};
+ this._configs = this._configs || {};
+ attributes = attributes || {};
+
+ //the Flash Player external interface code from Adobe doesn't play nicely
+ //with the default value, yui-gen, in IE
+ this._id = attributes.id = attributes.id || YAHOO.util.Dom.generateId(null, "yuigen");
+ attributes.version = attributes.version || "9.0.45";
+ attributes.backgroundColor = attributes.backgroundColor || "#ffffff";
+
+ //we can't use the initial attributes right away
+ //so save them for once the SWF finishes loading
+ this._attributes = attributes;
+
+ this._swfURL = swfURL;
+ this._containerID = containerID;
+
+ //embed the SWF file in the page
+ this._embedSWF(this._swfURL, this._containerID, attributes.id, attributes.version,
+ attributes.backgroundColor, attributes.expressInstall, attributes.wmode);
+
+ /**
+ * 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){}
+};
+
+YAHOO.extend(YAHOO.widget.FlashAdapter, YAHOO.util.AttributeProvider,
+{
+ /**
+ * 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
+
+ /**
+ * Public accessor to the unique name of the FlashAdapter instance.
+ *
+ * @method toString
+ * @return {String} Unique name of the FlashAdapter instance.
+ */
+ toString: function()
+ {
+ return "FlashAdapter " + this._id;
+ },
+
+ /**
+ * Nulls out the entire FlashAdapter instance and related objects and removes attached
+ * event listeners and clears out DOM elements inside the container. After calling
+ * this method, the instance reference should be expliclitly nulled by implementer,
+ * as in myChart = null. Use with caution!
+ *
+ * @method destroy
+ */
+ destroy: function()
+ {
+ //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;
+ }
+ }
+
+ },
+
+ /**
+ * Embeds the SWF in the page and associates it with this instance.
+ *
+ * @method _embedSWF
+ * @private
+ */
+ _embedSWF: function(swfURL, containerID, swfID, version, backgroundColor, expressInstall, wmode)
+ {
+ //standard SWFObject embed
+ var swfObj = new YAHOO.deconcept.SWFObject(swfURL, swfID, "100%", "100%", version, backgroundColor);
+
+ if(expressInstall)
+ {
+ swfObj.useExpressInstall(expressInstall);
+ }
+
+ //make sure we can communicate with ExternalInterface
+ swfObj.addParam("allowScriptAccess", "always");
+
+ if(wmode)
+ {
+ swfObj.addParam("wmode", wmode);
+ }
+
+ //again, a useful ExternalInterface trick
+ swfObj.addVariable("allowedDomain", document.location.hostname);
+
+ //tell the SWF which HTML element it is in
+ swfObj.addVariable("elementID", swfID);
+
+ // set the name of the function to call when the swf has an event
+ swfObj.addVariable("eventHandler", "YAHOO.widget.FlashAdapter.eventHandler");
+
+ var container = YAHOO.util.Dom.get(containerID);
+ var result = swfObj.write(container);
+ if(result)
+ {
+ this._swf = YAHOO.util.Dom.get(swfID);
+ //if successful, let's add an owner property to the SWF reference
+ //this will allow the event handler to communicate with a YAHOO.widget.FlashAdapter
+ this._swf.owner = this;
+ }
+ else
+ {
+ }
+ },
+
+ /**
+ * Handles or re-dispatches events received from the SWF.
+ *
+ * @method _eventHandler
+ * @private
+ */
+ _eventHandler: function(event)
+ {
+ var type = event.type;
+ switch(type)
+ {
+ case "swfReady":
+ this._loadHandler();
+ this.fireEvent("contentReady");
+ return;
+ case "log":
+ return;
+ }
+
+ //be sure to return after your case or the event will automatically fire!
+ this.fireEvent(type, event);
+ },
+
+ /**
+ * Called when the SWF has been initialized.
+ *
+ * @method _loadHandler
+ * @private
+ */
+ _loadHandler: function()
+ {
+ this._initialized = false;
+ this._initAttributes(this._attributes);
+ this.setAttributes(this._attributes, true);
+
+ this._initialized = true;
+ },
+
+ 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.FlashAdapter.superclass.set.call(this, name, value);
+ },
+
+ /**
+ * Initializes the attributes.
+ *
+ * @method _initAttributes
+ * @private
+ */
+ _initAttributes: function(attributes)
+ {
+ //should be overridden if other attributes need to be set up
+
+ /**
+ * @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.getAttributeConfig("altText",
+ {
+ method: this._getAltText
+ });
+ this.setAttributeConfig("altText",
+ {
+ method: this._setAltText
+ });
+
+ /**
+ * @attribute swfURL
+ * @description Absolute or relative URL to the SWF displayed by the FlashAdapter. Only available in the constructor because it may not be
+ * set after Flash Player has been embedded in the page.
+ * @type String
+ */
+ this.getAttributeConfig("swfURL",
+ {
+ method: this._getSWFURL
+ });
+ },
+
+ /**
+ * 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)
+ {
+ return this._swf.setAltText(value);
+ }
+});
+
+/**
+ * Receives event messages from SWF and passes them to the correct instance
+ * of FlashAdapter.
+ *
+ * @method YAHOO.widget.FlashAdapter.eventHandler
+ * @static
+ * @private
+ */
+YAHOO.widget.FlashAdapter.eventHandler = function(elementID, event)
+{
+ var loadedSWF = YAHOO.util.Dom.get(elementID);
+ if(!loadedSWF.owner)
+ {
+ //fix for ie: if owner doesn't exist yet, try again in a moment
+ setTimeout(function() { YAHOO.widget.FlashAdapter.eventHandler( elementID, event ); }, 0);
+ }
+ else
+ {
+ loadedSWF.owner._eventHandler(event);
+ }
+};
+
+/**
+ * The number of proxy functions that have been created.
+ * @static
+ * @private
+ */
+YAHOO.widget.FlashAdapter.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.FlashAdapter.createProxyFunction
+ * @static
+ * @private
+ */
+YAHOO.widget.FlashAdapter.createProxyFunction = function(func)
+{
+ var index = YAHOO.widget.FlashAdapter.proxyFunctionCount;
+ YAHOO.widget.FlashAdapter["proxyFunction" + index] = function()
+ {
+ return func.apply(null, arguments);
+ };
+ YAHOO.widget.FlashAdapter.proxyFunctionCount++;
+ return "YAHOO.widget.FlashAdapter.proxyFunction" + index.toString();
+};
+
+/**
+ * Removes a function created with createProxyFunction()
+ *
+ * @method YAHOO.widget.FlashAdapter.removeProxyFunction
+ * @static
+ * @private
+ */
+YAHOO.widget.FlashAdapter.removeProxyFunction = function(funcName)
+{
+ //quick error check
+ if(!funcName || funcName.indexOf("YAHOO.widget.FlashAdapter.proxyFunction") < 0)
+ {
+ return;
+ }
+
+ funcName = funcName.substr(26);
+ YAHOO.widget.FlashAdapter[funcName] = null;
+};
+
+/**
+ * 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.widget.FlashAdapter
+ * @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, attributes)
+{
+ YAHOO.widget.Chart.superclass.constructor.call(this, YAHOO.widget.Chart.SWFURL, containerId, attributes);
+
+ this._type = type;
+ this._dataSource = dataSource;
+
+ /**
+ * 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.widget.FlashAdapter,
+{
+ /**
+ * 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.FlashAdapter.createProxyFunction()
+ * @property _dataTipFunction
+ * @type String
+ * @private
+ */
+ _dataTipFunction: null,
+
+ /**
+ * Stores references to series labelFunction values created by
+ * YAHOO.widget.FlashAdapter.createProxyFunction()
+ * @property _seriesLabelFunctions
+ * @type Array
+ * @private
+ */
+ _seriesLabelFunctions: 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.FlashAdapter.removeProxyFunction(this._dataTipFunction);
+ }
+
+ //call last
+ YAHOO.widget.Chart.superclass.destroy.call(this);
+ },
+
+ /**
+ * Initializes the attributes.
+ *
+ * @method _initAttributes
+ * @private
+ */
+ _initAttributes: function(attributes)
+ {
+ YAHOO.widget.Chart.superclass._initAttributes.call(this, attributes);
+
+ /**
+ * @attribute request
+ * @description Request to be sent to the Chart's DataSource.
+ * @type String
+ */
+ this.getAttributeConfig("request",
+ {
+ method: this._getRequest
+ });
+
+ this.setAttributeConfig("request",
+ {
+ method: this._setRequest
+ });
+
+ /**
+ * @attribute dataSource
+ * @description The DataSource instance to display in the Chart.
+ * @type DataSource
+ */
+ this.getAttributeConfig("dataSource",
+ {
+ method: this._getDataSource
+ });
+
+ this.setAttributeConfig("dataSource",
+ {
+ method: this._setDataSource
+ });
+
+ /**
+ * @attribute series
+ * @description Defines the series to be displayed by the Chart.
+ * @type Array
+ */
+ this.getAttributeConfig("series",
+ {
+ method: this._getSeriesDefs
+ });
+
+ this.setAttributeConfig("series",
+ {
+ method: this._setSeriesDefs
+ });
+
+ /**
+ * @attribute categoryNames
+ * @description Defines the names of the categories to be displayed in the Chart..
+ * @type Array
+ */
+ this.getAttributeConfig("categoryNames",
+ {
+ method: this._getCategoryNames
+ });
+
+ this.setAttributeConfig("categoryNames",
+ {
+ validator: YAHOO.lang.isArray,
+ method: this._setCategoryNames
+ });
+
+ /**
+ * @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.getAttributeConfig("dataTipFunction",
+ {
+ method: this._getDataTipFunction
+ });
+
+ this.setAttributeConfig("dataTipFunction",
+ {
+ method: this._setDataTipFunction
+ });
+
+ /**
+ * @attribute polling
+ * @description A numeric value indicating the number of milliseconds between
+ * polling requests to the DataSource.
+ * @type Number
+ */
+ this.getAttributeConfig("polling",
+ {
+ method: this._getPolling
+ });
+
+ this.setAttributeConfig("polling",
+ {
+ method: this._setPolling
+ });
+ },
+
+ /**
+ * 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!
+ this._swf.setType(this._type);
+
+ //set initial styles
+ if(this._attributes.style)
+ {
+ var style = this._attributes.style;
+ this.setStyles(style);
+ }
+
+ YAHOO.widget.Chart.superclass._loadHandler.call(this);
+
+ 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._seriesLabelFunctions)
+ {
+ var count = this._seriesLabelFunctions.length;
+ for(i = 0; i < count; i++)
+ {
+ YAHOO.widget.FlashAdapter.removeProxyFunction(this._seriesLabelFunctions[i]);
+ }
+ this._seriesLabelFunction = null;
+ }
+ this._seriesLabelFunctions = [];
+
+ //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 &&
+ typeof currentSeries.labelFunction == "function")
+ {
+ clonedSeries.labelFunction = YAHOO.widget.FlashAdapter.createProxyFunction(currentSeries.labelFunction);
+ this._seriesLabelFunctions.push(clonedSeries.labelFunction);
+ }
+ }
+
+ 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);
+ }
+ 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()
+ {
+ 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.FlashAdapter.removeProxyFunction(this._dataTipFunction);
+ }
+
+ if(value && typeof value == "function")
+ {
+ value = YAHOO.widget.FlashAdapter.createProxyFunction(value);
+ this._dataTipFunction = value;
+ }
+ this._swf.setDataTipFunction(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();
+ }
+});
+
+/**
+ * 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.getAttributeConfig("dataField",
+ {
+ method: this._getDataField
+ });
+
+ this.setAttributeConfig("dataField",
+ {
+ validator: YAHOO.lang.isString,
+ method: this._setDataField
+ });
+
+ /**
+ * @attribute categoryField
+ * @description The field in each item that corresponds to the category value.
+ * @type String
+ */
+ this.getAttributeConfig("categoryField",
+ {
+ method: this._getCategoryField
+ });
+
+ this.setAttributeConfig("categoryField",
+ {
+ validator: YAHOO.lang.isString,
+ method: this._setCategoryField
+ });
+ },
+
+ /**
+ * 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.FlashAdapter.createProxyFunction()
+ * @property _xAxisLabelFunction
+ * @type String
+ * @private
+ */
+ _xAxisLabelFunction: null,
+
+ /**
+ * Stores a reference to the yAxis labelFunction created by
+ * YAHOO.widget.FlashAdapter.createProxyFunction()
+ * @property _yAxisLabelFunction
+ * @type String
+ * @private
+ */
+ _yAxisLabelFunction: null,
+
+ destroy: function()
+ {
+ //remove proxy functions
+ if(this._xAxisLabelFunction)
+ {
+ YAHOO.widget.FlashAdapter.removeProxyFunction(this._xAxisLabelFunction);
+ this._xAxisLabelFunction = null;
+ }
+
+ if(this._yAxisLabelFunction)
+ {
+ YAHOO.widget.FlashAdapter.removeProxyFunction(this._yAxisLabelFunction);
+ this._yAxisLabelFunction = null;
+ }
+
+ //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.getAttributeConfig("xField",
+ {
+ method: this._getXField
+ });
+
+ this.setAttributeConfig("xField",
+ {
+ validator: YAHOO.lang.isString,
+ method: this._setXField
+ });
+
+ /**
+ * @attribute yField
+ * @description The field in each item that corresponds to a value on the x axis.
+ * @type String
+ */
+ this.getAttributeConfig("yField",
+ {
+ method: this._getYField
+ });
+
+ this.setAttributeConfig("yField",
+ {
+ validator: YAHOO.lang.isString,
+ method: this._setYField
+ });
+
+ /**
+ * @attribute xAxis
+ * @description A custom configuration for the horizontal x axis.
+ * @type Axis
+ */
+ this.setAttributeConfig("xAxis",
+ {
+ method: this._setXAxis
+ });
+
+ /**
+ * @attribute yAxis
+ * @description A custom configuration for the vertical y axis.
+ * @type Axis
+ */
+ this.setAttributeConfig("yAxis",
+ {
+ method: this._setYAxis
+ });
+ },
+
+ /**
+ * 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);
+ },
+
+ /**
+ * Setter for the xAxis attribute.
+ *
+ * @method _setXAxis
+ * @private
+ */
+ _setXAxis: function(value)
+ {
+ if(this._xAxisLabelFunction !== null)
+ {
+ YAHOO.widget.FlashAdapter.removeProxyFunction(this._xAxisLabelFunction);
+ this._xAxisLabelFunction = null;
+ }
+
+ var clonedXAxis = {};
+ for(var prop in value)
+ {
+ if(prop == "labelFunction")
+ {
+ if(value.labelFunction !== null)
+ {
+ if(typeof value.labelFunction == "function")
+ {
+ clonedXAxis.labelFunction = YAHOO.widget.FlashAdapter.createProxyFunction(value.labelFunction);
+ }
+ else
+ {
+ clonedXAxis.labelFunction = value.labelFunction;
+ }
+ this._xAxisLabelFunction = clonedXAxis.labelFunction;
+ }
+ }
+ else
+ {
+ clonedXAxis[prop] = value[prop];
+ }
+ }
+ this._swf.setHorizontalAxis(clonedXAxis);
+ },
+
+ /**
+ * Getter for the yAxis attribute.
+ *
+ * @method _setYAxis
+ * @private
+ */
+ _setYAxis: function(value)
+ {
+ if(this._yAxisLabelFunction !== null)
+ {
+ YAHOO.widget.FlashAdapter.removeProxyFunction(this._yAxisLabelFunction);
+ this._yAxisLabelFunction = null;
+ }
+
+ var clonedYAxis = {};
+ for(var prop in value)
+ {
+ if(prop == "labelFunction")
+ {
+ if(value.labelFunction !== null)
+ {
+ if(typeof value.labelFunction == "function")
+ {
+ clonedYAxis.labelFunction = YAHOO.widget.FlashAdapter.createProxyFunction(value.labelFunction);
+ }
+ else
+ {
+ clonedYAxis.labelFunction = value.labelFunction;
+ }
+ this._yAxisLabelFunction = clonedYAxis.labelFunction;
+ }
+ }
+ else
+ {
+ clonedYAxis[prop] = value[prop];
+ }
+ }
+ this._swf.setVerticalAxis(clonedYAxis);
+ }
+});
+
+/**
+ * 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
+});
+
+/**
+ * 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
+});
+
+/**
+ * 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 calcualateCategoryCount
+ * @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
+});
+
+/**
+ * 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.7.0", build: "1799"});