Index: stormteam/stormteam.install
===================================================================
--- stormteam/stormteam.install	(revision 1511)
+++ stormteam/stormteam.install	(working copy)
@@ -87,3 +87,51 @@
   }
   return $ret;
 }
+
+
+/**
+ * @function
+ * Implementation of hook_update_N
+ * Update for Multiple Select for Teammembers
+ */
+function stormteam_update_6102() {
+  $ret = array();
+  $s_per = "SELECT n.nid, n.title FROM {node} n INNER JOIN {stormperson} spe ON n.vid=spe.vid WHERE n.type='stormperson' ORDER BY n.title";
+  $r_per = db_query($s_per);
+  $people = array();
+  while ($person = db_fetch_object($r_per)) {
+    $people[$person->nid] = $person->title;
+  }
+
+  $s_org = "SELECT n.nid, n.title FROM {node} n WHERE n.type='stormorganization' ORDER BY n.title";
+  $r_org = db_query($s_org);
+  $organizations = array();
+  while ($organization = db_fetch_object($r_org)) {
+    $organizations[$organization->nid] = $organization->title;
+  }
+
+  $sql = "SELECT ste.members, ste.vid FROM {stormteam} ste";
+  $results = db_query($sql);
+  while($team = db_fetch_object($results)) {
+    $members_array = unserialize($team->members);
+    $members_array_new = array();
+    foreach ($members_array as $team_nid => $title) {
+      if (array_key_exists($team_nid, $people) === TRUE) {
+        $members_array_new['people'][$team_nid] = $title;
+      }
+      elseif (array_key_exists($team_nid, $organizations) === TRUE) {
+        $members_array_new['organizations'][$team_nid] = $title;
+      }
+    }
+
+    if (!empty($members_array_new)) {
+      $team->members = serialize($members_array_new);
+      $sql = "UPDATE {stormteam} SET members='%s' WHERE vid=%d";
+      $result = db_query($sql, $team->members, $team->vid);
+      
+      $ret[] = array('success' => $result !== FALSE, 'query' => 'Updated team vid '. $team->vid);
+    }
+  }
+
+  return $ret;
+}
\ No newline at end of file
Index: stormteam/stormteam.module
===================================================================
--- stormteam/stormteam.module	(revision 1511)
+++ stormteam/stormteam.module	(working copy)
@@ -15,7 +15,7 @@
  * Implementation of hook_help
  */
 /*function stormteam_help($path, $arg) {
-}*/
+ }*/
 
 /**
  * @function
@@ -23,7 +23,7 @@
  */
 function stormteam_menu() {
   $items = array();
-  
+
   $items['storm/teams'] = array(
     'title' => 'Teams',
     'description' => 'Storm Teams',
@@ -32,16 +32,16 @@
     'type' => MENU_NORMAL_ITEM,
     'weight' => 2,
   );
-  
+
   $items['storm/teams/autocomplete'] = array(
     'title' => 'Teams Autocomplete',
     'page callback' => 'stormteam_autocomplete',
     'access arguments' => array('Storm team: access'),
     'type' => MENU_CALLBACK,
   );
-  
+
   //$items['admin/settings/storm/team'] = array();
-  
+
   return $items;
 }
 
@@ -74,11 +74,11 @@
     'stormteam_list' => array(
       'file'      => 'stormteam.theme.inc',
       'arguments' => array('header', 'teams'),
-    ),
+  ),
     'stormteam_view' => array(
       'file'      => 'stormteam.theme.inc',
       'arguments' => array('node', 'teaser', 'page'),
-    ),
+  ),
   );
 }
 
@@ -105,7 +105,7 @@
       'description' => t('A team for use within the Storm project management application'),
       'title_label' => t('Team Name'),
       'body_label' => t('Description'),
-    )
+  )
   );
 }
 
@@ -130,9 +130,9 @@
     global $user;
     $account = $user;
   }
-  
+
   if (is_numeric($node)) $node = node_load($node);
-  
+
   switch ($op) {
     case 'create':
       return user_access('Storm team: add');
@@ -182,14 +182,14 @@
     $where[] = "'storm_access'='storm_access'";
     return storm_rewrite_sql($sql, $where);
   }
-  
+
   global $user;
-  
+
   $cond = '';
   if (user_access('Storm team: view own')) {
     $cond .= 'n.uid='. $user->uid;
   }
-  if (user_access('Storm team: view belonged')) {    
+  if (user_access('Storm team: view belonged')) {
     if (!empty($cond)) $cond .= ' OR ';
     $cond .= "ste.members LIKE '%i:". $user->stormperson_nid .";%'";
   }
@@ -222,21 +222,21 @@
     $cond = '';
     if (user_access('Storm team: view own', $account)) {
       $cond .= " ${primary_table}.uid=". $account->uid;
-    }
-    if (user_access('Storm team: view belonged', $account)) {
-      if ($cond) {
-        $cond .= ' OR ';
-      }
-      $cond .= "ste1.members LIKE '%i:". $account->stormperson_nid .";%'";
-    }
+  }
+  if (user_access('Storm team: view belonged', $account)) {
     if ($cond) {
-      $cond = " WHEN 'stormteam' THEN (SELECT IF($cond,1,0) FROM {stormteam} ste1 WHERE ste1.vid=${primary_table}.vid) ";
-    }
-    else {
-      $cond = " WHEN 'stormteam' THEN 0 ";
+      $cond .= ' OR ';
     }
+    $cond .= "ste1.members LIKE '%i:". $account->stormperson_nid .";%'";
   }
-  
+  if ($cond) {
+    $cond = " WHEN 'stormteam' THEN (SELECT IF($cond,1,0) FROM {stormteam} ste1 WHERE ste1.vid=${primary_table}.vid) ";
+}
+else {
+  $cond = " WHEN 'stormteam' THEN 0 ";
+}
+  }
+
   $conds[$primary_table][$account->uid] = $cond;
   return $cond;
 }
@@ -247,13 +247,13 @@
  */
 function stormteam_form(&$node) {
   $breadcrumb = array(
-    l('Storm', 'storm'),
-    l('Teams', 'storm/teams'),
+  l('Storm', 'storm'),
+  l('Teams', 'storm/teams'),
   );
   drupal_set_breadcrumb($breadcrumb);
-  
+
   $type = node_get_types('type', $node);
-  
+
   $form['title'] = array(
     '#type' => 'textfield',
     '#title' => check_plain($type->title_label),
@@ -261,14 +261,14 @@
     '#default_value' => $node->title,
     '#weight' => module_exists('content') ? content_extra_field_weight($node->type, 'title') : -21,
   );
-  
+
   $form['group1'] = array(
     '#type' => 'markup',
     '#weight' => module_exists('content') ? content_extra_field_weight($node->type, 'group1') : -20,
   );
-  
-  $options = array(0 => '-');
-  
+
+  $options = array(0 => '- none -');
+
   $s_per = "SELECT n.nid, n.title FROM {node} n INNER JOIN {stormperson} spe ON n.vid=spe.vid WHERE n.type='stormperson' ORDER BY n.title";
   $s_per = stormperson_access_sql($s_per);
   $s_per = db_rewrite_sql($s_per);
@@ -277,9 +277,10 @@
   while ($person = db_fetch_object($r_per)) {
     $people[$person->nid] = $person->title;
   }
-  
-  $options = $options + array(-1 => t('-PEOPLE-')) + $people;
-  
+  if (!empty($people)) {
+    $options = $options + array(t('People:') => $people) ;
+  }
+
   $s_org = "SELECT n.nid, n.title FROM {node} n WHERE n.type='stormorganization' ORDER BY n.title";
   $s_org = stormorganization_access_sql($s_org);
   $s_org = db_rewrite_sql($s_org);
@@ -288,47 +289,51 @@
   while ($organization = db_fetch_object($r_org)) {
     $organizations[$organization->nid] = $organization->title;
   }
-  
-  $options = $options + array(-2 => t('-ORGANIZATIONS-')) + $organizations;
-  
-  $i = 1;
-  $variable = 'members_array_'. $i;
-  
-  // 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;
-    }
+
+  if (!empty($organizations)) {
+    $options = $options + array(t('Organizations:') => $organizations);
   }
-  
-  // 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++;
+
+  $default = array();
+  if (!empty($node->members_array)) {
+
+    if (!empty($node->members_array['people']) && !empty($node->members_array['organizations'])) {
+      $default = array_merge(array_keys($node->members_array['people']), array_keys($node->members_array['organizations']));
+    }
+    elseif (!empty($node->members_array['people']) && empty($node->members_array['organizations'])) {
+      $default = array_keys($node->members_array['people']);
+    }
+    elseif (empty($node->members_array['people']) && !empty($node->members_array['organizations'])) {
+      $default = array_keys($node->members_array['organizations']);
+    }
+
   }
-  
+
+  $form['group1']['members_array'] = array(
+    '#type' => 'select',
+    '#title' => t('Team Members'),
+    '#description' => t('Please keep the CTRL/STRG key pressed to select multiple team members'),
+    '#options' => $options,
+    '#default_value' => $default,
+    '#multiple' => TRUE,
+    '#size' => 10,
+  );
+
+  $form['group1']['member_options'] = array(
+    '#type' => 'value',
+    '#value' => $options,
+  );
+
+
   if ($type->has_body) {
     $form['body_field'] = node_body_field($node, $type->body_label, $type->min_word_count);
   }
-  
+
   $form['title_old'] = array(
     '#type' => 'hidden',
     '#default_value' => (isset($node->title_old)) ? $node-title_old : NULL,
   );
-  
+
   return $form;
 }
 
@@ -351,8 +356,8 @@
  */
 function stormteam_view($node, $teaser, $page) {
   $breadcrumb = array(
-    l('Storm', 'storm'),
-    l('Teams', 'storm/teams'),
+  l('Storm', 'storm'),
+  l('Teams', 'storm/teams'),
   );
   drupal_set_breadcrumb($breadcrumb);
 
@@ -364,24 +369,43 @@
  * Function to be called internally before saving Storm Team nodes
  */
 function _stormteam_beforesave(&$node) {
-  $i = 1;
-  $variable = 'members_array_'. $i;
 
-  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;
-    }
-    $i++;
-    $variable = 'members_array_'. $i;
-  }
-  if (isset($node->members_array)) {
-    if (array_key_exists(0, $node->members_array)) {
-      unset($node->members_array[0]);
+  if (!empty($node->members_array)) {
+    foreach ($node->members_array as $team_nid) {
+
+      if (!empty($node->member_options[t('Organizations:')][$team_nid])) {
+        $node->members_array['organizations'][$team_nid] = $node->member_options[t('Organizations:')][$team_nid];
+      }
+      elseif (!empty($node->member_options[t('People:')][$team_nid])) {
+        $node->members_array['people'][$team_nid] = $node->member_options[t('People:')][$team_nid];
+      }
+      else {
+        $result = db_fetch_object(db_query('SELECT n.title, n.type FROM {node} AS n WHERE nid = %d', $team_nid));
+        if (!empty($result)) {
+
+          switch ($result->type) {
+
+            case 'stormperson':
+              $node->members_array['people'][$team_nid] = $title->title;
+              break;
+
+            case 'stormorganization':
+              $node->members_array['organizations'][$team_nid] = $title->title;
+              break;
+
+          }
+
+        }
+
+      }
+
+      unset($node->members_array[$team_nid]);
     }
-  
-    $node->members = serialize($node->members_array);
+
   }
+
+  $node->members = serialize($node->members_array);
+
 }
 
 /**
@@ -394,7 +418,7 @@
     db_query("INSERT INTO {stormteam}
       (vid, nid, members) VALUES
       (%d, %d, '%s')",
-      $node->vid, $node->nid, $node->members
+    $node->vid, $node->nid, $node->members
     );
   }
 }
@@ -405,16 +429,15 @@
  */
 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
+    $node->members, $node->vid
     );
-    
+
     // 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);
@@ -454,57 +477,57 @@
 function stormteam_list() {
   // Add Storm generic CSS
   drupal_add_css(drupal_get_path('module', 'storm') .'/storm.css', 'module');
-  
+
   $breadcrumb = array(
-    l('Storm', 'storm'),
+  l('Storm', 'storm'),
   );
   drupal_set_breadcrumb($breadcrumb);
-  
+
   if (array_key_exists('name', $_GET)) {
     if ($_SESSION['stormteam_list_filter']['name'] != $_GET['name']) {
       $_SESSION['stormteam_list_filter']['name'] = $_GET['name'];
     }
   }
-  
+
   $i = new stdClass();
   $i->type = 'stormteam';
-  
+
   $header = array(
-    array(
+  array(
       'data' => t('Team Name'),
       'field' => 'n.title',
       'sort' => 'ASC',
-    ),
-    array(
+  ),
+  array(
       'data' => t('Description'),
       'field' => 'n.body',
       'sort' => '',
-    ),
-    array(
+  ),
+  array(
       'data' => storm_icon_add_node($i, $_GET),
       'class' => 'storm_list_operations',
-    ),
+  ),
   );
-  
-  $s = "SELECT n.nid, n.title, n.type, nre.teaser FROM {node} AS n INNER JOIN {stormteam} as ste ON n.vid=ste.vid INNER JOIN {node_revisions} as nre ON n.vid = nre.vid 
+
+  $s = "SELECT n.nid, n.title, n.type, nre.teaser FROM {node} AS n INNER JOIN {stormteam} as ste ON n.vid=ste.vid INNER JOIN {node_revisions} as nre ON n.vid = nre.vid
     WHERE n.status=1 AND n.type='stormteam'";
-  
+
   $where = array();
   $args = array();
   $filterfields = array();
-  
+
   if ($_SESSION['stormteam_list_filter']['name']) {
     $where[] = "LOWER(n.title) LIKE LOWER('%s')";
     $args[] = $_SESSION['stormteam_list_filter']['name'];
     $filterfields[] = t('Team Name');
   }
-  
+
   $itemsperpage = $_SESSION['stormteam_list_filter']['itemsperpage'];
   if (!$itemsperpage) {
     // Sets value for fieldset label, does not affect filter itself.
     $itemsperpage = variable_get('storm_default_items_per_page', 10);
   }
-  
+
   if (count($filterfields) == 0) {
     $filterdesc = t('Not filtered');
   }
@@ -512,9 +535,9 @@
     $filterdesc = t('Filtered by !fields', array('!fields' => implode(", ", array_unique($filterfields))));
   }
   $filterdesc .= ' | '. t('!items items per page', array('!items' => $itemsperpage));
-  
+
   $o = drupal_get_form('stormteam_list_filter', $filterdesc);
-  
+
   $s = stormteam_access_sql($s, $where);
   $s = db_rewrite_sql($s);
   $tablesort = tablesort_sql($header);
@@ -522,15 +545,15 @@
   $teams = array();
   while ($team = db_fetch_object($r)) {
     $rows[] = array(
-      l($team->title, 'node/'. $team->nid),
-      check_markup($team->teaser),
-      array(
+    l($team->title, 'node/'. $team->nid),
+    check_markup($team->teaser),
+    array(
         'data' => storm_icon_edit_node($team, $_GET) .'&nbsp;'. storm_icon_delete_node($team, $_GET),
         'class' => 'storm_list_operations',
-      ),
+    ),
     );
   }
-  
+
   $o .= theme('table', $header, $rows);
   $o .= theme('pager', NULL, $itemsperpage, 0);
   print theme('page', $o);
@@ -542,15 +565,15 @@
  */
 function stormteam_list_filter(&$form_state, $filterdesc = 'Filter') {
   $name = $_SESSION['stormteam_list_filter']['name'];
-  
+
   $itemsperpage = $_SESSION['stormteam_list_filter']['itemsperpage'];
   if (!$itemsperpage) {
     $itemsperpage = variable_get('storm_default_items_per_page', 10);
     $_SESSION['stormteam_list_filter']['itemsperpage'] = $itemsperpage;
   }
-  
+
   $form = array();
-  
+
   $form['filter'] = array(
     '#type' => 'fieldset',
     '#title' => $filterdesc,
@@ -558,7 +581,7 @@
     '#collapsed' => TRUE,
     '#weight' => -20,
   );
-  
+
   $form['filter']['name'] = array(
     '#type' => 'textfield',
     '#title' => t('Name'),
@@ -659,7 +682,7 @@
  */
 function stormteam_user_belongs_to_team($team, $person_or_organization_nid) {
   $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);
@@ -669,15 +692,15 @@
 }
 
 /**
-* @function
-* Function to return the teams that a user is a member of
-*/
+ * @function
+ * Function to return the teams that a user is a member of
+ */
 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);
   $teams = array();
@@ -686,4 +709,4 @@
   }
 
   return $teams;
-}
+}
\ No newline at end of file
Index: stormteam/stormteam.theme.inc
===================================================================
--- stormteam/stormteam.theme.inc	(revision 1511)
+++ stormteam/stormteam.theme.inc	(working copy)
@@ -14,7 +14,7 @@
   drupal_add_css(drupal_get_path('module', 'storm') . '/storm-node.css', 'module');
   
   $node = node_prepare($node, $teaser);
-  $type = node_get_types('type', $node);
+  $node_type = node_get_types('type', $node);
     
   /*$node->content['links'] = array(
     '#prefix' => '<div class="stormlinks"><dl>',
@@ -30,25 +30,54 @@
   
   // Add links to each team member title
   if (isset($node->members_array) && is_array($node->members_array)) {
-    foreach ($node->members_array as $nid => $name) {
-      $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);
+
+    // DISPLAY NEW STRUCTURE DIVIDED BY SUBARRAY OF PEOPLE AND ORGANIZATIONS
+    if (!empty($node->members_array['people']) || !empty($node->members_array['organizations'])) {
+
+      foreach ($node->members_array as $type => $type_array) {
+        if (!empty($type_array)) {
+          foreach ($type_array as $nid => $name) {
+
+            if (($type == 'people' && stormperson_access('view', $nid)) || ($type == 'organizations' && stormorganization_access('view', $nid))) {
+              $node->members_array[$type][$nid] = l($name, 'node/'. $nid);
+            }
+            else {
+              unset($node->members_array[$type][$nid]);
+            }
+
+          }    
+
+          switch ($type) {
+
+            case 'people':
+              $label = t('People');
+              break;
+
+            case 'organizations':
+              $label = t('Organizations');
+              break;
+
+          }
+
+          $node->content['group1'][$type] = array(
+            '#prefix' => '<div class="'. $type .'">',
+            '#suffix' => '</div>',
+            '#value' => theme('storm_view_item', $label , implode(" | ", $node->members_array[$type])),
+            '#weight' => $w++,
+          );
+
+        }
+
+      }
+
     }
-  }
     
-    $node->content['group1']['members'] = array(
-      '#prefix' => '<div class="members">',
-      '#suffix' => '</div>',
-      '#value' => theme('storm_view_item', t('Members'), implode(", ", $node->members_array)),
-      '#weight' => $w++,
-    );
   }
   
   $node->content['body_field'] = array(
     '#prefix' => '<div class="stormbody">',
     '#suffix' => '</div>',
-    '#value' => theme('storm_view_item', $type->body_label, $node->content['body']['#value']),
+    '#value' => theme('storm_view_item', $node_type->body_label, $node->content['body']['#value']),
     '#weight' => module_exists('content') ? content_extra_field_weight($node->type, 'body_field') : 0,
   );
   unset($node->content['body']);
