/* 
 * Fixes issue in version 3.2.1
 * 
 * [FIXED-995] ColumnHeaderGroup interferes with GridFilters men
 * http://www.sencha.com/forum/showthread.php?88836-OPEN-995-ColumnHeaderGroup-interferes-with-GridFilters-menu&langid=14
 */
Ext.apply(Ext.ux.grid.ColumnHeaderGroup.prototype.viewConfig, {
    beforeColMenuShow: function(){
        var cm = this.cm, rows = this.cm.rows;
        this.colMenu.removeAll();
        for(var col = 0, clen = cm.getColumnCount(); col < clen; col++){
            var menu = this.colMenu, title = cm.getColumnHeader(col), text = [];
            if(cm.config[col].fixed !== true && cm.config[col].hideable !== false){
                for(var row = 0, rlen = rows.length; row < rlen; row++){
                    var r = rows[row], group, gcol = 0;
                    for(var i = 0, len = r.length; i < len; i++){
                        group = r[i];
                        if(col >= gcol && col < gcol + group.colspan){
                            break;
                        }
                        gcol += group.colspan;
                    }
                    if(group && group.header){
                        if(cm.hierarchicalColMenu){
                            var gid = 'group-' + row + '-' + gcol;
                            var item = menu.items ? menu.getComponent(gid) : null;
                            var submenu = item ? item.menu : null;
                            if(!submenu){
                                submenu = new Ext.menu.Menu({
                                    itemId: gid
                                });
                                submenu.on("itemclick", this.handleHdMenuClick, this);
                                var checked = false, disabled = true;
                                for(var c = gcol, lc = gcol + group.colspan; c < lc; c++){
                                    if(!cm.isHidden(c)){
                                        checked = true;
                                    }
                                    if(cm.config[c].hideable !== false){
                                        disabled = false;
                                    }
                                }
                                menu.add({
                                    itemId: gid,
                                    text: group.header,
                                    menu: submenu,
                                    hideOnClick: false,
                                    checked: checked,
                                    disabled: disabled
                                });
                            }
                            menu = submenu;
                        }else{
                            text.push(group.header);
                        }
                    }
                }
                text.push(title);
                menu.add(new Ext.menu.CheckItem({
                    itemId: "col-" + cm.getColumnId(col),
                    text: text.join(' '),
                    checked: !cm.isHidden(col),
                    hideOnClick: false,
                    disabled: cm.config[col].hideable === false
                }));
            }
        }
    },
    handleHdMenuClick: function(item){
        var index = this.hdCtxIndex, cm = this.cm, ds = this.ds, id = item.getItemId();
        switch(id){
            case 'asc':
                ds.sort(cm.getDataIndex(index), 'ASC');
                break;
            case 'desc':
                ds.sort(cm.getDataIndex(index), 'DESC');
                break;
            default:
                if(id.substr(0, 6) == 'group-'){
                    var i = id.split('-'), row = parseInt(i[1], 10), col = parseInt(i[2], 10), r = this.cm.rows[row], group, gcol = 0;
                    for(var i = 0, len = r.length; i < len; i++){
                        group = r[i];
                        if(col >= gcol && col < gcol + group.colspan){
                            break;
                        }
                        gcol += group.colspan;
                    }
                    if(item.checked){
                        var max = cm.getColumnsBy(this.isHideableColumn, this).length;
                        for(var i = gcol, len = gcol + group.colspan; i < len; i++){
                            if(!cm.isHidden(i)){
                                max--;
                            }
                        }
                        if(max < 1){
                            this.onDenyColumnHide();
                            return false;
                        }
                    }
                    for(var i = gcol, len = gcol + group.colspan; i < len; i++){
                        if(cm.config[i].fixed !== true && cm.config[i].hideable !== false){
                            cm.setHidden(i, item.checked);
                        }
                    }
                }else if(id.substr(0, 4) == 'col-'){
                    index = cm.getIndexById(id.substr(4));
                    if(index != -1){
                        if(item.checked && cm.getColumnsBy(this.isHideableColumn, this).length <= 1){
                            this.onDenyColumnHide();
                            return false;
                        }
                        cm.setHidden(index, item.checked);
                    }
                }
                if(id.substr(0, 6) == 'group-' || id.substr(0, 4) == 'col-'){
                    item.checked = !item.checked;
                    if(item.menu){
                        var updateChildren = function(menu){
                            menu.items.each(function(childItem){
                                if(!childItem.disabled){
                                    childItem.setChecked(item.checked, false);
                                    if(childItem.menu){
                                        updateChildren(childItem.menu);
                                    }
                                }
                            });
                        }
                        updateChildren(item.menu);
                    }
                    var parentMenu = item, parentItem;
                    while(parentMenu = parentMenu.parentMenu){
                        if(!parentMenu.parentMenu || !(parentItem = parentMenu.parentMenu.items.get(parentMenu.getItemId())) || !parentItem.setChecked){
                            break;
                        }
                        var checked = parentMenu.items.findIndexBy(function(m){
                            return m.checked;
                        }) >= 0;
                        parentItem.setChecked(checked, true);
                    }
                    item.checked = !item.checked;
                }
        }
        return true;
    }
});
