/**
 * This class is used internally by the pivot grid component.
 * @private
 */
Ext.define('Ext.pivot.cell.Cell', {
    extend: 'Ext.grid.cell.Cell',
    xtype: 'pivotgridcell',
 
    config: {
        eventCell: true,
        collapsible: null
    },
 
    // outline view css classes
    outlineGroupHeaderCls: Ext.baseCSSPrefix + 'pivot-grid-group-header-outline',
    outlineCellHiddenCls: Ext.baseCSSPrefix + 'pivot-grid-outline-cell-hidden',
    outlineCellGroupExpandedCls: Ext.baseCSSPrefix + 'pivot-grid-outline-cell-previous-expanded',
 
    // compact view css classes
    compactGroupHeaderCls: Ext.baseCSSPrefix + 'pivot-grid-group-header-compact',
    compactLayoutPadding: 25,
 
    // tabular view css classes
    tabularGroupHeaderCls: Ext.baseCSSPrefix + 'pivot-grid-group-header-tabular',
 
    encodeHtml: false,
 
    onRender: function() {
        var me = this,
            dataIndex = me.dataIndex,
            model = me.getViewModel(),
            record = me.getRecord(),
            matrix;
 
        me.callParent();
 
        if (model && dataIndex) {
            matrix = me.row.getGrid().getMatrix();
            model.setData({
                column: matrix.modelInfo[dataIndex] || {},
                value: me.getValue(),
                record: record
            });
        }
    },
 
    handleEvent: function(type, e) {
        var me = this,
            row = me.row,
            grid = row.getGrid(),
            record = me.getRecord(),
            params = {
                grid: grid
            },
            info, eventName, ret, column, leftKey, topKey,
            matrix, leftItem, topItem;
 
        if (!record) {
            return;
        }
 
        eventName = row.getEventName() || '';
 
        info = row.getRecordInfo(record);
        matrix = grid.getMatrix();
        column = me.getColumn();
 
        leftItem = info.rendererParams[column._dataIndex];
 
        if (!leftItem) {
            leftItem = info.rendererParams.topaxis;
        }
 
        leftItem = leftItem ? leftItem.group : null;
        leftKey = leftItem ? leftItem.key : info.leftKey;
 
        Ext.apply(params, {
            cell: me,
            leftKey: leftKey,
            leftItem: leftItem,
            column: column
        });
 
        if (me.getEventCell()) {
            eventName += 'cell';
            topKey = grid.getTopAxisKey(params.column);
            params.topKey = topKey;
 
            if (topKey) {
                topItem = matrix.topAxis.findTreeElement('key', topKey);
                topItem = topItem ? topItem.node : null;
 
                if (topItem) {
                    Ext.apply(params, {
                        topItem: topItem,
                        dimensionId: topItem.dimensionId
                    });
                }
            }
        }
 
        ret = grid.fireEvent(eventName + type, params, e);
 
        if (ret !== false && type === 'tap' && me.getCollapsible()) {
            if (leftItem.expanded) {
                leftItem.collapse();
            }
            else {
                leftItem.expand();
            }
        }
 
        return false;
    },
 
    updateRecord: function(record, oldRecord) {
        var model = this.getViewModel();
 
        this.callParent([ record, oldRecord ]);
 
        if (model) {
            model.setData({
                value: this.getValue(),
                record: record
            });
        }
    }
});