Index: stormtask/stormtask.module
===================================================================
--- stormtask/stormtask.module	(revision 233)
+++ stormtask/stormtask.module	(working copy)
@@ -1088,9 +1088,9 @@
         }
         // Assigned to a team
         else {
-          $assignees_array = $assignees_node->members_array;
+          $assignees_array = $assignees_node->members;
           $assignees = array();
-          foreach ($assignees_array as $nid => $name) {
+          foreach ($assignees_array as $nid) {
             $assignee = node_load($nid);
             $assignees[] = stormperson_primary_email($assignee);
           }
Index: storm.module
===================================================================
--- storm.module	(revision 233)
+++ storm.module	(working copy)
@@ -926,8 +926,9 @@
         else { // ($node->type == 'stormteam')
           if (module_exists('stormteam')) {
             $options[$teams][$node->nid] = check_plain($node->title);
-            foreach ($node->members_array as $nid => $name) {
-              $options[$people][$nid] = check_plain($name);
+            foreach ($node->members as $nid) {
+              $member = node_load($nid);
+              $options[$people][$nid] = check_plain($member->title);
             }
           }
         }
Index: stormproject/stormproject.module
===================================================================
--- stormproject/stormproject.module	(revision 233)
+++ stormproject/stormproject.module	(working copy)
@@ -892,9 +892,9 @@
         }
         // Assigned to a team
         else {
-          $assignees_array = $assignees_node->members_array;
+          $assignees_array = $assignees_node->members;
           $assignees = array();
-          foreach ($assignees_array as $nid => $name) {
+          foreach ($assignees_array as $nid) {
             $assignee = node_load($nid);
             $assignees[] = stormperson_primary_email($assignee);
           }
Index: stormticket/stormticket.module
===================================================================
--- stormticket/stormticket.module	(revision 233)
+++ stormticket/stormticket.module	(working copy)
@@ -884,9 +884,9 @@
         }
         // Assigned to a team
         else {
-          $assignees_array = $assignees_node->members_array;
+          $assignees_array = $assignees_node->members;
           $assignees = array();
-          foreach ($assignees_array as $nid => $name) {
+          foreach ($assignees_array as $nid) {
             $assignee = node_load($nid);
             $assignees[] = stormperson_primary_email($assignee);
           }
Index: stormteam/stormteam.module
===================================================================
--- stormteam/stormteam.module	(revision 233)
+++ stormteam/stormteam.module	(working copy)
@@ -191,7 +191,7 @@
   }
   if (user_access('Storm team: view belonged')) {    
     if (!empty($cond)) $cond .= ' OR ';
-    $cond .= "ste.members LIKE '%i:". $user->stormperson_nid .";%'";
+    $cond .= "ste.mnid = ". strval($user->stormperson_nid);
   }
   if (empty($cond)) $cond = '0=1';
   $where[] = $cond;
@@ -227,7 +227,7 @@
       if ($cond) {
         $cond .= ' OR ';
       }
-      $cond .= "ste1.members LIKE '%i:". $account->stormperson_nid .";%'";
+      $cond .= "ste1.mnid = '". $account->stormperson_nid;
     }
     if ($cond) {
       $cond = " WHEN 'stormteam' THEN (SELECT IF($cond,1,0) FROM {stormteam} ste1 WHERE ste1.vid=${primary_table}.vid) ";
@@ -291,35 +291,16 @@
   
   $options = $options + array(-2 => t('-ORGANIZATIONS-')) + $organizations;
   
-  $i = 1;
-  $variable = 'members_array_'. $i;
+  $form['members'] = array(
+    '#type' => 'select',
+    '#title' => t('Team Members'),
+    '#multiple' => TRUE,
+    '#description' => t('Select the members of this team.'),
+    '#options' => $options,
+    '#default_value' => $node->members,
+    '#weight' => -5,
+  );
   
-  // Add rows for existing team members
-  if (isset($node->members_array) && is_array($node->members_array)) {
-    foreach ($node->members_array as $node->$variable => $name) {
-      $form['group1'][$variable] = array(
-        '#type' => 'select',
-        '#title' => t('Team Member @num', array('@num' => $i)),
-        '#options' => $options,
-        '#default_value' => $node->$variable,
-      );
-      $i++;
-      $variable = 'members_array_'. $i;
-    }
-  }
-  
-  // Add placeholder rows
-  for ($j = 0; $j < 3; $j++) {
-    $variable = 'members_array_'. $i;
-    $form['group1'][$variable] = array(
-      '#type' => 'select',
-      '#title' => t('Team Member @num', array('@num' => $i)),
-      '#options' => $options,
-      '#default_value' => (isset($node->$variable)) ? $node->$variable : NULL,
-    );
-    $i++;
-  }
-  
   if ($type->has_body) {
     $form['body_field'] = node_body_field($node, $type->body_label, $type->min_word_count);
   }
@@ -334,13 +315,21 @@
 
 /**
  * @function
- * Implementation of hook_load
+ * Implements hook_load().
  */
 function stormteam_load($node) {
-  $additions = db_fetch_object(db_query('SELECT * FROM {stormteam} WHERE vid = %d', $node->vid));
-  if (isset($additions->members)) {
-    $additions->members_array = unserialize($additions->members);
+  $additions = new stdClass();
+  
+  // Load all the rows containing member information for this team
+  $result = db_query('SELECT mnid FROM {stormteam} WHERE vid = %d', $node->vid);
+
+  while ($team = db_fetch_object($result)) {
+    // Don't add a member nid of 0 or less
+    if ($team->mnid > 0) {
+      $additions->members[$team->mnid] = $team->mnid;
+    }
   }
+
   $additions->title_old = $node->title;
   return $additions;
 }
@@ -361,60 +350,46 @@
 
 /**
  * @function
- * Function to be called internally before saving Storm Team nodes
+ * Implements hook_insert().
  */
-function _stormteam_beforesave(&$node) {
-  $i = 1;
-  $variable = 'members_array_'. $i;
+function stormteam_insert($node) {
 
-  while (isset($node->$variable)) {
-    $title = db_fetch_object(db_query('SELECT n.title FROM {node} AS n WHERE nid = %d', $node->$variable));
-    if (!empty($title)) {
-      $node->members_array[$node->$variable] = $title->title;
+  if (isset($node->vid) && (isset($node->nid)) && (isset($node->members))) {
+    $team = new stdClass();
+    $team->nid = $node->nid;
+    $team->vid = $node->vid;
+
+    foreach($node->members as $member) {
+      $team->mnid = $member;
+      drupal_write_record('stormteam', $team);
     }
-    $i++;
-    $variable = 'members_array_'. $i;
   }
-  if (isset($node->members_array)) {
-    if (array_key_exists(0, $node->members_array)) {
-      unset($node->members_array[0]);
-    }
-  
-    $node->members = serialize($node->members_array);
-  }
 }
 
 /**
  * @function
- * Implementation of hook_insert
+ * Implements hook_update().
  */
-function stormteam_insert($node) {
-  _stormteam_beforesave($node);
-  if (isset($node->vid) && (isset($node->nid)) && (isset($node->members))) {
-    db_query("INSERT INTO {stormteam}
-      (vid, nid, members) VALUES
-      (%d, %d, '%s')",
-      $node->vid, $node->nid, $node->members
-    );
-  }
-}
-
-/**
- * @function
- * Implementation of hook_update
- */
 function stormteam_update($node) {
-  _stormteam_beforesave($node);
-  
   if ($node->revision) {
     stormexpense_insert($node);
   }
   else {
-    db_query("UPDATE {stormteam} SET
-      members = '%s' WHERE vid = %d",
-      $node->members, $node->vid
-    );
+    // Delete users who are no longer members
+    $placeholders = db_placeholders($node->members, 'int');
     
+    // Update those who remain
+    db_query("DELETE FROM {stormteam} WHERE vid = %d AND mnid NOT IN ($placeholders)", $node->vid);
+    $team = new stdClass();
+    $team->nid = $node->nid;
+    $team->vid = $node->vid;
+    foreach($node->members as $member) {
+      if ($member > 0){
+        $team->mnid = $member;
+        drupal_write_record('stormteam', $team);
+      }
+    }
+    
     // Invokes hook_stormteam_change so that if title has changed, other modules that have cached the title can update it.
     if ($node->title != $node->title_old) {
       module_invoke_all('stormteam_change', $node->nid, $node->title);
@@ -424,7 +399,7 @@
 
 /**
  * @function
- * Implementation of hook_delete
+ * Implements hook_delete().
  */
 function stormteam_delete($node) {
   // Notice that we're matching all revision, by using the node's nid.
@@ -661,25 +636,28 @@
   $node = node_load($team);
   
   // Check for person_or_organization_nid in the team members array and return TRUE / FALSE
-  if (is_array($node->members_array)) {
-    return array_key_exists($person_or_organization_nid, $node->members_array);
-  } else {
-    return FALSE;
+  if (is_array($node->members)) {
+    return isset($node->members[$person_or_organization_nid]);
   }
+  return FALSE;
+
 }
 
 /**
-* @function
-* Function to return the teams that a user is a member of
-*/
+ * @function
+ * Get the list of stormteam nids that a user is a member of
+ * 
+ * @param object $account [optional]
+ * @return array
+ *  Returns the array of stormteam nids the user belongs to.
+ */
 function stormteam_user_return_teams($account = NULL) {
   if (empty($account)) {
     global $user;
     $account = $user;
   }
-  
-  $s = "SELECT ste.nid FROM {stormteam} ste WHERE (ste.members LIKE '%%i:%d;%%' OR ste.members LIKE '%%i:%d;%%')";
-  $r = db_query($s, $account->stormperson_nid, $account->stormorganization_nid);
+  $s =   "SELECT ste.nid FROM {stormteam} ste JOIN {stormperson} stp ON stp.nid = ste.mnid WHERE stp.user_uid = %d";
+  $r = db_query($s, $account->uid);
   $teams = array();
   while ($team = db_fetch_object($r)) {
     $teams[] = $team->nid;
Index: stormteam/stormteam.views.inc
===================================================================
--- stormteam/stormteam.views.inc	(revision 233)
+++ stormteam/stormteam.views.inc	(working copy)
@@ -2,7 +2,7 @@
 // $Id: stormteam.views.inc,v 1.1.2.2 2009/12/12 21:38:39 magnity Exp $
 
 function stormteam_views_data() {
-  $data['stormteam']['table']['group']  = 'Storm';
+  $data['stormteam']['table']['group']  = 'Storm Team';
   $data['stormteam']['table']['join'] = array(
     'node' => array(
       'left_field' => 'vid',
@@ -10,27 +10,34 @@
     ),
   );
   
-  $data['stormteam']['members'] = array(
-    'title' => t('Team Members'),
+  $data['stormteam']['mnid'] = array(
+    'title' => t('Team Member Nid'),
     'help' => 'Storm Team Members',
     'field' => array(
-      'handler' => 'stormteam_handler_field_teammembers',
+      'handler' => 'views_handler_field_node',
       'click sortable' => FALSE,
     ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_node_nid',
+      'parent' => 'views_handler_argument_numeric',
+      'numeric' => TRUE,
+      'validate type' => 'nid',
+    ),
+    // Information for accepting a nid as a filter
+    'filter' => array(
+      'handler' => 'views_handler_filter_nid',
+    ),
+    // Information for sorting on a nid.
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'relationship' => array(
+      'base' => 'node',
+      'field' => 'nid',
+      'handler' => 'views_handler_relationship',
+      'label' => t('Member -> Node'),
+    ),
   );
   
   return $data;
-}
-
-function stormteam_views_handlers() {
-  return array(
-    'info' => array(
-      'path' => drupal_get_path('module', 'stormteam'),
-    ),
-    'handlers' => array(
-      'stormteam_handler_field_teammembers' => array(
-        'parent' => 'views_handler_field_prerender_list',
-      ),
-    ),
-  );
-}
+}
\ No newline at end of file
Index: stormteam/stormteam.install
===================================================================
--- stormteam/stormteam.install	(revision 233)
+++ stormteam/stormteam.install	(working copy)
@@ -46,15 +46,18 @@
       'nid' => array(
         'type' => 'int',
         'not null' => TRUE,
-        'default' => 0),
-      'members' => array(
-        'type' => 'text',
-        'size' => 'medium',
+        'default' => 0
       ),
+      'mnid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0
+      ),
     ),
     'primary key' => array(
       'vid',
       'nid',
+      'mnid',
     ),
   );
   
@@ -87,3 +90,98 @@
   }
   return $ret;
 }
+
+/**
+ * Implements hook_update_N().
+ *
+ * Migrate members serialized array to member node id
+ */
+function stormteam_update_6102() {
+  
+  $ret = array();
+  $new_schema = _stormteam_update_6102_schema();
+  
+  // Create the new table with a temporary name
+  db_create_table($ret, 'stormteam_6102', $new_schema['stormteam_6102']);
+  
+  // Check for collisions between org names and person names
+  $result = _stormteam_update_6102_map_team_members_to_nid();
+  if (FALSE === $result) {
+    // Abort the changes
+    $ret['#abort'] = array('success' => FALSE, 'query' => "Unable to map team members to nodes. Failed to write data to new table.");
+
+    // Remove the new table
+   // db_drop_table($ret, 'stormteam_6102');
+
+    // Return the failed update
+    return $ret;
+  }
+    
+  // Remove the old table
+  db_drop_table($ret, 'stormteam');
+  
+  // Rename the table to the proper name
+  db_rename_table($ret, 'stormteam_6102', 'stormteam');
+  
+  return $ret;
+}
+
+/**
+ * Maps the old member fullnames to the nids
+ *
+ * @return boolean
+ *  Returns TRUE if the conversion worked, FALSE otherwise.
+ */
+function _stormteam_update_6102_map_team_members_to_nid() {
+  $result = db_query("SELECT * FROM {stormteam}");
+  $mapping = array();
+  while ($team = db_fetch_object($result)) {
+
+    $members = unserialize($team->members);
+
+    // Generate the mapping array and save it to the database
+    foreach($members as $nid => $fullname) {
+      $mapping = new stdClass();
+      $mapping->nid = $team->nid;
+      $mapping->vid = $team->vid;
+      $mapping->mnid = $nid;
+      $result = db_query('INSERT INTO {stormteam_6102} VALUES (%d, %d, %d)', $mapping->nid, $mapping->vid, $mapping->mnid);
+      if (FALSE === $result) {
+        // Write failed, abort the update
+        return FALSE;
+      }
+    }
+  }
+  return TRUE;
+}
+
+/**
+ * Schema required for the 6102 update
+ */
+function _stormteam_update_6102_schema() {
+  $schema['stormteam_6102'] = array(
+    'fields' => array(
+      'vid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'nid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0
+      ),
+      'mnid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0
+      ),
+    ),
+    'primary key' => array(
+      'vid',
+      'nid',
+      'mnid',
+    ),
+  );
+  return $schema;
+}
\ No newline at end of file
Index: stormteam/stormteam.theme.inc
===================================================================
--- stormteam/stormteam.theme.inc	(revision 233)
+++ stormteam/stormteam.theme.inc	(working copy)
@@ -15,7 +15,9 @@
   
   $node = node_prepare($node, $teaser);
   $type = node_get_types('type', $node);
-    
+
+  // Store list of links to members
+  $members = array();
   /*$node->content['links'] = array(
     '#prefix' => '<div class="stormlinks"><dl>',
     '#suffix' => '</dl></div>',
@@ -29,18 +31,18 @@
   );
   
   // Add links to each team member title
-  if (isset($node->members_array) && is_array($node->members_array)) {
-    foreach ($node->members_array as $nid => $name) {
+  if (isset($node->members) && is_array($node->members)) {
+    foreach ($node->members as $nid => $mnid) {
       $member = node_load($nid);
       if (($member->type == 'stormperson' && stormperson_access('view', $nid)) || ($member->type == 'stormorganization' && stormorganization_access('view', $nid))) {
-        $node->members_array[$nid] = l($name, 'node/'. $nid);
+        $members[$nid] = l($member->title, 'node/'. $nid);
     }
   }
     
     $node->content['group1']['members'] = array(
       '#prefix' => '<div class="members">',
       '#suffix' => '</div>',
-      '#value' => theme('storm_view_item', t('Members'), implode(", ", $node->members_array)),
+      '#value' => theme('storm_view_item', t('Members'), implode(", ", $members)),
       '#weight' => $w++,
     );
   }
Index: stormteam/stormteam_handler_field_teammembers.inc
===================================================================
--- stormteam/stormteam_handler_field_teammembers.inc	(revision 233)
+++ stormteam/stormteam_handler_field_teammembers.inc	(working copy)
@@ -1,10 +1,10 @@
 <?php
 // $Id: stormteam_handler_field_teammembers.inc,v 1.1.2.1 2009/10/03 17:03:35 magnity Exp $
-
+// DEPRECATED
 /**
  * Separate team members into array.
  */
-class stormteam_handler_field_teammembers extends views_handler_field_prerender_list {
+/*class stormteam_handler_field_teammembers extends views_handler_field_prerender_list {
   
   function render($values) {
     $field = $values->{$this->field_alias};
@@ -32,3 +32,4 @@
     }
   }
 }
+*/
\ No newline at end of file
