--- members.module	2007-01-30 19:04:33.000000000 -0500
+++ members.module	2007-01-30 23:48:07.000000000 -0500
@@ -58,6 +58,27 @@ function members_menu($may_cache) {
                      'callback' => "members_page",
                      'access' => user_access("access members list"),
                      'type' => MENU_MODIFIABLE_BY_ADMIN );
+    $items[] = array('path' => 'members/list',
+                     'title' => t("list"),
+                     'weight' => -10,
+                     'type' => MENU_DEFAULT_LOCAL_TASK );
+    $items[] = array('path' => 'members/roles',
+                     'callback' => "members_page_roles",
+                     'title' => t("by role"),
+                     'type' => MENU_LOCAL_TASK );
+
+    $rids = variable_get("members_roles", array());
+    $roles = user_roles(1);
+    $first = TRUE;
+    foreach ($rids as $rid) {
+      $type = ($first) ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK;
+      $first = FALSE;
+      $items[] = array('path' => "members/roles/$rid",
+                     'callback' => "members_page_roles",
+                     'callback arguments' => $rid,
+                     'title' => $roles[$rid],
+                     'type' => $type);
+    }
   }
 
   return $items;
@@ -147,7 +168,7 @@ function members_page($rids = null) {
             $data = array();
             foreach ($account->roles as $rid => $role) {
               if (in_array($rid, $roles)) {
-                $data[] = l($role, 'members/'.$rid);
+                $data[] = l($role, 'members/roles/'.$rid);
               }
             }
             $data = implode (', ', $data);
@@ -191,6 +212,116 @@ function members_page($rids = null) {
   }
 }
 
+function members_page_roles($rid = null) {
+  if (user_access('access members list')) {
+    // you may specify roles using second url argument. otherwise, use admin pref
+    if (!$rid) {
+      $roles = variable_get('members_roles', array());
+      reset($roles);
+      $rid = current($roles);
+    }
+
+    if ($rid) {
+      $fields = array();
+      $enabled_fields = variable_get('members_fields', _member_fields());
+      foreach (_member_fields() as $field => $data) {
+        // Don't show the "Roles" column
+        if (in_array($field, $enabled_fields) && $data != "Roles") {
+          $fields[$field] = $data;
+        }
+      }
+
+      foreach ($fields as $field => $data) {
+        if (drupal_substr($field, 0, 8) == 'profile.') {
+          $field = 'p.value';
+        }
+        else if ($field == 'rid') {
+          $field = '';
+        }
+
+        $header[] = array('data' => $data, 'field' => $field);
+      }
+
+      // build query
+      $query = 'SELECT DISTINCT(u.uid) FROM {users} u';
+
+      // the users_roles table isn't used if we're looking for only the "authenticated users" role
+      if ($rid != 2) {
+        $query .= ' INNER JOIN {users_roles} r ON u.uid=r.uid';
+      }
+
+      $sort = tablesort_get_order($header);
+      if ($sort['sql'] == 'p.value') {
+        $fieldid = db_result(db_query("SELECT fid FROM {profile_fields} WHERE name='%s'", drupal_substr(array_search($sort['name'], $fields), 8)));
+        $query .= " LEFT JOIN {profile_values} p ON u.uid=p.uid WHERE (p.fid = '". db_escape_string($fieldid). "' OR p.fid IS NULL) AND";
+      }
+      else {
+        $query .= ' WHERE';
+      }
+
+      // the users_roles table isn't used if we're looking for only the "authenticated users" role
+      if ($rid != 2) {
+        $query .= " r.rid = $rid AND";
+      }
+
+      $query .= ' u.status=1' . tablesort_sql($header);
+      $result = pager_query($query, 200);
+
+      $rows = array();
+      $profile_fields = array();
+
+      while ($userid = db_fetch_object($result)) {
+        $account = user_load(array('uid' => $userid->uid));
+        $row = array();
+
+        foreach ($fields as $field => $title) {
+          $data = NULL;
+          if (drupal_substr($field, 0, 8) == 'profile.') {
+            $field = drupal_substr($field, 8);
+            if (!$profile_fields[$field]) {
+              $profile_fields[$field] = db_fetch_object(db_query("SELECT * FROM {profile_fields} WHERE name='%s'", $field));
+            }
+            $data = profile_view_field($account, $profile_fields[$field]);
+          }
+          else if ($field == 'picture') {
+            $data = theme_user_picture($account);
+          }
+          else if ($field == 'access') {
+            $data = ($account->login) ? format_interval(time() - $account->access) : t('Never logged in');
+          }
+          else {
+            $data = $account->$field;
+          }
+
+          if (stristr($field, 'name')) {
+            $data = l($data, 'user/'.$account->uid);
+          }
+
+          $row[] = array('data' => $data);
+        }
+
+        $rows[] = $row;
+      }
+
+      if ($pager = theme("pager", NULL, 200)) {
+        $rows[] = array(array("data" => $pager, "colspan" => count($header)));
+      }
+
+      if ($rows) {
+        $output.= '<div id="members-main">'. theme("table", $header, $rows) .'</div>';
+      }
+      else {
+        $output.= '<div id="members-main">' . t("There aren't any users with that role") . '</div>';
+      }
+
+      return $output;
+    }
+    else {
+      return t("Warning: there aren't any users with roles configured to be shown here.");
+    }
+  }
+}
+
 function _member_fields() {
   $output = array();
 
