Index: subuser.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/subuser/subuser.module,v
retrieving revision 1.7
diff -u -r1.7 subuser.module
--- subuser.module	15 Oct 2009 07:45:29 -0000	1.7
+++ subuser.module	23 Mar 2010 23:46:38 -0000
@@ -46,6 +46,16 @@
     'type' => MENU_CALLBACK,
   );
 
+  $items['user/%user/subuser/parent'] = array(
+    'title' => t('Set @parent', array('@parent' => strtolower(variable_get('subuser_parent', 'Create subuser')))),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('subuser_parent_form', 1),
+    'access callback' => 'user_edit_access',
+    'access arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'subuser.pages.inc'
+  );
+
   return $items;
 }
 
Index: subuser.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/subuser/subuser.install,v
retrieving revision 1.2
diff -u -r1.2 subuser.install
--- subuser.install	24 Apr 2009 02:06:43 -0000	1.2
+++ subuser.install	23 Mar 2010 23:46:38 -0000
@@ -56,4 +56,5 @@
   drupal_uninstall_schema('subuser');
 
   variable_del('subuser_roles');
+  variable_del('subuser_parent_role');
 }
Index: subuser.pages.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/subuser/subuser.pages.inc,v
retrieving revision 1.3
diff -u -r1.3 subuser.pages.inc
--- subuser.pages.inc	14 Oct 2009 04:40:34 -0000	1.3
+++ subuser.pages.inc	23 Mar 2010 23:46:38 -0000
@@ -60,6 +60,18 @@
       '#options' => $roles,
       '#default_value' => variable_get('subuser_roles', array()),
     );
+
+    $form['parent_role'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Parent Roles'),
+      '#description' => t('Choose the role that addition parents assigned by the sub-user must have.')
+    );
+    $form['parent_role']['subuser_parent_role'] = array(
+      '#type' => 'radios',
+      '#title' => t('Available roles'),
+      '#options' => $roles,
+      '#default_value' => variable_get('subuser_parent_role', ''),
+    );
   }
   else {
     drupal_set_message(t('No available roles to select. Please <a href="/admin/user/roles">create a role</a>.'), 'error');
@@ -239,3 +251,106 @@
     return;
   }
 }
+
+/**
+ * Provide additional parent selection form.
+ */
+function subuser_parent_form(&$form_state, $user) {
+  $form = array();
+
+  if (variable_get('subuser_parent_role', FALSE)) {
+    $form['uid'] = array(
+      '#type' => 'value',
+      '#value' => $user->uid,
+    );
+    $form['parent'] = array(
+      '#type' => 'select',
+      '#title' => t('Additional parent'),
+      '#options' => array(0 => t('<none>')) + subuser_parent_get_all_role(),
+      '#default_value' => subuser_parent_get_additional($user->uid),
+    );
+    $form['op'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save'),
+    );
+  }
+  else {
+    drupal_set_message(t('Additional parent role not yet configured.'), 'error');
+  }
+
+  return $form;
+}
+
+/**
+ * Store the "additional parent" information.
+ */
+function subuser_parent_form_submit($form, &$form_state) {
+  // Remove any previous "additional parent" entry.
+  if ($additional_parent = subuser_parent_get_additional($form_state['values']['uid'])) {
+    db_query('DELETE FROM {user_relationship} WHERE parent_id = %d AND uid = %d', $parent, $form_state['values']['uid']);
+  }
+
+  if ($form_state['values']['parent']) {
+    // Insert a value for the new "additional parent".
+    db_query('INSERT INTO {user_relationship} (parent_id, uid)
+              VALUES (%d, %d)', $form_state['values']['parent'], $form_state['values']['uid']);
+  }
+
+  drupal_set_message(t('The changes have been saved.'));
+}
+
+/**
+ * Get all parents of a sub-user.
+ *
+ * @param integer $uid User ID.
+ * @return array List of parent user IDs.
+ */
+function subuser_parent_get_all($uid) {
+  $result = db_query('SELECT parent_id FROM {user_relationship} WHERE uid = %d', $uid);
+  $parents = array();
+  while ($parent = db_result($result)) {
+    $parents[] = $parent;
+  }
+  return $parents;
+}
+
+/**
+ * Get all possible parents in the sub-user parent role.
+ *
+ * @return array Associative array of possible parents keyed on uid.
+ */
+function subuser_parent_get_all_role() {
+  $rid = variable_get('subuser_parent_role', FALSE);
+  $result = db_query('SELECT u.uid, u.name
+                      FROM {users} u
+                      JOIN {users_roles} r
+                        ON r.uid = u.uid
+                      WHERE r.rid = %d', $rid);
+  $users = array();
+  while ($parent = db_fetch_array($result)) {
+    $users[$parent['uid']] = $parent['name'];
+  }
+  return $users;
+}
+
+/**
+ * Attempt to determine the "additional parent" if one exisits.
+ *
+ * This assumes that the "additional parent" role is different from the
+ * standard sub-user parent role.
+ *
+ * @param integer $uid User ID.
+ * @return integer "Additional parent" user ID or FALSE if not found.
+ */
+function subuser_parent_get_additional($uid) {
+  $parents = subuser_parent_get_all($uid);
+  $users = subuser_parent_get_all_role();
+
+  $uids = array_keys($users);
+  foreach ($parents as $parent) {
+    if (in_array($parent, $uids)) {
+      return $parent;
+    }
+  }
+  return FALSE;
+}
