function groupTrees(_urlLeft, _urlRight) {
	
	var selNode1 = null;
	var selNode2 = null;
	
	// shorthand
	var Tree = Ext.tree;
	
	var tree1 = new Tree.TreePanel({
	    useArrows:true,
	    id: 'tree1_container',
	    autoScroll:true,
	    height: 150,
	    selModel: new Ext.tree.MultiSelectionModel({
	    	listeners: {
	    		selectionchange: {
	    			fn: function(model, nodes) {
	    				var nodesToRemove = [];
	    				for (var i=0; i<nodes.length; i++) {
	    					selNode1 = nodes[i];
	    					if ((!(selNode1.attributes.parent_id>0) && selNode1.attributes.site_id>0))
				    			nodesToRemove.push(selNode1);
	    				}
	    				for (var i=0; i<nodesToRemove.length; i++) {
	    					nodesToRemove[i].unselect();
	    				}
	    			}
	    		}
	    	}
	    }),
	    animate:true,
	    rootVisible: false,
	    enableDD:false,
	    containerScroll: true,
	    loader: new Tree.TreeLoader({
	        dataUrl:_urlLeft
	    })
	});
	// set the root node
	var root = new Tree.AsyncTreeNode({
	    text: 'Root Categories',
	    cls: 'folder',
	    draggable:false,
	    id:'0'
	});
	tree1.setRootNode(root);
	tree1.root.expand();
	
	var tree2 = new Tree.TreePanel({
	    useArrows:true,
	    id: 'tree2_container',
	    autoScroll:true,
	    selModel: new Ext.tree.MultiSelectionModel(),
	    height: 150,
	    animate:true,
	    rootVisible: false,
	    enableDD:false,
	    containerScroll: true,
	    loader: new Tree.TreeLoader({
	        dataUrl:_urlRight
	    })
	});
	// set the root node
	var root = new Tree.AsyncTreeNode({
	    text: 'Root Categories',
	    cls: 'folder',
	    draggable:false,
	    id:'0'
	});
	tree2.setRootNode(root);
	tree2.root.expand();
	
	function duplicateNode(source) {
		var dNode = new Ext.tree.TreeNode(source);
		dNode.attributes.iconCls = source.attributes.iconCls;
		dNode.attributes.site_id = source.attributes.site_id;
		dNode.attributes.parent_id = source.attributes.parent_id;
		dNode.attributes.aro_id = source.attributes.aro_id;
		return dNode;
	}
	
	function sortTree(tree) {
		tree.root.sort(function(a,b) {
			return a.attributes.site_id<b.attributes.site_id;
		});
	}
	
	var arrowRight = new Ext.Button({
		text: '>',
		handler: function() {
			var nodes = tree1.getSelectionModel().getSelectedNodes();
			if (nodes.length>0) {
				for (var i=0; i<nodes.length; i++) {
					selNode1 = nodes[i];
					// if its not main group, add it normally to the tree
					if (selNode1.attributes.parent_id>0) {
		    			// if selected node doesn't exist in the second tree
		    			if (!tree2.getNodeById(selNode1.id)) {
		    				if (!(selNode1.attributes.site_id>0)) {
		    					var parentNode = tree2.root;
		    				} else {
		    					var parentNode = tree2.root.findChildBy(function(n) {
			    					if (n.attributes.site_id==selNode1.attributes.site_id && !(n.attributes.parent_id>0)) {
			    						return true;
			    					}
			    				});
		    				}
		    				if (!parentNode) {
		    					var leftParent = tree1.root.findChildBy(function(n) {
			    					if (n.attributes.site_id==selNode1.attributes.site_id && !(n.attributes.parent_id>0)) {
			    						return true;
			    					}
			    				});
			    				var parentToAdd = duplicateNode(leftParent);
								parentNode = tree2.root.appendChild(parentToAdd);
		    				}
		    				
		    				// duplicate the node and insert it in the second tree
		    				tree2.collapseAll();
							parentNode.expand();
							var nodeToAdd = duplicateNode(selNode1);
							parentNode.appendChild(nodeToAdd);
							sortTree(tree2);
						}
					} else {
						// add a root group
						if (!tree2.getNodeById(selNode1.id)) {
	    					var nodeToAdd = duplicateNode(selNode1);
	    					tree2.root.appendChild(nodeToAdd);
	    					sortTree(tree2);
						}
					}
				}
			} else {
				Ext.MessageBox.alert('No group selected!','Please select at least a group first!');
			}
		}
	});
	
	var arrowLeft = new Ext.Button({
		text: '<',
		style: 'margin-top: 10px;',
		handler: function() {
			var nodes = tree2.getSelectionModel().getSelectedNodes();
			if (nodes.length>0) {
				for (var i=(nodes.length-1); i>=0; i--) {
					nodes[i].remove();
				}
			} else {
				Ext.MessageBox.alert('No group selected!','Please select a group first!');
			}
		}
	});
	
	var multipleTrees = new Ext.Panel({
		layout:'table',
		width:550,
		style:'margin-left:78px;',
		bodyStyle:'background:none;',
		border: false,
		layoutConfig:{columns:3},
		items: [
			tree1,
			new Ext.Panel({
		    	layout:'table',
		    	border: false,
		    	bodyStyle:'background:none;',
		    	layoutConfig:{columns:1},
		    	items: [
		    		arrowRight,arrowLeft
		    	]
			}),
			tree2
		],
		getSelected : function(aro) {
			tree2.expandAll();
        	var itemselector='';
		    for (var i in tree2.nodeHash) {
		        var n = tree2.nodeHash[i];
		        
		        if (aro) {
		        	var id = n.attributes.aro_id;
		        }
		        else var id = n.attributes.id;
		        
		        if (n.attributes && id>0 && !(n.attributes.site_id>0 && !(n.attributes.parent_id>0))) {
		            if (itemselector.length>0) itemselector+=','+id;
		            else itemselector+=id;
		        }
		    }
		    return itemselector;
		}
	});
	
	return multipleTrees;
	
}