/**
 * 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 );
    }
 
 
});