Index: imagefield.module
===================================================================
--- imagefield.module	(revision 1326)
+++ imagefield.module	(working copy)
@@ -142,7 +142,16 @@
         'alt' => array('type' => 'varchar', length => 255, 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
       );
       return $columns;
-
+      
+    case 'tables':
+      // Override default Views field handlers provided by CCK
+      $tables = content_views_field_tables($field);
+      $tables['node_data_'. $field['field_name']]['fields'][$field['field_name'] .'_fid']['handler'] = array(
+        'imagefield_views_field_handler_group' => t('Group multiple values'),
+        'imagefield_views_field_handler_ungroup' => t('Do not group multiple values'),
+      );
+      return $tables;
+      
     case 'filters':
       return array(
         'not null' => array(
@@ -156,6 +165,61 @@
 }
 
 /**
+ * Custom views table field handler for hook_views_tables().
+ */
+function imagefield_views_field_handler_group($field_info, $field_data, $value, $data) {
+  $field = $field_info['content_field'];
+  $items = array();
+
+  if ($field['multiple']) {
+    foreach ($field_info['content_db_info']['columns'] as $column => $attributes) {
+      $query_columns[] = "node_data_$field[field_name].$attributes[column] AS $column";
+    }
+    $query = "SELECT ". implode(', ', $query_columns) .
+             " FROM {node} node".
+             " LEFT JOIN {". $field_info['content_db_info']['table'] ."} node_data_$field[field_name] ON node.vid = node_data_$field[field_name].vid".
+             " WHERE node.nid = ". $data->nid .
+             " ORDER BY node_data_$field[field_name].delta";
+    $result = db_query(db_rewrite_sql($query, 'node'));
+    while ($item = db_fetch_array($result)) {
+      $items[] = content_format($field, $item, $field_data['options'], $data);
+    }
+
+    // if there are no items to display, but use_default_image is enabled
+    if ($items[0] == '' && $field['use_default_image']) {
+      $item = _imagefield_file_load($items[0], $field); // get default image file
+      $item['nid'] = $data->nid; // append node ID
+      $items = array(content_format($field, $item, $field_data['options'], $data)); // return default image item
+    }
+
+    return theme('content_view_multiple_field', $items, $field, $data);
+  }
+  else {
+    return imagefield_views_field_handler_ungroup($field_info, $field_data, $value, $data);
+  }
+}
+
+/**
+ * Custom views table field handler for hook_views_tables().
+ */
+function imagefield_views_field_handler_ungroup($field_info, $field_data, $value, $data) {
+  $field = $field_info['content_field'];
+  $item = array();
+  foreach ($field_info['content_db_info']['columns'] as $column => $attributes) {
+    $view_column_name = $field_data['tablename'] .'_'. $attributes['column'];
+    $item[$column] = $data->$view_column_name;
+  }
+
+  // if there are no items to display, but use_default_image is enabled
+  if (empty($item['fid']) && $field['use_default_image']) {
+    $item = _imagefield_file_load($item, $field); // get the default image file
+    $item['nid'] = $data->nid; // append node ID
+  }  
+
+  return content_format($field, $item, $field_data['options'], $data);
+}
+
+/**
  * Custom filter for imagefield NOT NULL
  */
 function imagefield_views_handler_filter_is_not_null($op, $filter, $filterinfo, &$query) {
@@ -244,7 +308,7 @@
 /**
  * Implementation of hook_field().
  */
-function imagefield_field($op, $node, $field, &$items, $teaser, $page) {
+function imagefield_field($op, &$node, $field, &$items, $teaser, $page) {
   $fieldname = $field['field_name'];
   switch ($op) {
     // called after content.module loads default data.
@@ -256,12 +320,12 @@
         if (empty($item)) {
           unset($items[$delta]);
         }
-        elseif (!empty($item['fid'])) {
-          $items[$delta] += _imagefield_file_load($item['fid']);
+        else {
+          $items[$delta] += _imagefield_file_load($item, $field);
+          $items[$delta]['nid'] = $node->nid;
         }
       }
-      $items = array_values($items); // compact deltas
-      break;
+      return array($fieldname => $items);
 
     // called before content.module defaults.
     case 'insert':
@@ -331,7 +395,7 @@
 function imagefield_widget_settings($op, $widget) {
   switch ($op) {
     case 'callbacks':
-      //return array('default value' => CONTENT_CALLBACK_CUSTOM);
+      return array('default value' => CONTENT_CALLBACK_CUSTOM);
 
     case 'form':
       $form = array();
@@ -800,30 +864,36 @@
  *
  */
 function imagefield_field_formatter($field, $item, $formatter) {
-  if (empty($item['fid']) && $field['use_default_image']) {
-    $file = $field['default_image'];
-  }
   // If there is no image on the database, use default.
   if (empty($item['filepath'])) {
-    $file = _imagefield_file_load($item['fid']);
+    $file = _imagefield_file_load($item, $field);
   }
   if (!empty($file['filepath'])) {
     return theme('imagefield_image', $file, $item['alt'], $item['title']);
   }
 }
 
-
-function _imagefield_file_load($fid = NULL) {
-  // Don't bother if we weren't passed and fid.
-  if (!empty($fid) && is_numeric($fid)) { 
-    $result = db_query('SELECT * FROM {files} WHERE fid = %d', $fid);
+/**
+ * Load file information. 
+ * Optionally provide a default image when no image file exists.
+ *
+ * @param Array $item
+ *   CCK field item.
+ * @param Array $field
+ *   CCK field.
+ * @return Array
+ *   File.
+ */
+function _imagefield_file_load($item, $field) {
+  $file = array();
+  if (empty($item['fid']) && $field['use_default_image']) {
+    $file = $field['default_image'];
+  }
+  elseif (!empty($item['fid']) && is_numeric($item['fid'])) { 
+    $result = db_query('SELECT * FROM {files} WHERE fid = %d', $item['fid']);
     $file = db_fetch_array($result);
-    if ($file) {
-      return $file;
-    }
   }
-  // return an empty array if nothing was found.
-  return array();
+  return $file;
 }
 
 function theme_imagefield_view_image($file, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
