--- profile.module	2009-01-14 03:38:52.000000000 -0200
+++ /Users/pedrofaria/Desktop/profile.module	2009-02-13 17:04:52.000000000 -0200
@@ -259,6 +259,15 @@
       '#description' => t('A list of all options. Put each option on a separate line. Example options are "red", "blue", "green", etc.'),
     );
   }
+  else if ($type == 'userref') {
+    $form['fields']['options'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Roles'),
+      '#description' => t('The description appears usually below the checkboxes.'),
+      '#options' => user_roles(TRUE),
+      '#default_value' => unserialize($edit['options']),
+    );
+  }
   $form['fields']['weight'] = array('#type' => 'weight',
     '#title' => t('Weight'),
     '#default_value' => $edit['weight'],
@@ -350,6 +359,10 @@
  * Process profile_field_form submissions.
  */
 function profile_field_form_submit($form_id, $form_values) {
+  if ($form_values['type'] == 'userref') {
+    $form_values['options'] = serialize($form_values['options']);
+  }
+  
   if (!isset($form_values['fid'])) {
     db_query("INSERT INTO {profile_fields} (title, name, explanation, category, type, weight, required, register, visibility, autocomplete, options, page) VALUES ('%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, %d, '%s', '%s')", $form_values['title'], $form_values['name'], $form_values['explanation'], $form_values['category'], $form_values['type'], $form_values['weight'], $form_values['required'], $form_values['register'], $form_values['visibility'], $form_values['autocomplete'], $form_values['options'], $form_values['page']);
 
@@ -587,6 +600,8 @@
           }
         }
         return implode(', ', $fields);
+      case 'userref':
+        return db_result(db_query("SELECT name FROM {users} WHERE uid = %d", $value));
     }
   }
 }
@@ -700,6 +715,29 @@
           '#required' => $field->required,
         );
         break;
+      case 'userref':
+        foreach(unserialize($field->options) as $rid => $val) {
+          if ($val != 0) {
+            $roles[] = $val;
+          }
+        }
+        $rs = db_query("SELECT u.uid, u.name FROM {users_roles} r LEFT JOIN {users} u ON u.uid = r.uid WHERE r.rid IN( %s )", join(',', $roles));
+        
+        $options = array();
+        while($row = db_fetch_object($rs)) {
+          $options[$row->uid] = $row->name;
+        }
+        
+        //var_dump($field->options);
+        $fields[$category][$field->name] = array('#type' => 'select',
+          //'#value' => '<pre>'.var_export($rs, true).'</pre>',
+          '#title' => check_plain($field->title),
+          '#default_value' => $edit[$field->name],
+          '#options' => $options,
+          '#description' => _profile_form_explanation($field),
+          '#required' => $field->required,
+        );
+        break;
     }
   }
   return $fields;
@@ -807,7 +845,8 @@
                  'selection' => t('list selection'),
                  'list' => t('freeform list'),
                  'url' => t('URL'),
-                 'date' => t('date'));
+                 'date' => t('date'),
+                 'userref' => t('User reference'));
   return isset($type) ? $types[$type] : $types;
 }
 
