/**
 * @private
 */
Ext.define('Ext.grid.plugin.grouping.DragZone', {
    extend: 'Ext.dd.DragZone',
 
    groupColumnSelector: '.' + Ext.baseCSSPrefix + 'grid-group-column',
    groupColumnInnerSelector: '.' + Ext.baseCSSPrefix + 'grid-group-column-inner',
    maxProxyWidth: 120,
    dragging: false,
 
    constructor: function(panel) {
        var me = this;
 
        me.panel = panel;
        me.ddGroup = me.getDDGroup();
        me.callParent([panel.el]);
    },
 
    getDDGroup: function() {
        // return the column header dd group so we can allow column
        // dropping inside the grouping panel
        return 'header-dd-zone-' + this.panel.up('[scrollerOwner]').id;
    },
 
    getDragData: function(e) {
        var header, headerCmp, headerCol, ddel;
 
        if (e.getTarget(this.groupColumnInnerSelector)) {
            header = e.getTarget(this.groupColumnSelector);
 
            if (header) {
                headerCmp = Ext.getCmp(header.id);
                headerCol = Ext.getCmp(headerCmp.idColumn);
 
                if (!this.panel.dragging) {
                    ddel = document.createElement('div');
                    ddel.innerHTML = headerCmp.getHeader();
 
                    return {
                        ddel: ddel,
                        header: headerCol,
                        groupcol: headerCmp
                    };
                }
            }
        }
 
        return false;
    },
 
    onBeforeDrag: function() {
        return !(this.panel.dragging || this.disabled);
    },
 
    onInitDrag: function() {
        this.panel.dragging = true;
        this.callParent(arguments);
    },
 
    onDragDrop: function() {
        var me = this,
            dropCol, groupCol;
 
        if (!me.dragData.dropLocation) {
            me.panel.dragging = false;
            me.callParent(arguments);
 
            return;
        }
 
        /*
            when a column is dragged out from the grouping panel we have to do the following:
            1. remove the column from grouping panel
            2. adjust the grid groupers
        */
        dropCol = me.dragData.dropLocation.header;
        groupCol = me.dragData.groupcol;
 
        if (dropCol.isColumn) {
            me.panel.removeColumn(groupCol);
        }
 
        me.panel.dragging = false;
        me.callParent(arguments);
    },
 
    afterRepair: function() {
        this.callParent();
        this.panel.dragging = false;
    },
 
    getRepairXY: function() {
        return this.dragData.header.el.getXY();
    },
 
    disable: function() {
        this.disabled = true;
    },
 
    enable: function() {
        this.disabled = false;
    }
 
});