--- og_subgroups.module	Wed Feb 14 13:12:54 2007
+++ og_subgroups.module	Mon May 07 11:08:11 2007
@@ -40,14 +40,14 @@
 		                 'title' => 'SubGroups',
 						 'callback' => 'drupal_get_form', 
 						 'callback arguments' => array('og_subgroups_edit_children_page', arg(1)),
-						 'access' => node_access('update', $node),
+						 'access' => user_access('edit subgroups hierarchy'),
 						 'type' => MENU_LOCAL_TASK, 
 						 'weight'=>3);
         $items[] = array('path' => 'node/'.arg(1).'/edit/members', 
 		                 'title' => 'Members',
 						 'callback' => 'drupal_get_form',
 						 'callback arguments' => array('og_subgroups_edit_members_page', arg(1)),
-						 'access' => node_access('update', $node),
+						 'access' => user_access('edit subgroups members'),
 						 'type' => MENU_LOCAL_TASK, 
 						 'weight'=>5);
       }
@@ -57,23 +57,48 @@
   return $items;
 }
 
-function og_subgroups_nodeapi($node, $op, $teaser = NULL) {
+/**
+ * Implementation of hook_perm().
+ */
+function og_subgroups_perm() {
+    return array('edit subgroups hierarchy', 'edit subgroups members');
+}
+
+function og_subgroups_set_breadcrumb($addchild = false) {
+  $gnode = og_get_group_context();
+  $parent = _og_subgroups_get_parent($gnode->nid);
+  if ($parent) {
+    $pnode = node_load($parent);
+    $bc[] = l(t('Home'), NULL);
+    $bc[] = l(t('Groups'), 'og');
+    $bc[] = l($pnode->title, "node/$pnode->nid");
+	if ($addchild)
+	  $bc[] = l($gnode->title, "node/$gnode->nid");
+    drupal_set_breadcrumb($bc);
+  }
+}
+	
+function og_subgroups_nodeapi($node, $op, $teaser = NULL, $page = NULL) {
   switch ($op) {
+    case 'view':
+      og_subgroups_set_breadcrumb(!og_is_group_type($node->type));
+      break;
+	  	
     case 'insert':
       if (og_is_group_type($node->type)) {	  
         if (is_array($node->members)) {
-          og_subgroups_save_members($node->nid,$node->members);
-        }
-        if (is_array($node->subgroups)) {
-          og_subgroups_save_children($node->nid,$node->subgroups);
+          og_subgroups_save_members($node->nid, $node->members);
         }
+		if (is_array($node->parents)) {
+		  og_subgroups_save_parents($node->nid, $node->parents);
+		}
       }
       break;
 
     case 'update':
       if (og_is_group_type($node->type)) {
-        og_subgroups_save_members($node->nid,$node->members);
-        og_subgroups_save_children($node->nid,$node->subgroups);
+        og_subgroups_save_members($node->nid, $node->members);
+        og_subgroups_save_parents($node->nid, $node->parents);
       }
       break;
   }
@@ -92,13 +117,20 @@
 }
 
 function og_subgroups_form($node) {
-  $selected = array();
-  $selected = og_subgroups_get_children($node->nid);
-  $form['subgroups'] = og_subgroups_subgroups_select(t('Subgroups'), 'subgroups', $selected, $node->nid, array($node->nid));
-
-  $selected = array();
-  $selected = og_subgroups_get_users('names',$node->nid,0);
-  $form['members'] = og_subgroups_members_select($selected);
+  $form = array();
+  
+  if (user_access('edit subgroups hierarchy')) {
+    $selected = array();
+    $selected = og_subgroups_get_parents($node->nid);
+	$form['parents'] = og_subgroups_parents_select(t('Parent(s)'), 'parents', $selected, $node->nid, array($node->nid));
+  }
+  
+  if (user_access('edit subgroups members')) {
+    $selected = array();
+    $selected = og_subgroups_get_users('names',$node->nid,0);
+    $form['members'] = og_subgroups_members_select($selected);
+  }
+  
   return $form;
 }
 
@@ -121,7 +153,7 @@
   );
 }
 
-function og_subgroups_subgroups_select($title, $name, $selected, $gid, $exclude = array()) {
+function og_subgroups_parents_select($title, $name, $selected, $gid, $exclude = array()) {
   $options = array();
   $result = db_query('SELECT og.nid, n.title FROM {og} og INNER JOIN {node} n where og.nid=n.nid AND og.nid <> %d', $gid);
   while ($row = db_fetch_object($result)) {
@@ -147,7 +179,6 @@
   }
 }
 
-
 /**
  * Returns the parent for a given groupnode id
  */
@@ -162,7 +193,8 @@
 function og_subgroups_members_page($gid) {
   $node = node_load($gid);
   drupal_set_title(t($node->title));
-
+  og_subgroups_set_breadcrumb(true);
+  
   $users = og_subgroups_get_users('links',$gid,1);
   if (!count($users)) {
     $users = array("(no members)");
@@ -236,7 +268,8 @@
 function og_subgroups_page($gid) {
   $node = node_load($gid);
   drupal_set_title(t($node->title));
-
+  og_subgroups_set_breadcrumb(true);
+  
   return og_subgroups_tree(array($node->nid => $node->title));
 }
 
@@ -282,6 +315,23 @@
   return $togo;
 }
 
+function og_subgroups_save_parents($gid,$parents) {
+  // First remove ourself as a child
+  $current = og_subgroups_get_parents($gid);
+  foreach($current as $pid => $pdata) {
+    db_query('DELETE FROM {og_ancestry} where nid=%d and group_nid=%d', $gid, $pid);
+  }
+
+  // Now add ourself to appropriate parents
+  if (is_array($parents)) {
+    foreach($parents as $parent) {
+	  if ($parent != 0) {
+	    db_query('INSERT INTO {og_ancestry} (nid,group_nid,is_public) VALUES (%d,%d,0)', $gid, $parent);
+      }
+    }
+  }
+}
+
 function og_subgroups_edit_children_page($gid) {
   $node = node_load($gid);
   drupal_set_title(t($node->title));
@@ -437,14 +487,14 @@
 }
 
 function og_subgroups_get_parents($gid) {
-  $result = db_query('SELECT oga.group_nid, n.title, n.type, n.status FROM {og_ancestry} oga INNER JOIN {node} n where oga.nid=%d AND oga.group_nid=n.nid', $gid);
+  $result = db_query('SELECT n.title, n.type, n.status, oga.group_nid as nid, 1 as is_active FROM {og_ancestry} oga INNER JOIN {node} n where oga.nid=%d AND oga.group_nid=n.nid', $gid);
   
   $parents = array();
   while ($row = db_fetch_array($result)) {
     if (og_is_group_type($row['type'])) {
-      $parents[$row['group_nid']] = $row;
+      $parents[$row['nid']] = $row;
 	}
   }
-  
+
   return $parents;
