text: Ext.define('PVE.pool.AddVM', {
      extend: 'PVE.window.Edit',
  
      initComponent : function() {
  	/*jslint confusion: true */
  	var me = this;
  
  	if (!me.pool) {
  	    throw "no pool specified";
  	}
  
  	me.create = true;
  	me.isAdd = true;
  	me.url = "/pools/" + me.pool;
  	me.method = 'PUT';
  	
  	Ext.apply(me, {
  	    subject: gettext('Virtual Machine'),
  	    width: 350,
  	    items: [
  		{
  		    xtype: 'pveVMIDSelector',
  		    name: 'vms',
  		    validateExists: true,
  		    value:  '',
  		    fieldLabel: "VM ID"
  		}
  	    ]
  	});
  
  	me.callParent();
      }
  });
  
  Ext.define('PVE.pool.AddStorage', {
      extend: 'PVE.window.Edit',
  
      initComponent : function() {
  	/*jslint confusion: true */
  	var me = this;
  
  	if (!me.pool) {
  	    throw "no pool specified";
  	}
  
  	me.create = true;
  	me.isAdd = true;
  	me.url = "/pools/" + me.pool;
  	me.method = 'PUT';
  	
  	Ext.apply(me, {
  	    subject: gettext('Storage'),
  	    width: 350,
  	    items: [
  		{
  		    xtype: 'PVE.form.StorageSelector',
  		    name: 'storage',
  		    nodename: 'localhost',
  		    autoSelect: false,
  		    value:  '',
  		    fieldLabel: gettext("Storage")
  		}
  	    ]
  	});
  
  	me.callParent();
      }
  });
  
  Ext.define('PVE.grid.PoolMembers', {
      extend: 'Ext.grid.GridPanel',
      alias: ['widget.pvePoolMembers'],
  
      // fixme: dynamic status update ?
  
      initComponent : function() {
  	var me = this;
  
  	if (!me.pool) {
  	    throw "no pool specified";
  	}
  
  	var store = Ext.create('Ext.data.Store', {
  	    model: 'PVEResources',
  	    sorters: [
  		{
  		    property : 'type',
  		    direction: 'ASC'
  		}
  	    ],
  	    proxy: { 
  		type: 'pve',
  		root: 'data.members',
  		url: "/api2/json/pools/" + me.pool
  	    }
  	});
  
  	var coldef = PVE.data.ResourceStore.defaultColums();
  
  	var reload = function() {
  	    store.load();
  	};
  
  	var sm = Ext.create('Ext.selection.RowModel', {});
  
  	var remove_btn = new PVE.button.Button({
  	    text: gettext('Remove'),
  	    disabled: true,
  	    selModel: sm,
  	    confirmMsg: function (rec) {
  		return Ext.String.format(gettext('Are you sure you want to remove entry {0}'),
  					 "'" + rec.data.id + "'");
  	    },
  	    handler: function(btn, event, rec) {
  		var params = { 'delete': 1 };
  		if (rec.data.type === 'storage') {
  		    params.storage = rec.data.storage;
  		} else if (rec.data.type === 'qemu' || rec.data.type === 'openvz') {
  		    params.vms = rec.data.vmid;
  		} else {
  		    throw "unknown resource type";
  		}
  
  		PVE.Utils.API2Request({
  		    url: '/pools/' + me.pool,
  		    method: 'PUT',
  		    params: params,
  		    waitMsgTarget: me,
  		    callback: function() {
  			reload();
  		    },
  		    failure: function (response, opts) {
  			Ext.Msg.alert(gettext('Error'), response.htmlStatus);
  		    }
  		});
  	    }
  	});
  
  	Ext.apply(me, {
  	    store: store,
  	    selModel: sm,
  	    tbar: [
  		{
  		    text: gettext('Add'),
  		    menu: new Ext.menu.Menu({
  			items: [
  			    {
  				text: gettext('Virtual Machine'),
  				iconCls: 'pve-itype-icon-qemu',
  				handler: function() {
  				    var win = Ext.create('PVE.pool.AddVM', { pool: me.pool });
  				    win.on('destroy', reload);
  				    win.show();
  				}
  			    },
  			    {
  				text: gettext('Storage'),
  				iconCls: 'pve-itype-icon-storage',
  				handler: function() {
  				    var win = Ext.create('PVE.pool.AddStorage', { pool: me.pool });
  				    win.on('destroy', reload);
  				    win.show();
  				}
  			    }
  			]
  		    })
  		},
  		remove_btn
  	    ],
  	    viewConfig: {
  		stripeRows: true
              },
              columns: coldef,
  	    listeners: {
  		show: reload
  	    }
  	});
  
  	me.callParent();
      }
  });