Index: content.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/cck/Attic/content.module,v
retrieving revision 1.301.2.106.2.15
diff -u -p -r1.301.2.106.2.15 content.module
--- content.module	4 Dec 2009 13:33:06 -0000	1.301.2.106.2.15
+++ content.module	12 Jan 2010 18:00:01 -0000
@@ -507,9 +507,7 @@ function theme_content_multiple_values($
       ),
       array('data' => t('Order'), 'class' => 'content-multiple-weight-header'),
     );
-    if ($field['multiple'] == 1) {
-      $header[] = array('data' => '<span>'. t('Remove') .'</span>', 'class' => 'content-multiple-remove-header');
-    }
+    $header[] = array('data' => '<span>'. t('Remove') .'</span>', 'class' => 'content-multiple-remove-header');
     $rows = array();
 
     // Sort items according to '_weight' (needed when the form comes back after
@@ -526,7 +524,7 @@ function theme_content_multiple_values($
     foreach ($items as $delta => $item) {
       $item['_weight']['#attributes']['class'] = $order_class;
       $delta_element = drupal_render($item['_weight']);
-      if ($field['multiple'] == 1) {
+      if ($field['multiple'] >= 1) {
         $remove_element = drupal_render($item['_remove']);
       }
       $cells = array(
@@ -535,16 +533,17 @@ function theme_content_multiple_values($
         array('data' => $delta_element, 'class' => 'delta-order'),
       );
       $row_class = 'draggable';
-      if ($field['multiple'] == 1) {
-        if (!empty($item['_remove']['#default_value'])) {
-          $row_class .= ' content-multiple-removed-row';
-        }
-        $cells[] = array('data' => $remove_element, 'class' => 'content-multiple-remove-cell');
+      if (!empty($item['_remove']['#default_value'])) {
+        $row_class .= ' content-multiple-removed-row';
       }
+      $cells[] = array('data' => $remove_element, 'class' => 'content-multiple-remove-cell');
       $rows[] = array('data' => $cells, 'class' => $row_class);
     }
 
     $output .= theme('table', $header, $rows, array('id' => $table_id, 'class' => 'content-multiple-table'));
+    if ($field['multiple'] > 1) {
+      $element['#description'] .= t('You may enter a maximum of @max values for this field.', array('@max' => $field['multiple']));
+    }
     $output .= $element['#description'] ? '<div class="description">'. $element['#description'] .'</div>' : '';
     $output .= drupal_render($element[$element['#field_name'] .'_add_more']);
 
Index: includes/content.node_form.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/cck/includes/Attic/content.node_form.inc,v
retrieving revision 1.7.2.19.2.6
diff -u -p -r1.7.2.19.2.6 content.node_form.inc
--- includes/content.node_form.inc	29 Dec 2009 09:03:15 -0000	1.7.2.19.2.6
+++ includes/content.node_form.inc	12 Jan 2010 18:00:02 -0000
@@ -156,7 +156,7 @@ function content_multiple_value_form(&$f
       $max = 0;
       break;
 
-    case 1:
+    default:
       $deltas = array_keys($items);
       $current_item_count = max(1, (isset($form_state['item_count'][$field_name]) ? $form_state['item_count'][$field_name] : count($deltas)));
       $max = (!empty($deltas) ? max($deltas) : -1);
@@ -165,11 +165,6 @@ function content_multiple_value_form(&$f
         $deltas[] = $max;
       }
       break;
-
-    default:
-      $max = $field['multiple'] - 1;
-      $deltas = range(0, $max);
-      break;
   }
 
   $title = check_plain(t($field['widget']['label']));
@@ -211,7 +206,7 @@ function content_multiple_value_form(&$f
 
       // Add a checkbox to allow users remove a single delta item.
       // See content_set_empty() and theme_content_multiple_values().
-      if ($field['multiple'] == 1) {
+      if ($field['multiple'] >= 1) {
         // We name the element '_remove' to avoid clashing with column names
         // defined by field modules.
         $element['_remove'] = array(
@@ -232,7 +227,7 @@ function content_multiple_value_form(&$f
   }
 
   // Add AHAH add more button, if not working with a programmed form.
-  if ($field['multiple'] == 1 && empty($form['#programmed'])) {
+  if ($field['multiple'] >= 1 && empty($form['#programmed'])) {
     // Make sure the form is cached so ahah can work.
     $form['#cache'] = TRUE;
     $content_type = content_types($field['type_name']);
@@ -258,11 +253,16 @@ function content_multiple_value_form(&$f
       '#field_name' => $field_name,
       '#type_name' => $field['type_name'],
     );
+    
+    if ($field['multiple'] > 1 && $current_item_count >= $field['multiple']) {
+      $form_element[$field_name .'_add_more']['#disabled'] = TRUE;
+      $form_element[$field_name .'_add_more']['#prefix'] = '<span class="warning">'. t('Maximum reached. You must remove values to be able to add more.') .'</span>';
+    }
 
     // Add wrappers for the fields and 'more' button.
     $form_element['#prefix'] = '<div id="'. $field_name_css .'-items">';
     $form_element['#suffix'] = '</div>';
-    $form_element[$field_name .'_add_more']['#prefix'] = '<div class="content-add-more clear-block">';
+    $form_element[$field_name .'_add_more']['#prefix'] .= '<div class="content-add-more clear-block">';
     $form_element[$field_name .'_add_more']['#suffix'] = '</div>';
   }
   return $form_element;
@@ -363,16 +363,17 @@ function content_multiple_value_nodeapi_
   // Filter out items flagged for removal.
   $items = content_set_empty($field, $items);
 
+  // Count non-empty items.
+  $count = 0;
+  $function = $field['module'] .'_content_is_empty';
+  foreach ($items as $item) {
+    if (!$function($item, $field)) {
+      $count++;
+    }
+  }
+
   // Enforce field requirement settings.
   if ($field['required'] && empty($node->_content_ignore_required_fields[$field_name]) && content_access('edit', $field, NULL, $node)) {
-    // Count non-empty items.
-    $count = 0;
-    $function = $field['module'] .'_content_is_empty';
-    foreach ($items as $item) {
-      if (!$function($item, $field)) {
-        $count++;
-      }
-    }
     // The field is required so we expect at least one non-empty item.
     if ($count == 0) {
       // Try to guess the element path in the form from the first item that
@@ -388,6 +389,13 @@ function content_multiple_value_nodeapi_
       form_set_error($error_element, t('%name field is required.', array('%name' => t($field['widget']['label']))));
     }
   }
+
+  // Count items to make sure limit is not exceeded.
+  if ($field['multiple'] > 1 && $count > $field['multiple']) {
+    $excess = $count - $field['multiple'];
+    $message = t('You may not exceed @max values for this field. Please remove !excess.', array('@max' => $field['multiple'], '!excess' => format_plural($excess, '1 value', '@count values')));
+    form_set_error($field['field_name'], $message);
+  }
 }
 
 /**
@@ -414,7 +422,7 @@ function content_add_more_js($type_name_
   $type = content_types($type_name_url);
   $field = content_fields($field_name, $type['type']);
 
-  if (($field['multiple'] != 1) || empty($_POST['form_build_id'])) {
+  if (($field['multiple'] == 0) || empty($_POST['form_build_id'])) {
     // Invalid request.
     drupal_json(array('data' => ''));
     exit;
