src/cm/media/js/lib/yui/yui_3.10.3/build/axis-base/axis-base.js
changeset 525 89ef5ed3c48b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/media/js/lib/yui/yui_3.10.3/build/axis-base/axis-base.js	Tue Jul 16 14:29:46 2013 +0200
@@ -0,0 +1,814 @@
+/*
+YUI 3.10.3 (build 2fb5187)
+Copyright 2013 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+
+YUI.add('axis-base', function (Y, NAME) {
+
+/**
+ * The Charts widget provides an api for displaying data
+ * graphically.
+ *
+ * @module charts
+ * @main charts
+ */
+
+/**
+ * Provides functionality for the handling of axis data in a chart.
+ *
+ * @module charts
+ * @submodule axis-base
+ */
+var Y_Lang = Y.Lang;
+
+/**
+ * The Renderer class is a base class for chart components that use the `styles`
+ * attribute.
+ *
+ * @module charts
+ * @class Renderer
+ * @constructor
+ */
+function Renderer(){}
+
+Renderer.ATTRS = {
+        /**
+         * Style properties for class
+         *
+         * @attribute styles
+         * @type Object
+         */
+        styles:
+        {
+            getter: function()
+            {
+                this._styles = this._styles || this._getDefaultStyles();
+                return this._styles;
+            },
+
+            setter: function(val)
+            {
+                this._styles = this._setStyles(val);
+            }
+        },
+
+        /**
+         * The graphic in which drawings will be rendered.
+         *
+         * @attribute graphic
+         * @type Graphic
+         */
+        graphic: {}
+};
+Renderer.NAME = "renderer";
+
+Renderer.prototype = {
+    /**
+     * Storage for `styles` attribute.
+     *
+     * @property _styles
+     * @type Object
+     * @private
+     */
+	_styles: null,
+
+    /**
+     * Method used by `styles` setter.
+     *
+     * @method _setStyles
+     * @param {Object} newStyles Hash of properties to update.
+     * @return Object
+     * @protected
+     */
+	_setStyles: function(newstyles)
+	{
+		var styles = this.get("styles");
+        return this._mergeStyles(newstyles, styles);
+	},
+
+    /**
+     * Merges to object literals so that only specified properties are
+     * overwritten.
+     *
+     * @method _mergeStyles
+     * @param {Object} a Hash of new styles
+     * @param {Object} b Hash of original styles
+     * @return Object
+     * @protected
+     */
+    _mergeStyles: function(a, b)
+    {
+        if(!b)
+        {
+            b = {};
+        }
+        var newstyles = Y.merge(b, {});
+        Y.Object.each(a, function(value, key)
+        {
+            if(b.hasOwnProperty(key) && Y_Lang.isObject(value) && !Y_Lang.isFunction(value) && !Y_Lang.isArray(value))
+            {
+                newstyles[key] = this._mergeStyles(value, b[key]);
+            }
+            else
+            {
+                newstyles[key] = value;
+            }
+        }, this);
+        return newstyles;
+    },
+
+    /**
+     * Gets the default value for the `styles` attribute.
+     *
+     * @method _getDefaultStyles
+     * @return Object
+     * @protected
+     */
+    _getDefaultStyles: function()
+    {
+        return {padding:{
+            top:0,
+            right: 0,
+            bottom: 0,
+            left: 0
+        }};
+    }
+};
+
+Y.augment(Renderer, Y.Attribute);
+Y.Renderer = Renderer;
+
+/**
+ * The axis-base submodule contains functionality for the handling of axis data in a chart.
+ *
+ * @module charts
+ * @submodule axis-base
+ */
+/**
+ * An abstract class that provides the core functionality used by the following classes:
+ * <ul>
+ *      <li>{{#crossLink "CategoryAxisBase"}}{{/crossLink}}</li>
+ *      <li>{{#crossLink "NumericAxisBase"}}{{/crossLink}}</li>
+ *      <li>{{#crossLink "StackedAxisBase"}}{{/crossLink}}</li>
+ *      <li>{{#crossLink "TimeAxisBase"}}{{/crossLink}}</li>
+ *      <li>{{#crossLink "CategoryAxis"}}{{/crossLink}}</li>
+ *      <li>{{#crossLink "NumericAxis"}}{{/crossLink}}</li>
+ *      <li>{{#crossLink "StackedAxis"}}{{/crossLink}}</li>
+ *      <li>{{#crossLink "TimeAxis"}}{{/crossLink}}</li>
+ *  </ul>
+ *
+ * @class AxisBase
+ * @constructor
+ * @extends Base
+ * @uses Renderer
+ * @param {Object} config (optional) Configuration parameters.
+ * @submodule axis-base
+ */
+Y.AxisBase = Y.Base.create("axisBase", Y.Base, [Y.Renderer], {
+    /**
+     * @method initializer
+     * @private
+     */
+    initializer: function()
+    {
+        this.after("minimumChange", Y.bind(this._keyChangeHandler, this));
+        this.after("maximumChange", Y.bind(this._keyChangeHandler, this));
+        this.after("keysChange", this._keyChangeHandler);
+        this.after("dataProviderChange", this._dataProviderChangeHandler);
+    },
+
+    /**
+     * Handles changes to `dataProvider`.
+     *
+     * @method _dataProviderChangeHandler
+     * @param {Object} e Event object.
+     * @private
+     */
+    _dataProviderChangeHandler: function()
+    {
+        var keyCollection = this.get("keyCollection").concat(),
+            keys = this.get("keys"),
+            i;
+        if(keys)
+        {
+            for(i in keys)
+            {
+                if(keys.hasOwnProperty(i))
+                {
+                    delete keys[i];
+                }
+            }
+        }
+        if(keyCollection && keyCollection.length)
+        {
+            this.set("keys", keyCollection);
+        }
+    },
+
+    /**
+     * Calculates the maximum and minimum values for the `Data`.
+     *
+     * @method _updateMinAndMax
+     * @private
+     */
+    _updateMinAndMax: function() {
+    },
+
+    /**
+     * Constant used to generate unique id.
+     *
+     * @property GUID
+     * @type String
+     * @private
+     */
+    GUID: "yuibaseaxis",
+
+    /**
+     * Type of data used in `Axis`.
+     *
+     * @property _type
+     * @type String
+     * @readOnly
+     * @private
+     */
+    _type: null,
+
+    /**
+     * Storage for `setMaximum` attribute.
+     *
+     * @property _setMaximum
+     * @type Object
+     * @private
+     */
+    _setMaximum: null,
+
+    /**
+     * Storage for `setMinimum` attribute.
+     *
+     * @property _setMinimum
+     * @type Object
+     * @private
+     */
+    _setMinimum: null,
+
+    /**
+     * Reference to data array.
+     *
+     * @property _data
+     * @type Array
+     * @private
+     */
+    _data: null,
+
+    /**
+     * Indicates whether the all data is up to date.
+     *
+     * @property _updateTotalDataFlag
+     * @type Boolean
+     * @private
+     */
+    _updateTotalDataFlag: true,
+
+    /**
+     * Storage for `dataReady` attribute.
+     *
+     * @property _dataReady
+     * @type Boolean
+     * @readOnly
+     * @private
+     */
+    _dataReady: false,
+
+    /**
+     * Adds an array to the key hash.
+     *
+     * @method addKey
+     * @param value Indicates what key to use in retrieving
+     * the array.
+     */
+    addKey: function (value)
+	{
+        this.set("keys", value);
+	},
+
+    /**
+     * Gets an array of values based on a key.
+     *
+     * @method _getKeyArray
+     * @param {String} key Value key associated with the data array.
+     * @param {Array} data Array in which the data resides.
+     * @return Array
+     * @private
+     */
+    _getKeyArray: function(key, data)
+    {
+        var i = 0,
+            obj,
+            keyArray = [],
+            len = data.length;
+        for(; i < len; ++i)
+        {
+            obj = data[i];
+            keyArray[i] = obj[key];
+        }
+        return keyArray;
+    },
+
+    /**
+     * Updates the total data array.
+     *
+     * @method _updateTotalData
+     * @private
+     */
+    _updateTotalData: function()
+    {
+		var keys = this.get("keys"),
+            i;
+        this._data = [];
+        for(i in keys)
+        {
+            if(keys.hasOwnProperty(i))
+            {
+                this._data = this._data.concat(keys[i]);
+            }
+        }
+        this._updateTotalDataFlag = false;
+    },
+
+    /**
+     * Removes an array from the key hash.
+     *
+     * @method removeKey
+     * @param {String} value Indicates what key to use in removing from
+     * the hash.
+     */
+    removeKey: function(value)
+    {
+        var keys = this.get("keys");
+        if(keys.hasOwnProperty(value))
+        {
+            delete keys[value];
+            this._keyChangeHandler();
+        }
+    },
+
+    /**
+     * Returns a value based of a key value and an index.
+     *
+     * @method getKeyValueAt
+     * @param {String} key value used to look up the correct array
+     * @param {Number} index within the array
+     * @return Number
+     */
+    getKeyValueAt: function(key, index)
+    {
+        var value = NaN,
+            keys = this.get("keys");
+        if(keys[key] && Y_Lang.isNumber(parseFloat(keys[key][index])))
+        {
+            value = keys[key][index];
+        }
+        return parseFloat(value);
+    },
+
+    /**
+     * Returns values based on key identifiers. When a string is passed as an argument, an array of values is returned.
+     * When an array of keys is passed as an argument, an object literal with an array of values mapped to each key is
+     * returned.
+     *
+     * @method getDataByKey
+     * @param {String|Array} value value used to identify the array
+     * @return Array|Object
+     */
+    getDataByKey: function (value)
+    {
+        var obj,
+            i,
+            len,
+            key,
+            keys = this.get("keys");
+        if(Y_Lang.isArray(value))
+        {
+            obj = {};
+            len = value.length;
+            for(i = 0; i < len; i = i + 1)
+            {
+                key = value[i];
+                if(keys[key])
+                {
+                    obj[key] = this.getDataByKey(key);
+                }
+            }
+        }
+        else if(keys[value])
+        {
+            obj = keys[value];
+        }
+        else
+        {
+            obj = null;
+        }
+        return obj;
+    },
+
+    /**
+     * Returns the total number of majorUnits that will appear on an axis.
+     *
+     * @method getTotalMajorUnits
+     * @return Number
+     */
+    getTotalMajorUnits: function()
+    {
+        var units,
+            majorUnit = this.get("styles").majorUnit;
+        units = majorUnit.count;
+        return units;
+    },
+
+    /**
+     * Gets the distance that the first and last ticks are offset from there respective
+     * edges.
+     *
+     * @method getEdgeOffset
+     * @param {Number} ct Number of ticks on the axis.
+     * @param {Number} l Length (in pixels) of the axis.
+     * @return Number
+     */
+    getEdgeOffset: function(ct, l)
+    {
+        var edgeOffset;
+        if(this.get("calculateEdgeOffset")) {
+            edgeOffset = (l/ct)/2;
+        } else {
+            edgeOffset = 0;
+        }
+        return edgeOffset;
+    },
+
+    /**
+     * Updates the `Axis` after a change in keys.
+     *
+     * @method _keyChangeHandler
+     * @param {Object} e Event object.
+     * @private
+     */
+    _keyChangeHandler: function()
+    {
+        this._updateMinAndMax();
+        this._updateTotalDataFlag = true;
+        this.fire("dataUpdate");
+    },
+
+    /**
+     * Gets the default value for the `styles` attribute. Overrides
+     * base implementation.
+     *
+     * @method _getDefaultStyles
+     * @return Object
+     * @protected
+     */
+    _getDefaultStyles: function()
+    {
+        var axisstyles = {
+            majorUnit: {
+                determinant:"count",
+                count:11,
+                distance:75
+            }
+        };
+        return axisstyles;
+    },
+
+    /**
+     * Getter method for maximum attribute.
+     *
+     * @method _maximumGetter
+     * @return Number
+     * @private
+     */
+    _maximumGetter: function ()
+    {
+        var max = this.get("dataMaximum"),
+            min = this.get("minimum");
+        //If all values are zero, force a range so that the Axis and related series
+        //will still render.
+        if(min === 0 && max === 0)
+        {
+            max = 10;
+        }
+        if(Y_Lang.isNumber(this._setMaximum))
+        {
+            max = this._setMaximum;
+        }
+        return parseFloat(max);
+    },
+
+    /**
+     * Setter method for maximum attribute.
+     *
+     * @method _maximumSetter
+     * @param {Object} value
+     * @private
+     */
+    _maximumSetter: function (value)
+    {
+        this._setMaximum = parseFloat(value);
+        return value;
+    },
+
+    /**
+     * Getter method for minimum attribute.
+     *
+     * @method _minimumGetter
+     * @return Number
+     * @private
+     */
+    _minimumGetter: function ()
+    {
+        var min = this.get("dataMinimum");
+        if(Y_Lang.isNumber(this._setMinimum))
+        {
+            min = this._setMinimum;
+        }
+        return parseFloat(min);
+    },
+
+    /**
+     * Setter method for minimum attribute.
+     *
+     * @method _minimumSetter
+     * @param {Object} value
+     * @private
+     */
+    _minimumSetter: function(val)
+    {
+        this._setMinimum = parseFloat(val);
+        return val;
+    },
+
+    /**
+     * Indicates whether or not the maximum attribute has been explicitly set.
+     *
+     * @method _getSetMax
+     * @return Boolean
+     * @private
+     */
+    _getSetMax: function()
+    {
+        return Y_Lang.isNumber(this._setMaximum);
+    },
+
+    /**
+     * Indicates whether or not the minimum attribute has been explicitly set.
+     *
+     * @method _getSetMin
+     * @return Boolean
+     * @private
+     */
+    _getSetMin: function()
+    {
+        return Y_Lang.isNumber(this._setMinimum);
+    }
+}, {
+    ATTRS: {
+        /**
+         * Determines whether and offset is automatically calculated for the edges of the axis.
+         *
+         * @attribute calculateEdgeOffset
+         * @type Boolean
+         */
+        calculateEdgeOffset: {
+            value: false
+        },
+
+        labelFunction: {
+            valueFn: function() {
+                return this.formatLabel;
+            }
+        },
+
+        /**
+         * Hash of array identifed by a string value.
+         *
+         * @attribute keys
+         * @type Object
+         */
+        keys: {
+            value: {},
+
+            setter: function(val)
+            {
+                var keys = {},
+                    i,
+                    len,
+                    data = this.get("dataProvider");
+                if(Y_Lang.isArray(val))
+                {
+                    len = val.length;
+                    for(i = 0; i < len; ++i)
+                    {
+                        keys[val[i]] = this._getKeyArray(val[i], data);
+                    }
+
+                }
+                else if(Y_Lang.isString(val))
+                {
+                    keys = this.get("keys");
+                    keys[val] = this._getKeyArray(val, data);
+                }
+                else
+                {
+                    for(i in val)
+                    {
+                        if(val.hasOwnProperty(i))
+                        {
+                            keys[i] = this._getKeyArray(i, data);
+                        }
+                    }
+                }
+                this._updateTotalDataFlag = true;
+                return keys;
+            }
+        },
+
+        /**
+         *Returns the type of axis data
+         *  <dl>
+         *      <dt>time</dt><dd>Manages time data</dd>
+         *      <dt>stacked</dt><dd>Manages stacked numeric data</dd>
+         *      <dt>numeric</dt><dd>Manages numeric data</dd>
+         *      <dt>category</dt><dd>Manages categorical data</dd>
+         *  </dl>
+         *
+         * @attribute type
+         * @type String
+         */
+        type:
+        {
+            readOnly: true,
+
+            getter: function ()
+            {
+                return this._type;
+            }
+        },
+
+        /**
+         * Instance of `ChartDataProvider` that the class uses
+         * to build its own data.
+         *
+         * @attribute dataProvider
+         * @type Array
+         */
+        dataProvider:{
+            setter: function (value)
+            {
+                return value;
+            }
+        },
+
+        /**
+         * The maximum value contained in the `data` array. Used for
+         * `maximum` when `autoMax` is true.
+         *
+         * @attribute dataMaximum
+         * @type Number
+         */
+        dataMaximum: {
+            getter: function ()
+            {
+                if(!Y_Lang.isNumber(this._dataMaximum))
+                {
+                    this._updateMinAndMax();
+                }
+                return this._dataMaximum;
+            }
+        },
+
+        /**
+         * The maximum value that will appear on an axis.
+         *
+         * @attribute maximum
+         * @type Number
+         */
+        maximum: {
+            lazyAdd: false,
+
+            getter: "_maximumGetter",
+
+            setter: "_maximumSetter"
+        },
+
+        /**
+         * The minimum value contained in the `data` array. Used for
+         * `minimum` when `autoMin` is true.
+         *
+         * @attribute dataMinimum
+         * @type Number
+         */
+        dataMinimum: {
+            getter: function ()
+            {
+                if(!Y_Lang.isNumber(this._dataMinimum))
+                {
+                    this._updateMinAndMax();
+                }
+                return this._dataMinimum;
+            }
+        },
+
+        /**
+         * The minimum value that will appear on an axis.
+         *
+         * @attribute minimum
+         * @type Number
+         */
+        minimum: {
+            lazyAdd: false,
+
+            getter: "_minimumGetter",
+
+            setter: "_minimumSetter"
+        },
+
+        /**
+         * Determines whether the maximum is calculated or explicitly
+         * set by the user.
+         *
+         * @attribute setMax
+         * @type Boolean
+         */
+        setMax: {
+            readOnly: true,
+
+            getter: "_getSetMax"
+        },
+
+        /**
+         * Determines whether the minimum is calculated or explicitly
+         * set by the user.
+         *
+         * @attribute setMin
+         * @type Boolean
+         */
+        setMin: {
+            readOnly: true,
+
+            getter: "_getSetMin"
+        },
+
+        /**
+         * Array of axis data
+         *
+         * @attribute data
+         * @type Array
+         */
+        data: {
+            getter: function ()
+            {
+                if(!this._data || this._updateTotalDataFlag)
+                {
+                    this._updateTotalData();
+                }
+                return this._data;
+            }
+        },
+
+        /**
+         * Array containing all the keys in the axis.
+
+         * @attribute keyCollection
+         * @type Array
+         */
+        keyCollection: {
+            getter: function()
+            {
+                var keys = this.get("keys"),
+                    i,
+                    col = [];
+                for(i in keys)
+                {
+                    if(keys.hasOwnProperty(i))
+                    {
+                        col.push(i);
+                    }
+                }
+                return col;
+            },
+            readOnly: true
+        },
+
+        /**
+         * Object which should have by the labelFunction
+         *
+         * @attribute labelFunctionScope
+         * @type Object
+         */
+        labelFunctionScope: {}
+    }
+});
+
+
+}, '3.10.3', {"requires": ["classnamemanager", "datatype-number", "datatype-date", "base", "event-custom"]});