/**
 * This class is used internally by the pivot grid component.
 * @private
 */
Ext.define('Ext.pivot.cell.Group', {
    extend: 'Ext.pivot.cell.Cell',
    xtype: 'pivotgridgroupcell',
 
    config: {
        innerGroupStyle: null,
        innerGroupCls: null,
        userGroupStyle: null,
        userGroupCls: null
    },
 
    innerTemplate: [{
        reference: 'iconElement',
        classList: [
            Ext.baseCSSPrefix + 'pivot-grid-group-icon',
            Ext.baseCSSPrefix + 'font-icon'
        ]
    }, {
        reference: 'groupElement',
        classList: [
            Ext.baseCSSPrefix + 'pivot-grid-group-title'
        ]
    }],
 
    groupCls: Ext.baseCSSPrefix + 'pivot-grid-group',
    groupHeaderCls: Ext.baseCSSPrefix + 'pivot-grid-group-header',
    groupHeaderCollapsibleCls: Ext.baseCSSPrefix + 'pivot-grid-group-header-collapsible',
    groupHeaderCollapsedCls: Ext.baseCSSPrefix + 'pivot-grid-group-header-collapsed',
 
    updateCellCls: function(newCls, oldCls) {
        var me = this,
            classes = typeof newCls === 'string' ? newCls.split(' ') : Ext.Array.from(newCls);
 
        me.callParent([newCls, oldCls]);
 
        me.setEventCell(classes.indexOf(me.groupHeaderCls) < 0);
        me.setCollapsible(classes.indexOf(me.groupHeaderCollapsibleCls) >= 0);
    },
 
    updateInnerGroupStyle: function(cellStyle) {
        this.groupElement.applyStyles(cellStyle);
    },
 
    updateInnerGroupCls: function(cls, oldCls) {
        this.groupElement.replaceCls(oldCls, cls);
    },
 
    updateUserGroupStyle: function(cellStyle) {
        this.groupElement.applyStyles(cellStyle);
    },
 
    updateUserGroupCls: function(cls, oldCls) {
        this.groupElement.replaceCls(oldCls, cls);
    },
 
    updateRawValue: function(rawValue) {
        var dom = this.groupElement.dom,
            value = rawValue == null ? '' : rawValue;
 
        if (this.getEncodeHtml()) {
            dom.textContent = value;
        }
        else {
            dom.innerHTML = value;
        }
    },
 
    updateRecord: function(record, oldRecord) {
        var me = this,
            info = me.row.getRecordInfo(),
            dataIndex = me.dataIndex;
 
        if (info && dataIndex) {
            info = info.rendererParams[dataIndex];
 
            if (info && me[info.fn]) {
                me[info.fn](info, me.row.getGrid());
            }
            else {
                me.setCellCls('');
            }
        }
 
        me.callParent([record, oldRecord]);
    },
 
    groupOutlineRenderer: function(config, grid) {
        var me = this,
            cellCls = '',
            group = config.group;
 
        if (grid.getMatrix().viewLayoutType === 'compact') {
            // the grand total uses this renderer in compact view and margins need to be reset
            me.bodyElement.setStyle(grid.isRTL() ? 'padding-right' : 'padding-left', '0');
        }
 
        if (config.colspan > 0) {
            cellCls += me.groupHeaderCls + ' ' + me.outlineGroupHeaderCls;
 
            if (!config.subtotalRow) {
                if (group && group.children && group.axis.matrix.collapsibleRows) {
                    cellCls += ' ' + me.groupHeaderCollapsibleCls;
 
                    if (!config.group.expanded) {
                        cellCls += ' ' + me.groupHeaderCollapsedCls;
                    }
                }
 
                if (config.previousExpanded) {
                    cellCls += ' ' + me.outlineCellGroupExpandedCls;
                }
            }
 
            me.setCellCls(cellCls);
            me.setInnerGroupCls(me.groupCls);
 
            return;
        }
 
        me.setCellCls(me.outlineCellHiddenCls);
    },
 
    recordOutlineRenderer: function(config, grid) {
        var me = this;
 
        if (config.hidden) {
            me.setCellCls(me.outlineCellHiddenCls);
 
            return;
        }
 
        me.setCellCls(me.groupHeaderCls);
    },
 
    groupCompactRenderer: function(config, grid) {
        var me = this,
            cellCls = '',
            group = config.group;
 
        me.bodyElement.setStyle(
            grid.isRTL() ? 'padding-right' : 'padding-left',
            (me.compactLayoutPadding * group.level) + 'px'
        );
 
        cellCls += me.groupHeaderCls + ' ' + me.compactGroupHeaderCls;
 
        if (!config.subtotalRow) {
            if (group && group.children && group.axis.matrix.collapsibleRows) {
                cellCls += ' ' + me.groupHeaderCollapsibleCls;
 
                if (!config.group.expanded) {
                    cellCls += ' ' + me.groupHeaderCollapsedCls;
                }
            }
 
            if (config.previousExpanded) {
                cellCls += ' ' + me.outlineCellGroupExpandedCls;
            }
        }
 
        me.setCellCls(cellCls);
        me.setInnerGroupCls(me.groupCls);
    },
 
    recordCompactRenderer: function(config, grid) {
        var me = this;
 
        me.bodyElement.setStyle(
            grid.isRTL() ? 'padding-right' : 'padding-left',
            (me.compactLayoutPadding * config.group.level) + 'px'
        );
 
        me.setCellCls(me.groupHeaderCls + ' ' + me.compactGroupHeaderCls);
    },
 
    groupTabularRenderer: function(config, grid) {
        var me = this,
            cellCls = '',
            group = config.group;
 
        cellCls += me.groupHeaderCls + ' ' + me.tabularGroupHeaderCls;
 
        if (!config.subtotalRow && !config.hidden) {
            if (group && group.children && group.axis.matrix.collapsibleRows) {
                cellCls += ' ' + me.groupHeaderCollapsibleCls;
 
                if (!group.expanded) {
                    cellCls += ' ' + me.groupHeaderCollapsedCls;
                }
            }
        }
 
        me.setCellCls(cellCls);
        me.setInnerGroupCls(me.groupCls);
    },
 
    recordTabularRenderer: function(config) {
        var me = this;
 
        if (config.hidden) {
            me.setCellCls(me.outlineCellHiddenCls);
 
            return;
        }
 
        me.setCellCls(me.groupHeaderCls);
    }
});