--- /Users/tim/Documents/Dev/Drupal/contrib-head/modules/members/members.module	2007-01-30 18:25:04.000000000 -0500
+++ /Users/tim/Documents/Dev/Drupal/- Work/members.module	2007-01-30 19:04:33.000000000 -0500
@@ -10,24 +10,42 @@ function members_help($section) {
 }
 
 function members_settings() {
-  $form["members_roles"] = array(
+  $form['members_roles'] = array(
     '#type' => 'select',
-    '#title' => t("Roles to show"),
-    '#default_value' => variable_get("members_roles", array()),
+    '#title' => t('Roles to show'),
+    '#default_value' => variable_get('members_roles', array()),
     '#options' => user_roles(1),
-    '#description' => t("Select roles to show in the members listing."),
+    '#description' => t('Select roles to show in the members listing.'),
     '#extra' => 0,
     '#multiple' => 1,
+    '#size' => 5,
   );
-  $form["members_fields"] = array(
+  $form['members_fields'] = array(
     '#type' => 'select',
-    '#title' => t("Columns to show"),
-    '#default_value' => variable_get("members_fields", _member_fields()),
+    '#title' => t('Columns to show'),
+    '#default_value' => variable_get('members_fields', _member_fields()),
     '#options' => _member_fields(),
-    '#description' => t("Select the fields which should be displayed on your members overview page. Note that some fields require certain modules to be active."),
+    '#description' => t('Select the fields which should be displayed on your members overview page. Note that some fields require certain modules to be active.'),
     '#extra' => 0,
     '#multiple' => 1,
+    '#size' => 5,
   );
+  $form['members_encode_mailto'] = array(
+   '#type' => 'checkbox',
+   '#title' => t('Obfuscate e-mail addresses using JavaScript'),
+   '#return_value' => 1,
+   '#default_value' => variable_get('members_encode_mailto', 1),
+   '#description' => t('When checked, email addresses will not be included directly in the HTML source to deter spam crawlers. Note: this requires users have a JavaScript-enabled browser.'),
+  );
+  $form['members_field_length'] = array(
+   '#type' => 'textfield',
+   '#title' => t('Truncated field length'),
+   '#default_value' => variable_get('members_field_length', 0),
+   '#size' => 4,
+   '#maxlength' => 6,
+   '#description' => t('If set (and non-zero), all fields will be truncated to this length (in characters) to preserve table layouts.'),
+  );
+
   return $form;
 }
 
@@ -53,7 +71,7 @@ function members_perm() {
 function members_page($rids = null) {
 
   if (user_access("access members list")) {
-    
+
     // you may specify roles using second url argument. otherwise, use admin pref
     if ($rids) {
       $roles = explode(',', $rids);
@@ -63,7 +81,6 @@ function members_page($rids = null) {
     }
 
     if ($roles) {
-
       $fields = array();
       $enabled_fields = variable_get("members_fields", _member_fields());
       foreach (_member_fields() as $field => $data) {
@@ -79,22 +96,33 @@ function members_page($rids = null) {
         }
         $header[] = array("data" => $data, "field" => $field);
       }
-      
-      foreach ($roles as $rid) {
-        $list[] = "'" . db_escape_string($rid) ."'";
-      }
-      $list = implode(',', $list);
 
-      $query = "SELECT DISTINCT(u.uid) FROM {users} u INNER JOIN {users_roles} r ON u.uid=r.uid";
+      if (in_array('2', $roles)) {
+        $allusers = 1;
+        $query = 'SELECT DISTINCT(u.uid) FROM {users} u';
+      }
+      else {
+        $allusers = 0;
+        foreach ($roles as $rid) {
+          $list[] = "'" . db_escape_string($rid) ."'";
+        }
+        $list = implode(',', $list);
+        $query = 'SELECT DISTINCT(u.uid) FROM {users} u 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)));
+        $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";
       }
-      $query.= " r.rid IN ($list) AND u.status=1" . tablesort_sql($header);
+      if ($allusers == 0) {
+        $query .= " r.rid IN ($list) AND u.status = 1" . tablesort_sql($header);
+      }
+      else {
+        $query .= ' u.status=1' . tablesort_sql($header);
+      }
       $result = pager_query($query, 200);
 
       $rows = array();
@@ -110,6 +138,10 @@ function members_page($rids = null) {
               $profile_fields[$field] = db_fetch_object(db_query("SELECT * FROM {profile_fields} WHERE name='%s'", $field));
             }
             $data = profile_view_field($account, $profile_fields[$field]);
+            $length = variable_get('members_field_length', 0);
+            if ($length && is_numeric($length)) {
+              $data  = truncate_utf8($data, $length, TRUE);
+            }
           }
           else if ($field == 'rid') {
             $data = array();
@@ -123,8 +155,16 @@ function members_page($rids = null) {
           else if ($field == 'picture') {
             $data = theme_user_picture($account);
           }
-          else if ($field == 'changed') {
-            $data = format_interval(time() - $account->changed);
+          else if ($field == 'access') {
+            $data = ($account->login) ? format_interval(time() - $account->access) : t('Never logged in');
+          }
+          else if ($field == 'mail') {
+            if (variable_get('members_encode_mailto', 1)) {
+              $data = _members_encode_mailto($account->mail);
+            }
+            else {
+              $data = $account->mail;
+            }
           }
           else {
             $data = $account->$field;
@@ -137,13 +177,13 @@ function members_page($rids = null) {
         }
         $rows[] = $row;
       }
-      
-      if ($pager = theme("pager", NULL, 200, 0, tablesort_pager())) {
+
+      if ($pager = theme('pager', NULL, 200, 0)) {
         $rows[] = array(array("data" => $pager, "colspan" => count($header)));
       }
 
       $output.= '<div id="members-main">'. theme("table", $header, $rows) .'</div>';
-      return  $output;
+      return $output;
     }
     else {
       return t("Warning: there aren't any users with roles configured to be shown here.");
@@ -159,16 +199,33 @@ function _member_fields() {
 
   // profile fields
   if (module_exist('profile')) {
-    $result = db_query("SELECT name,title FROM {profile_fields} WHERE visibility = %d ORDER BY weight ASC", PROFILE_PUBLIC_LISTINGS);
+    $result = db_query('SELECT name, title FROM {profile_fields} WHERE visibility = %d ORDER BY weight ASC', PROFILE_PUBLIC_LISTINGS);
     while ($row = db_fetch_object($result)) {
       $output["profile.$row->name"] = $row->title;
     }
   }
 
   $output['mail'] = t('Email');
-  $output['changed'] = t('Last Seen');
+  $output['access'] = t('Last Seen');
   $output['picture'] = t('Picture');
 
   return $output;
 }
+
+function _members_encode_mailto($mail) {
+  $link = 'document.write(\'<a href="mailto:' . $mail . '">' . $mail . '</a>\');';
+
+  $js_encode = '';
+  for ($x = 0; $x < strlen($link); $x++) {
+    $js_encode .= '%' . bin2hex($link{$x});
+  }
+
+  $link = '<script type="text/javascript" language="javascript">eval(unescape(\''.$js_encode.'\'))</script>';
+  if (isset($matches[3])) {
+    $link = $matches[1] . $link;
+  }
+
+  return $link;
+}
+
 ?>
