Index: cck/content_admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/cck/content_admin.inc,v
retrieving revision 1.12.2.31
diff -u -p -r1.12.2.31 content_admin.inc
--- cck/content_admin.inc	30 Jan 2007 00:30:26 -0000	1.12.2.31
+++ cck/content_admin.inc	5 Feb 2007 05:43:28 -0000
@@ -185,6 +185,8 @@ function _content_admin_type_edit_submit
       // and move existing fields to separate shared table, if not already shared
       _content_admin_field_add_existing_submit('_content_admin_field_add_existing', $field_values);
     }
+    
+    module_invoke_all('content_duplicate', $form_values['original_type_name'], $form_values['type_name']);
   }
 
   drupal_set_message(t('Saved content type %type.', array('%type' => theme('placeholder', $form_values['label']))));
Index: cck/fieldgroup.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/cck/fieldgroup.module,v
retrieving revision 1.1.2.11
diff -u -p -r1.1.2.11 fieldgroup.module
--- cck/fieldgroup.module	27 Jan 2007 21:19:54 -0000	1.1.2.11
+++ cck/fieldgroup.module	5 Feb 2007 05:43:28 -0000
@@ -123,22 +123,7 @@ function fieldgroup_edit_group_submit($f
   $group = $groups[$group_name];
 
   if (!$group) {
-    // Find a valid, computer-friendly name.
-    $group_name = trim($form_values['label']);
-    $group_name = drupal_strtolower($group_name);
-    $group_name = str_replace(array(' ', '-'), '_', $group_name);
-    $group_name = preg_replace('/[^a-z0-9_]/', '', $group_name);
-    $group_name = 'group_'. $group_name;
-    $group_name = substr($group_name, 0, 30);
-    if (isset($groups[$group_name])) {
-      $group_name_base = $group_name;
-      $counter = 0;
-      while (isset($groups[$group_name])) {
-        $group_name = $group_name_base .'_'. $counter++;
-      }
-    }
-    db_query("INSERT INTO {node_group} (type_name, group_name, label, settings, description, weight)
-              VALUES ('%s', '%s', '%s', '%s', '%s', %d)", $content_type, $group_name, $form_values['label'], serialize($form_values['settings']), $form_values['description'], $form_values['weight']);
+    _fieldgroup_insert_group($groups, $content_type, $form_values['label'], serialize($form_values['settings']), $form_values['description'], $form_values['weight']);
   }
   else {
     db_query("UPDATE {node_group} SET label = '%s', settings = '%s', description = '%s', weight = %d ".
@@ -282,8 +267,7 @@ function fieldgroup_form_alter($form_id,
 function fieldgroup_content_admin_form_submit($form_id, &$form_values, $default) {
   if ($default != $form_values['group']) {
     if ($form_values['group'] && !$default) {
-      db_query("INSERT INTO {node_group_fields} (type_name, group_name, field_name) VALUES ('%s', '%s', '%s')",
-                $form_values['type_name'], $form_values['group'], $form_values['field_name']);
+      _fieldgroup_insert_group_field($form_values['type_name'], $form_values['group'], $form_values['field_name']);
     }
     else if ($form_values['group']) {
       db_query("UPDATE {node_group_fields} SET group_name = '%s' WHERE type_name = '%s' AND field_name = '%s'",
@@ -322,3 +306,50 @@ function fieldgroup_get_group($content_t
   }
   return FALSE;
 }
+
+function _fieldgroup_insert_group($groups, $content_type, $label, $settings, $description, $weight) {
+  // Find a valid, computer-friendly name.
+  $group_name = trim($label);
+  $group_name = drupal_strtolower($group_name);
+  $group_name = str_replace(array(' ', '-'), '_', $group_name);
+  $group_name = preg_replace('/[^a-z0-9_]/', '', $group_name);
+  $group_name = 'group_'. $group_name;
+  $group_name = substr($group_name, 0, 30);
+  if (isset($groups[$group_name])) {
+    $group_name_base = $group_name;
+    $counter = 0;
+    while (isset($groups[$group_name])) {
+      $group_name = $group_name_base .'_'. $counter++;
+    }
+  }
+  db_query("INSERT INTO {node_group} (type_name, group_name, label, settings, description, weight)
+            VALUES ('%s', '%s', '%s', '%s', '%s', %d)", $content_type, $group_name, $label, $settings, $description, $weight);
+  return $group_name;
+}
+
+function _fieldgroup_insert_group_field($type_name, $group_name, $field_name) {
+  db_query("INSERT INTO {node_group_fields} (type_name, group_name, field_name) VALUES ('%s', '%s', '%s')",
+            $type_name, $group_name, $field_name);
+}
+
+/**
+ * Implementation of hook_content_duplicate().
+ */
+function fieldgroup_content_duplicate($old_type, $new_type) {
+  // Use $groups to keep track of the group names that have been
+  // assigned.  This saves us from problems when there are dupliate
+  // labels for groups.
+  $groups = array();
+  $result = db_query("SELECT label, settings, description, weight FROM {node_group} WHERE type_name = '%s'", $old_type);
+  while ($row = db_fetch_object($result)) {
+    $group_name = _fieldgroup_insert_group($groups, $new_type, $row->label, $row->settings, $row->description, $row->weight);
+    $groups[$group_name] = $group_name;
+  }
+  
+  $result = db_query("SELECT type_name, group_name, field_name FROM {node_group_fields} WHERE type_name = '%s'", $old_type);
+  while ($row = db_fetch_object($result)) {
+    _fieldgroup_insert_group_field($new_type, $row->group_name, $row->field_name);
+  }
+
+  cache_clear_all('fieldgroup_data');
+}
