Index: buddylist.module
===================================================================
--- buddylist.module	(revision 7057)
+++ buddylist.module	(working copy)
@@ -69,7 +69,7 @@
  * Implementation of hook_perm
  */
 function buddylist_perm() {
-  return array('maintain buddy list', 'view buddy lists');
+  return array('maintain buddy list', 'view buddy lists', 'maintain buddy list for others');
 }
 
 /**
@@ -517,7 +517,7 @@
           break;
         }
       }
-      return theme('buddylist', $listbuddies);
+      return theme('buddylist', $listbuddies, $user, $buddy_of);
     }
 	}
   else if (user_access('view buddy lists') && !variable_get('buddylist_require_approval', 0)) {
@@ -531,7 +531,7 @@
       $listbuddyof[$row->uid] = $row;
     }
     if ($listbuddyof) {
-      return theme('buddylist', $listbuddyof);
+      return theme('buddylist', $listbuddyof, $user, TRUE);
     }
   }
 }
@@ -544,6 +544,10 @@
 function buddylist_get_buddy_actions(&$viewing_user, &$viewed_user) {
 
   $actions = array();
+  if (user_access('maintain buddy list for others')) {
+    $actions[] = drupal_get_form('buddylist_foruser_form', $viewed_user);
+  }
+
   if (!user_access('maintain buddy list') || $viewing_user->uid == $viewed_user->uid) {
     return $actions;
   }
@@ -594,7 +598,7 @@
               break;
             }
           }
-          $block['content'] = theme('buddylist', $users);
+          $block['content'] = theme('buddylist', $users, $user, FALSE);
         } else {
           // buddylist is empty
           if(variable_get('buddylist_block_if_no_buddies', FALSE)) {
@@ -1291,10 +1295,40 @@
   return $stats;
 }
 
-function theme_buddylist($buddies) {
-  return theme('user_list', $buddies);
+
+function buddylist_buddylist_buddypair_action($user, $buddy) {
+  return array('remove'=> l(t('remove'),'buddy/delete/'.$buddy->uid,NULL,drupal_get_destination().'&foruser='.$user->uid, NULL, FALSE, /*html=*/FALSE));
 }
 
+function buddylist_map_user_row($user, $buddy, $buddy_of) {
+  $row = module_invoke_all('buddylist_buddypair_action',$user,$buddy);
+  array_unshift($row,theme('username',
+			   ($buddy_of)?$user:$buddy));
+  return $row;
+  #return array(theme('username',$user),module_invoke_all('buddylist_buddypair_action',$user,$buddy));
+}
+
+function theme_buddylist($buddies, $user=null, $buddy_of=FALSE) {
+  if (!user_access('maintain buddy list for others')) {
+    return theme('user_list', $buddies);
+  }
+  else {
+    $rows = array();
+    if ($buddy_of) {
+      foreach ($buddies as $buddy) {
+	$rows[] = buddylist_map_user_row($buddy, $user, $buddy_of);
+      }
+    }
+    else {
+      foreach ($buddies as $buddy) {
+	$rows[] = buddylist_map_user_row($user, $buddy, $buddy_of);
+      }
+    }
+
+    return theme('table',array('Name','Operations'),$rows);
+  }
+}
+
 function buddylist_form_edit_groups_add_submit($form_id, $form_values) {
   global $user;
   $label_id = buddylist_buddygroup_new($user->uid, $form_values['add_group']);
@@ -1442,53 +1476,133 @@
   global $user;
   $buddy = user_load(array('uid' => $uid));
 
+  $foruser = ($_GET['foruser'] && user_access('maintain buddy list for others')) ? user_load(array('uid' => $_GET['foruser'])) : $user;
+    
   if (empty($buddy->name)) {
     drupal_set_message('This user does not exist');
   }
-  else if (!in_array($uid, array_keys(buddylist_get_buddies($user->uid)))) {
-    drupal_set_message('This user is not on your @buddylist', buddylist_translation());
+  else if (!in_array($uid, array_keys(buddylist_get_buddies($foruser->uid)))) {
+    drupal_set_message("This user is not in %name's @buddylist", array('%name' => $foruser->name)+buddylist_translation());
   }
   else {
     $form['uid'] = array('#type' => 'hidden', '#value' => $uid);
     $form['name'] = array('#type' => 'hidden', '#value' => $buddy->name);
+    if ($_GET['foruser']) {
+      $form['foruser'] = array('#type' => 'hidden', 
+			       '#value' => $_GET['foruser'], 
+			       '#access' => user_access('maintain buddy list for others'));
+
+    }
     $output = confirm_form(
       $form,
-      t('Remove user %name from your @buddylist?', array('%name' => $buddy->name) + buddylist_translation()),
+      t("Remove user %buddy from %name's  @buddylist?", array('%buddy' => $buddy->name, '%name' => $foruser->name) + buddylist_translation()),
       $_GET['destination'],
       '',
       t('Remove'), t('Cancel'),
       'buddylist_deletebuddy_confirm');
     return $output;
   }
-  drupal_goto();
+  #drupal_goto();
 }
 
 /**
  * Confirm and add a buddy.
  */
 function buddylist_deletebuddy_submit($form_id, $form_values) {
-  buddylist_remove($form_values['uid']);
-  drupal_set_message(t('@name will be be notified of being removed.', array('@name' => $form_values['name'])));
+  if ($form_values['foruser'] && user_access('maintain buddy list for others')) {
+    buddylist_remove_foruser($form_values['foruser'],$form_values['uid']);
+  }
+  else {
+    buddylist_remove($form_values['uid']);
+    drupal_set_message(t('@name will be be notified of being removed.', array('@name' => $form_values['name'])));
+  }
   return 'user';
 };
 
+function buddylist_add_foruser($uid, $userid_to_add) {
+  $errors = 0;
+
+  if (!in_array($userid_to_add, array_keys(buddylist_get_buddies($uid)))) {
+    db_query('INSERT INTO {buddylist} (received, uid, buddy, timestamp) VALUES (1, %d, %d, %d)' , $uid , $userid_to_add, time());
+    // DB value buddylist.received set to 1, meaning buddy has a message waiting
+    // letting them know you added them as a buddy
+    // buddylist.received set back to 0 when user logs in along with being informed of new buddy
+  }
+  else {
+    $errors = "already";
+  }
+  return $errors;
+}
+
+function buddylist_remove_foruser($uid, $userid_to_remove) {
+  $errors = 0;
+  db_query('DELETE FROM {buddylist} WHERE uid = %d AND buddy = %d' , $uid , $userid_to_remove);
+  db_query('DELETE FROM {buddylist_buddy_group} WHERE uid = %d AND buddy = %d' , $uid , $userid_to_remove);
+
+  if (variable_get('buddylist_require_approval', 0)) {
+    db_query('DELETE FROM {buddylist} WHERE uid = %d AND buddy = %d', $userid_to_remove, $uid);
+    db_query('DELETE FROM {buddylist_buddy_group} WHERE uid = %d AND buddy = %d', $userid_to_remove, $uid);
+  }
+  return $errors;
+}
+
+function buddylist_foruser_form($user) {
+  $form = array();
+
+  $form['user'] = array('#type' => 'value',
+			'#value' => $user->uid,
+			'#required' => TRUE,
+			);
+  $form['keys'] = array('#title' => t("User to add to @buddylist of %name", array('%name' => $user->name)+ buddylist_translation()),
+
+			'#type' => 'textfield', 
+			'#size' => 40, 
+			'#required' => TRUE,
+			);
+  if (user_access('access user profiles')) {
+    $form['keys']['#autocomplete_path'] = 'user/autocomplete';
+  } 
+  $form['symmetric'] = array('#title' => t("Symmetric"),
+			'#default_value' => FALSE,
+			'#type' => 'checkbox', 
+			);
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Add'),
+  );
+
+  return $form;
+}
+
+function buddylist_foruser_form_submit($form_id, $form_values) {
+  if (user_access('maintain buddy list for others')) {
+    $user_to_add = user_load(array('name' => $form_values['keys']));
+    $add_errors = buddylist_add_foruser( $form_values['user'],$user_to_add->uid );
+    if ($form_values['symmetric']) {
+      $add_errors = buddylist_add_foruser( $user_to_add->uid,$form_values['user'] );
+    }
+    drupal_set_message(t('@Buddies added successfully', buddylist_translation()));
+  }
+}
+
+
 function buddylist_add($id) {
   global $user;
   $user_to_add = user_load(array('uid' => $id));
 
-  if (!in_array($id, array_keys(buddylist_get_buddies($user->uid)))) {
-    db_query('INSERT INTO {buddylist} (received, uid, buddy, timestamp) VALUES (1, %d, %d, %d)' , $user->uid , $id , time());
-    // DB value buddylist.received set to 1, meaning buddy has a message waiting
-    // letting them know you added them as a buddy
-    // buddylist.received set back to 0 when user logs in along with being informed of new buddy
+  $add_errors = buddylist_add_foruser($user->uid, $id);
+
+  if ($add_errors === 0) {
     if (variable_get('buddylist_send_add', FALSE)) {
       buddylist_mail_user('add', $user_to_add);
     }
     drupal_set_message(t('%username has been added to your @buddylist', array('%username' => $user_to_add->name) + buddylist_translation()));
-  }
-  else {
+
+  } else if ($add_errors == 'already') {
     drupal_set_message(t('%username is already on your @buddylist', array('%username' => $user_to_add->name) + buddylist_translation()));
   }
+
 }
 
 function buddylist_add_request($id) {
@@ -1519,18 +1633,13 @@
 
 function buddylist_remove($id) {
   global $user;
-  db_query('DELETE FROM {buddylist} WHERE uid = %d AND buddy = %d' , $user->uid , $id);
-  db_query('DELETE FROM {buddylist_buddy_group} WHERE uid = %d AND buddy = %d' , $user->uid , $id);
+  buddylist_remove_foruser($user->uid, $id);
+
   $thisuser = user_load(array('uid' => $id));
   if (variable_get('buddylist_send_remove', FALSE)) {
     buddylist_mail_user('remove', $thisuser);
   }
   drupal_set_message(t('%username has been removed from your @buddylist', array('%username' => $thisuser->name) + buddylist_translation()));
-
-  if (variable_get('buddylist_require_approval', 0)) {
-    db_query('DELETE FROM {buddylist} WHERE uid = %d AND buddy = %d', $id, $user->uid);
-    db_query('DELETE FROM {buddylist_buddy_group} WHERE uid = %d AND buddy = %d', $id, $user->uid);
-  }
 }
 
 function buddylist_cancel_add($id) {
