Index: imagefield.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/imagefield/imagefield.module,v
retrieving revision 1.30.2.6.2.64
diff -u -p -r1.30.2.6.2.64 imagefield.module
--- imagefield.module	13 May 2008 00:02:02 -0000	1.30.2.6.2.64
+++ imagefield.module	29 May 2008 13:53:58 -0000
@@ -615,6 +615,8 @@ function _imagefield_widget_prepare_form
 
       $file['fid'] = 'upload';
       $file['preview'] = $filepath;
+      // Assign a weight outside of range for new uploads.
+      $file['weight'] = 1000;
 
       // If a single field, mark any other images for deletion and delete files in session
       if (!$field['multiple']) {
@@ -735,6 +737,14 @@ function _imagefield_widget_form($node, 
           '#theme' => 'imagefield_edit_image_row',
         );
 
+        if ($field['multiple']) {
+          $form[$fieldname][$delta]['weight'] = array(
+            '#type' => 'weight',
+            '#title' => t('Weight'),
+            '#default_value' => $delta,
+          );
+        }
+
         $form[$fieldname][$delta]['flags']['delete'] = array(
           '#type' => 'checkbox',
           '#title' => t('Delete'),
@@ -1015,6 +1025,7 @@ function theme_imagefield_edit_image_row
   $output .= '</div>';
   $output .= drupal_render($element['alt']);
   $output .= drupal_render($element['title']);
+  $output .= drupal_render($element['weight']);
   $output .= '</div>';
   $output = '<div class="imagefield-edit-image-row clear-block">'. $output .'</div>';
   if (isset($element['replace'])) {
@@ -1146,7 +1157,10 @@ function imagefield_js() {
       $items[$key]['alt'] = $image['alt'];
       $items[$key]['title'] = $image['title'];
       $items[$key]['flags']['delete'] = $image['flags']['delete'];
+      $items[$key]['weight'] = $image['weight'];
     }
+    // Re-order images by user-defined weights.
+    usort($items, '_imagefield_sort');
   }
 
   // Get our new form baby, yeah tiger, get em!
@@ -1165,3 +1179,59 @@ function imagefield_js() {
   exit;
 
 }
+
+/**
+ * Sort uploaded images in $_POST by weight.
+ */
+function _imagefield_sort($a, $b) {
+  return ($a['weight'] > $b['weight'] ? 1 : -1);
+}
+
+/**
+ * Implementation of hook_nodeapi().
+ */
+function imagefield_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
+  switch ($op) {
+    case 'insert':
+    case 'update':
+      // Update image field item order according to their weights.
+      foreach (content_fields() as $field => $info) {
+        if ($info['type'] == 'image' && isset($node->$field)) {
+          $deltas = array();
+          $reorder = FALSE;
+          foreach ($node->$field as $delta => $item) {
+            // Skip this field instance if it's not multiple.
+            if (!isset($item['weight'])) {
+              break;
+            }
+            $new_delta = (int)$item['weight'];
+            $deltas[$delta] = $new_delta;
+            if ($new_delta != $delta) {
+              $reorder = TRUE;
+            }
+          }
+          if (!$reorder) {
+            continue;
+          }
+
+          // Sort by new weight and assign zero-based delta values.
+          $i = 0;
+          asort($deltas);
+          foreach (array_keys($deltas) as $delta) {
+            $deltas[$delta] = $i;
+            $i++;
+          }
+
+          // Temporarily set ridiculously high deltas to avoid primary key
+          // clashes. Then store the new values.
+          $db_info = content_database_info($info);
+          db_query("UPDATE {". $db_info['table'] ."} SET delta = delta + 100000 WHERE vid = %d", $node->vid);
+          foreach ($deltas as $delta => $new_delta) {
+            db_query("UPDATE {". $db_info['table'] ."} SET delta = %d WHERE vid = %d AND delta = %d + 100000", $new_delta, $node->vid, $delta);
+          }
+        }
+      }
+      break;
+  }
+}
+
