Uwd.System.UserFinderImageColumn = function(config){
    var grid;
	var store;
	
	Ext.apply(this, {
        width: 25,
        fixed: true,
		dragable: false,
		menuDisabled: true,
        id: 'uwd-system-users-col',
		renderer: function(value, metadata, record){
            return record.data.type === 'user' ? '<div class="icon-user">&nbsp;</div>' : '<div class="icon-group"></div>';
        },
		
	   	init : function(xg){
            grid = xg;
			store = grid.getStore();
        }
    });
};


Uwd.System.UserFinder = function(c) {
	if (!c) {
		c = {};	
	}
	//c.layout = 'border';
	c.layout = 'border';
	c.border = false;
	c.callback = c.callback || Ext.emptyFn;
	c.selected = c.selected || [];
	c.userSelect = c.userSelect || false;
	c.fixed = c.fixed || [];
	c.program = c.program || 'UserFinder';
	c.buttons = [{
		text: Uwd.System.SystemLanguage.buttonAdd,
		handler: function() {
			var groupRecords = this.gGrid.getSelectionModel().getSelections();
			var userRecords = this.uGrid.getSelectionModel().getSelections();
			var c = this.callback(groupRecords, userRecords);
			if (c !== false) {
				this.ownerCt.close();	
			}
		}.createDelegate(this),
		scope: this
	}, {
		text: Uwd.System.SystemLanguage.buttonClose,
		handler: function() {
			this.ownerCt.close();
		}.createDelegate(this),
		scope: this
	}];

	Uwd.System.UserFinder.superclass.constructor.call(this, c);
	this.groupStoreLoaded = false;
	this.userStoreLoaded = false;
	this.addComponents();
	
};

Ext.extend(Uwd.System.UserFinder, Ext.Panel, {

	addComponents : function() {
		this.gGrid = this.getGroupGrid();
		this.uGrid = this.getUserGrid();
		
		this.add(this.gGrid);
		this.add(this.uGrid);
		this.doLayout();
	},
	
	getGroupGrid : function() {
		var store = new Ext.data.Store({
			url: window.system.getConfigObject().getBackendUrl(),
			baseParams: {
				action:	'getGroups',
				basePath:	'system/',
				controller:	'UserFinder',
				program: this.program
			},
			
			// create reader that reads the Topic records
			reader: new Ext.data.JsonReader({
				root: 'data',
				totalProperty: 'count',
				id: 'id'
			}, [
				'id', 
				'name', 
				'groupIds', 
				'type',
				'isInUse',
				'isFixInUse'
			]),
	
			// turn off remote sorting
			remoteSort: false
		});
		
		var imgColumn = new Uwd.System.UserFinderImageColumn();
		var cm = new Ext.grid.ColumnModel([
			imgColumn,
			{
				id:'name',
				header: Uwd.System.SystemLanguage.userFinder.colName,
				dataIndex: 'name',
				menuDisabled: true,
				width: 100
			}
		]);
		cm.defaultSortable = false;
		cm.defaultDragable = false;
		
		var sm = new Ext.grid.RowSelectionModel({singleSelect: false});
		
		if (this.userSelect === true) {
			var plugs = [new Ext.ux.grid.DragSelector()];
		} else {
			var plugs = [new Ext.ux.grid.Search({
				iconCls:'icon-search',
				readonlyIndexes:[],
				disableIndexes:[],
				minChars:3,
				autoFocus:false,
				searchText: Uwd.System.SystemLanguage.gridSearch.search,
				searchTipText: Uwd.System.SystemLanguage.gridSearch.minChars,
				selectAllText: Uwd.System.SystemLanguage.gridSearch.selectAll,
				minCharsTipText: Uwd.System.SystemLanguage.gridSearch.minChars
			}), new Ext.ux.grid.DragSelector()];
		}

		var grid = new Ext.grid.GridPanel({
			region: 'north',
			collapsible: true,
			titlteCollapse: true,
			title: Uwd.System.SystemLanguage.userFinder.groups,
			height: 200,
			split: true,
			autoScroll: true,
			border: true,
			ds: store,
			cm: cm,
			selModel: sm,
			loadMask: true,
			viewConfig : {
				forceFit: true	
			},
			bbar: [{
				tooltip: Uwd.System.SystemLanguage.refresh,
				iconCls: "x-tbar-loading",
				handler: store.reload,
				scope: store
			}],
			plugins: plugs
		});
		
		grid.getView().getRowClass = function(record, index) {
			if (record.get('isInUse') == 'true' || record.data.isFixInUse == 'true') {
				return 'xgrid3-disabled-row';
			}
		};

		sm.on({
			disable: function() {
				Ext.each(this.uGrid.getStore().getRange(), function(record) {
					var isInUse = 'false';
					var iiu = 'false';
					Ext.each(record.data.groupIds, function(groupId) {
						var groupRecord = store.getById(groupId);
						if (groupRecord) {
							if (sm.isSelected(groupRecord) || groupRecord.data.isInUse === 'true' || groupRecord.data.isFixInUse === 'true') {
								isInUse = 'true';
							}
						}
					});
					if (this.userSelect !== true) {
						record.set('isInUse', isInUse);
					}
					if (isInUse === 'true') {
						if (this.userSelect === true) {
							this.uGrid.getSelectionModel().selectRow(this.uGrid.getStore().indexOf(record), true);
						} else {
							if (this.uGrid.getSelectionModel().isSelected(record)) {
								this.uGrid.getSelectionModel().deselectRow(this.uGrid.getStore().indexOf(record));
							}
						}
					} else {
						if (this.userSelect === true && this.uGrid.getSelectionModel().isSelected(record)) {
							this.uGrid.getSelectionModel().deselectRow(this.uGrid.getStore().indexOf(record));
						}
					}
				}.createDelegate(this));
				
				Ext.each(store.getRange(), function(record) {
					var isInUse = 'false';
					Ext.each(record.data.groupIds, function(groupId) {
						var groupRecord = store.getById(groupId);
						if (groupRecord) {
							if (sm.isSelected(groupRecord) || groupRecord.data.isInUse === 'true' || groupRecord.data.isFixInUse === 'true') {
								isInUse = 'true';
							}
						}
					});
					var iiu = record.get('isInUse');
					record.set('isInUse', isInUse);
					
					if (isInUse === 'true') {
						if (this.gGrid.getSelectionModel().isSelected(record)) {
							this.gGrid.getSelectionModel().deselectRow(this.gGrid.getStore().indexOf(record));
						}
						
						
						if (iiu !== 'true') {
							sm.fireEvent('disable');
						}
					}
				}.createDelegate(this));
			}.createDelegate(this),
			
			selectionchange: function(e) {
				// setup all users
				Ext.each(this.uGrid.getStore().getRange(), function(record) {
					var isInUse = 'false';
					Ext.each(record.data.groupIds, function(groupId) {
						var groupRecord = store.getById(groupId);
						if (groupRecord) {
							if (sm.isSelected(groupRecord) || groupRecord.data.isInUse === 'true' || groupRecord.data.isFixInUse === 'true') {
								isInUse = 'true';
							}
						}
					});
					if (this.userSelect !== true) {
						record.set('isInUse', isInUse);
					}
					if (isInUse === 'true') {
						if (this.userSelect === true) {
							this.uGrid.getSelectionModel().selectRow(this.uGrid.getStore().indexOf(record), true);
						} else {
							if (this.uGrid.getSelectionModel().isSelected(record)) {
								this.uGrid.getSelectionModel().deselectRow(this.uGrid.getStore().indexOf(record));
							}
						}
					} else {
						if (this.userSelect === true) {
							this.uGrid.getSelectionModel().deselectRow(this.uGrid.getStore().indexOf(record));
						}
					}
				}.createDelegate(this));
				
				// set up all groups
				Ext.each(store.getRange(), function(record) {
					var isInUse = 'false';
					Ext.each(record.data.groupIds, function(groupId) {
						var groupRecord = store.getById(groupId);
						if (groupRecord) {
							if (sm.isSelected(groupRecord) || groupRecord.data.isInUse === 'true' || groupRecord.data.isFixInUse === 'true') {
								isInUse = 'true';
							}
						}
					});
					record.set('isInUse', isInUse);
					if (isInUse === 'true') {
						if (this.gGrid.getSelectionModel().isSelected(record)) {
							this.gGrid.getSelectionModel().deselectRow(this.gGrid.getStore().indexOf(record));
						}
						sm.fireEvent('disable');
					}
				}.createDelegate(this));
			}.createDelegate(this),
			
			beforerowselect : function(sm, rowIndex, keepExisting, record) {
				if (record.get('isInUse') == 'true' || record.data.isFixInUse == 'true') {
					return false;
				}
				return true;
			}.createDelegate(this)
		});
		
		var onGroupStoreLoad = function() {
			var recs = [];
			Ext.each(this.selected, function(record) {  
				if (record.data.type === 'group') {
					var groupRecord = store.getAt(store.find('name', record.data.name, false, true));
					recs.push(groupRecord);
					//groupRecord.select();
				}
			}.createDelegate(this));
			
			sm.selectRecords(recs);
			
			Ext.each(this.fixed, function(record) {  
				if (record.data.type === 'group') {
					var groupRecord = store.getAt(store.find('name', record.data.name, false, true));
					groupRecord.set('isFixInUse', 'true');
				}
			}.createDelegate(this));
			sm.fireEvent('selectionchange');
		}.createDelegate(this);
		
		/* disable already used groups */
		store.on('load', function() {
			if (this.userStoreLoaded === false) {
				var timer;
				var counter = 0;
				
				var f = function(){
					if(this.userStoreLoaded === true){ // both stores are loaded
						clearInterval(timer);
						onGroupStoreLoad();
					}
				}.createDelegate(this);
				timer = setInterval(f, 100);
			} else {
				onGroupStoreLoad();	
			}
			this.groupStoreLoaded = true;
		}.createDelegate(this));
		store.load();

		return grid;
	},
	
	getUserGrid : function() {
		var userStore = new Ext.data.Store({
			url: window.system.getConfigObject().getBackendUrl(),
			baseParams: {
				action:	'getUsers',
				basePath:	'system/',
				controller:	'UserFinder',
				program: this.program
			},
	
			// create reader that reads the Topic records
			reader: new Ext.data.JsonReader({
				root: 'data',
				totalProperty: 'count',
				id: 'id'
			}, [
				'id', 
				'name', 
				'type',
				'groupIds',
				'isInUse',
				'isFixInUse'
			]),
			// turn off remote sorting
			remoteSort: false
		});
		
		
		var userColumn = new Uwd.System.UserFinderImageColumn();
		var cm = new Ext.grid.ColumnModel([
			userColumn, {
				id:'name',
				header: Uwd.System.SystemLanguage.userFinder.colName,
				dataIndex: 'name',
				menuDisabled: true,
				width: 100
			}
		]);
		cm.defaultSortable = false;
		cm.defaultDragable = false;
		
		var sm = new Ext.grid.RowSelectionModel({singleSelect: false});

		onUserStoreLoad = function () {
			var recs = [];
			Ext.each(this.selected, function(record) {  
				if (record.data.type === 'user') {
					var userRecord = userStore.getAt(userStore.find('name', record.data.name, false, true));
					recs.push(userRecord);
				}
			}.createDelegate(this));
			sm.selectRecords(recs);
			
			Ext.each(this.fixed, function(record) {  
				if (record.data.type === 'user') {
					var userRecord = userStore.getAt(userStore.find('name', record.data.name, false, true));
					userRecord.set('isFixInUse', 'true');
				}
			}.createDelegate(this));

			Ext.each(userStore.getRange(), function(record) {
				var isFixInUse = record.data.isFixInUse;
				Ext.each(record.data.groupIds, function(groupId) {
					var groupRecord = this.gGrid.getStore().getById(groupId);
					if (groupRecord) {
						if (groupRecord.data.isFixInUse === 'true') {
							isFixInUse = 'true';
						}
					}
				}.createDelegate(this));
				record.set('isFixInUse', isFixInUse);
			}.createDelegate(this));
		}.createDelegate(this);
		
		
		userStore.on('load', function() {
			if (this.groupStoreLoaded === false) {
				var timer;
				var counter = 0;
				
				var f = function(){
					if(this.groupStoreLoaded === true){ // both stores are loaded
						clearInterval(timer);
						onUserStoreLoad();
					}
				}.createDelegate(this);
				timer = setInterval(f, 100);
			} else {
				onUserStoreLoad();	
			}
			this.userStoreLoaded = true;
		}.createDelegate(this));
		userStore.load();

		var grid = new Ext.grid.GridPanel({
			region: 'center',
			collapsible: true,
			titlteCollapse: true,
			title: Uwd.DatanodeLanguage.perms.users,
			autoScroll: true,
			splitBar: true,
			border: true,
			ds: userStore,
			cm: cm,
			selModel: sm,
			loadMask: true,
			bbar: [{
				tooltip: Uwd.System.SystemLanguage.refresh,
				iconCls: "x-tbar-loading",
				handler: userStore.reload,
				scope: userStore
			}],
			plugins: [new Ext.ux.grid.Search({
				iconCls:'icon-search',
				readonlyIndexes:[],
				disableIndexes:[],
				minChars:3,
				autoFocus:false,
				searchText: Uwd.System.SystemLanguage.gridSearch.search,
				searchTipText: Uwd.System.SystemLanguage.gridSearch.minChars,
				selectAllText: Uwd.System.SystemLanguage.gridSearch.selectAll,
				minCharsTipText: Uwd.System.SystemLanguage.gridSearch.minChars
			}), new Ext.ux.grid.DragSelector()],
			viewConfig : {
				forceFit: true	
			}
		});
		
		grid.getView().getRowClass = function(record, index) {
			if (record.get('isInUse') == 'true' || record.data.isFixInUse == 'true') {
				return 'xgrid3-disabled-row';
			}
		};
		
		sm.on('beforerowselect', function(sm, rowIndex, keepExisting, record) {
			if(record.get('isInUse') == 'true' || record.data.isFixInUse == 'true') {
				return false;
			}
			return true;
		});

		return grid;
	}


});


