/**
 * @class Ext.chart.series.Bar
 * @extends Ext.chart.series.StackedCartesian
 * 
 * Creates a Bar Chart.
 * 
 *     @example
 *     Ext.create('Ext.Container', {
 *         renderTo: Ext.getBody(),
 *         width: 600,
 *         height: 400,
 *         layout: 'fit',
 *         items: {
 *             xtype: 'cartesian',
 *             store: {
 *                 fields: ['name', 'value'],
 *                 data: [
 *                     {name: 'metric one', value: 10},
 *                     {name: 'metric two', value: 7},
 *                     {name: 'metric three', value: 5},
 *                     {name: 'metric four', value: 2},
 *                     {name: 'metric five', value: 27}
 *                 ]
 *             },
 *             axes: [{
 *                 type: 'numeric',
 *                 position: 'left',
 *                 title: {
 *                     text: 'Sample Values',
 *                     fontSize: 15
 *                 },
 *                 fields: 'value'
 *             }, {
 *                 type: 'category',
 *                 position: 'bottom',
 *                 title: {
 *                     text: 'Sample Values',
 *                     fontSize: 15
 *                 },
 *                 fields: 'name'
 *             }],
 *             series: {
 *                 type: 'bar',
 *                 xField: 'name',
 *                 yField: 'value',
 *                 style: {
 *                     fill: 'blue'
 *                 }
 *             }
 *         }
 *     });
 */
Ext.define('Ext.chart.series.Bar', {
 
    extend: 'Ext.chart.series.StackedCartesian',
 
    alias: 'series.bar',
    type: 'bar',
    seriesType: 'barSeries',
 
    requires: [
        'Ext.chart.series.sprite.Bar',
        'Ext.draw.sprite.Rect'
    ],
 
    config: {
        /**
         * @private
         * @cfg {Object} itemInstancing Sprite template used for series.
         */
        itemInstancing: {
            type: 'rect',
            fx: {
                customDurations: {
                    x: 0,
                    y: 0,
                    width: 0,
                    height: 0,
                    radius: 0
                }
            }
        }
    },
 
    getItemForPoint: function (x, y) {
        if (this.getSprites()) {
            var me = this,
                chart = me.getChart(),
                padding = chart.getInnerPadding(),
                isRtl = chart.getInherited().rtl;
 
            // Convert the coordinates because the "items" sprites that draw the bars ignore the chart's InnerPadding. 
            // See also Ext.chart.series.sprite.Bar.getIndexNearPoint(x,y) regarding the series's vertical coordinate system. 
            arguments[0] = x + (isRtl ? padding.right : -padding.left);
            arguments[1] = y + padding.bottom;
            return me.callParent(arguments);
        }
    },
 
    updateXAxis: function (axis) {
        axis.setLabelInSpan(true);
        this.callParent(arguments);
    },
 
    updateHidden: function (hidden) {
        this.callParent(arguments);
        this.updateStacked();
    },
 
    updateStacked: function (stacked) {
        var sprites = this.getSprites(),
            ln = sprites.length,
            visible = [],
            attrs = {}, i;
 
        for (= 0; i < ln; i++) {
            if (!sprites[i].attr.hidden) {
                visible.push(sprites[i]);
            }
        }
        ln = visible.length;
 
        if (this.getStacked()) {
            attrs.groupCount = 1;
            attrs.groupOffset = 0;
            for (= 0; i < ln; i++) {
                visible[i].setAttributes(attrs);
            }
        } else {
            attrs.groupCount = visible.length;
            for (= 0; i < ln; i++) {
                attrs.groupOffset = i;
                visible[i].setAttributes(attrs);
            }
        }
        this.callParent(arguments);
    }
});