--- realname.module	2009-04-22 02:44:47.000000000 +0200
+++ realname.module.new	2009-04-28 16:16:29.000000000 +0200
@@ -144,6 +144,22 @@ function realname_menu() {
     'access arguments' => array('access content'),
     'type' => MENU_CALLBACK,
     );
+
+  // CCK User Reference intercept.
+  $items['realname/userreference/autocomplete'] = array(
+    'title' => 'RealName user reference autocomplete',
+    'access callback' => user_access('access content'),
+    'page callback' => 'realname_userreference_autocomplete',
+    'type' => MENU_CALLBACK,
+  );
+
+  // Privatemsg intercept for recipient autocomplete.
+  $items['realname/privatemsg/autocomplete'] = array(
+    'title' => 'Realname Privatemsg autocomplete',
+    'access callback' => user_access('access private messages'),
+    'page callback' => 'realname_privatemsg_autocomplete',
+    'type' => MENU_CALLBACK,
+  );
  
   return $items;
 }
@@ -226,7 +242,7 @@ function realname_tracker_page($account 
   }
   
   if ($account) {
-    realname_check_breadcrumbs($account);    
+    realname_check_breadcrumbs($account);
     drupal_set_title(realname_user_page_title($account));
   }
   return $output;
@@ -245,7 +261,7 @@ function realname_contact_user($account)
     $output = t('You cannot contact more than %number users per hour. Please try again later.', array('%number' => variable_get('contact_hourly_threshold', 3)));
   }
   else {
-    realname_check_breadcrumbs($account);    
+    realname_check_breadcrumbs($account);
     $output = drupal_get_form('contact_mail_user', $account);
   }
 
@@ -266,11 +282,11 @@ function realname_user_page_title($accou
 }
 
 /**
- * An implementation of hook_theme_registry_alter()
+ * Implementation of hook_theme_registry_alter().
  *
  * Swap in our own replacement for theme_username(), allowing the
  * site admin to configure the string on a per-nodetype basis.
- **/
+ */
 function realname_theme_registry_alter(&$theme_registry) {
   if (!empty($theme_registry['form_element'])) {
     $path = drupal_get_path('module', 'realname');
@@ -437,7 +453,7 @@ function realname_comment(&$comment, $op
         else {
           $users[$comment->uid] = $account = realname_get_user($comment->uid);
         }
-        
+
         $comment->homepage = isset($account->homepage) ? $account->homepage : NULL;
       }
       break;
@@ -469,6 +485,21 @@ function realname_form_alter(&$form, $fo
     return;
   }
 
+  if (drupal_substr($form_id, -10) == '_node_form') {
+    foreach ($form as $name => $elements) {
+      if (substr($name, 0, 6) == 'field_') { // select the fields
+        foreach ($elements as $key => $value) {
+          if (is_numeric($key)) { // select the items
+            if ($value['#type'] == 'userreference_autocomplete') { // make sure to select only the Userreference fields
+              $form[$name][$key]['#value_callback'] = 'realname_userreference_autocomplete_value';
+            }
+          }
+        }
+      }
+    }
+    // TODO: call realname_userreference_autocomplete instead of userreference_autocomplete. But how ? http://drupal.org/node/369334#comment-1525165
+  }
+
   $bypass_forms = variable_get('realname_bypass_forms', array(array('name' => 'comment_form', 'fields' => array('name'))));
   foreach ($bypass_forms as $bypass) {
     // Is it a form the admin wants bypassed?
@@ -478,7 +509,7 @@ function realname_form_alter(&$form, $fo
         $user->realname = realname_make_name($user);
       }
       $value = $user->uid ? $user->realname_save : variable_get('anonymous', 'Anonymous');
-      eval($field_name .' = $value;');      
+      eval($field_name .' = $value;');
     }
   }
 
@@ -524,6 +555,11 @@ function realname_form_alter(&$form, $fo
       $form['delete']['#weight'] = 99;
       $form['#submit'][] = '_realname_role_submit';
       break;
+
+    case 'privatemsg_new':
+      $form['privatemsg']['recipient']['#autocomplete_path'] = 'realname/privatemsg/autocomplete';
+      break;
+
   }
 }
 
@@ -533,7 +569,7 @@ function realname_form_alter(&$form, $fo
 function _realname_role_submit($form, &$form_state) {
   $rid = $form_state['values']['rid'];
   $pic = $form_state['values']['level'];
-  variable_set('realname_user_level_'. $rid, $pic);  
+  variable_set('realname_user_level_'. $rid, $pic);
 }
 
 /**
@@ -545,7 +581,7 @@ function realname_search($op = 'search',
   }
   switch ($op) {
     case 'name':
-      if ($skip_access_check || user_access('access user profiles')) {      
+      if ($skip_access_check || user_access('access user profiles')) {
         return variable_get('realname_user_disable', FALSE) ? t('Users') : t('User names');
       }
 
@@ -560,7 +596,7 @@ function realname_search($op = 'search',
       return array('remaining' => $remaining, 'total' => $total);
 
     case 'search':
-      if ($skip_access_check || user_access('access user profiles')) {      
+      if ($skip_access_check || user_access('access user profiles')) {
         $results = array();
         $find = do_search($keys, 'realname');
         foreach ($find as $item) {
@@ -607,6 +643,53 @@ function realname_update_index() {
   }
 }
 
+/**
+ * Intercept Privatemsg autocomplete results for usernames.
+ */
+function realname_privatemsg_autocomplete($string) {
+  $names = explode(',', $string);
+  $names = array_map('trim', $names);
+  $search = array_pop($names);
+  if ($search != '') {
+    $sql = "SELECT u.uid, u.name, r.realname FROM {users} u INNER JOIN {realname} r USING(uid) ";
+    $sql .= " WHERE u.status <> 0 AND LOWER(r.realname) LIKE LOWER('%%%s%%') AND ";
+    $sql .= variable_get('privatemsg_default_allow', 1) ? '(u.data NOT LIKE \'%%:16:"privatemsg_allow";i:0%%\' OR u.data IS NULL)' : 'u.data LIKE \'%%:16:"privatemsg_allow";i:1%%\'';
+    $sql .= ' ORDER BY r.realname ASC';
+    $result = db_query_range($sql, $search, 0, 10);
+    $prefix = count($names) ? implode(', ', $names) .', ' : '';
+    $matches = array();
+    while ($user = db_fetch_object($result)) {
+      $account = user_load(array('uid' => $user->uid));
+      $matches[$prefix . $user->name] = $user->realname;
+      if ($user->realname != $user->name) {
+        $matches[$prefix . $user->name] .= ' ('. $user->name .')';
+      }
+    }
+    drupal_json($matches);
+  }
+}
+
+/**
+ * CCK Userref intercept; Change autocomplete suggestions to realnames.
+ */
+function realname_userreference_autocomplete($field_name, $string = '') {
+  // TODO
+  drupal_json($matches);
+}
+
+/**
+ * Replacement of CCK userreference_autocomplete_value; Display realname on the node edit page for saved userreference fields.
+ */
+function realname_userreference_autocomplete_value($element, $edit = FALSE) {
+  $field_key  = $element['#columns'][0];
+  if (!empty($element['#default_value'][$field_key])) {
+    $account = realname_get_user($element['#default_value'][$field_key]);
+    $value = $account->name;
+    return array($field_key => $value);
+  }
+  return array($field_key => NULL);
+}
+
 //********************************************************************
 //* Module Functions
 //********************************************************************
