--- themesettingsapi.module	Thu Dec 13 20:00:48 2007
+++ themesettingsapi_new.module	Tue May 27 14:22:29 2008
@@ -18,2 +18,134 @@
 /**
+ * Implementation of hook_form_alter().
+ */
+function themesettingsapi_form_alter($form_id, &$form) {
+  switch ($form_id) {
+    case 'system_theme_settings':
+      // Grab the specific name of the theme settings form
+      $key = $form['var']['#value'];
+      $key = ($key == 'theme_settings') ? '' : preg_replace('/(^theme_|_settings$)/', '', $key);
+
+      // Since we are allowing more settings, make logo and favicon collapsible
+      if (empty($key)) {
+        // Fix for small bug in Drupal 5.1
+        $form['theme_settings']['#prefix'] = '<div class="clear-block">'. $form['theme_settings']['#prefix'];
+        $form['node_info']['#suffix'] = $form['node_info']['#suffix'] .'</div>';
+        if (isset($form['logo'])) {
+          unset($form['logo']['#attributes']['class']);
+        }
+      }
+      if (isset($form['logo'])) {
+        $form['logo']['#collapsible'] = TRUE;
+        $form['logo']['#collapsed'] = FALSE;
+      }
+      if (isset($form['favicon'])) {
+        $form['favicon']['#collapsible'] = TRUE;
+        $form['favicon']['#collapsed'] = FALSE;
+        // Fix for small bug in Drupal 5.1
+        if (isset($form['favicon']['text']['#value'])) {
+          $form['favicon']['#descripton'] = $form['favicon']['text']['#value'];
+          unset($form['favicon']['text']);
+        }
+      }
+
+      // Move submit buttons to bottom
+      $form['buttons']['#weight'] = 1;
+
+      // Template-specific settings
+      if ($key) {
+        // If the administration theme is not used, switch themes when displaying the theme settings.
+        if (variable_get('admin_theme', '0') == '0' or variable_get('theme_settings_admin_theme', '1') == '0') {
+          global $custom_theme;
+          $custom_theme = $key;
+          init_theme();
+        }
+
+        // Include the theme's theme-settings.php file
+        $themes = system_theme_data();
+        // if (!empty($themes[$key]->base_theme)
+        $filename = './'. str_replace('/'. $themes[$key]->basename, '', $themes[$key]->filename) .'/theme-settings.php';
+        if (!file_exists($filename)) {
+          // If the theme doesn't have a theme-settings.php file, use the base theme's.
+          $base = explode('/', strrev($themes[$key]->owner), 2);
+          $filename = './'. strrev($base[1]) .'/theme-settings.php';
+        }
+        if (file_exists($filename)) {
+          require_once $filename;
+        }
+        else {
+          // Backwards compatibility with 5.x-2.0: allow a settings.php file.
+          $filename = './'. str_replace('/'. $themes[$key]->basename, '', $themes[$key]->filename) .'/settings.php';
+          if (!file_exists($filename)) {
+            // If the theme doesn't have a settings.php file, use the base theme's.
+            $base = explode('/', strrev($themes[$key]->owner), 2);
+            $filename = './'. strrev($base[1]) .'/settings.php';
+          }
+          if (file_exists($filename)) {
+            require_once $filename;
+          }
+        }
+
+        // Since we are adding more settings, make logo and favicon collapsed
+        if (isset($form['logo'])) {
+          $form['logo']['#collapsed'] = TRUE;
+        }
+        if (isset($form['favicon'])) {
+          $form['favicon']['#collapsed'] = TRUE;
+        }
+
+        // Get the theme settings
+        $settings = theme_get_settings($key);
+
+        // Unset the results of the broken 5.x API.
+        unset($form['specific']);
+
+        // Call engine-specific settings.
+        $function = $themes[$key]->prefix .'_engine_settings';
+        if (function_exists($function)) {
+          $group = $function($settings);
+          if (!empty($group)) {
+            $form['engine_specific'] = array('#type' => 'fieldset', '#title' => t('Theme-engine-specific settings'), '#description' => t('These settings only exist for all the templates and styles based on the %engine theme engine.', array('%engine' => $themes[$key]->prefix)));
+            $form['engine_specific'] = array_merge($form['engine_specific'], $group);
+          }
+        }
+
+        // Call theme-specific settings.
+        $function = $key .'_settings';
+        if (!function_exists($function)) {
+          $function = $themes[$key]->prefix .'_settings';
+        }
+        if (function_exists($function)) {
+          $group = $function($settings);
+          if (!empty($group)) {
+            $form['theme_specific'] = array('#type' => 'fieldset', '#title' => t('Theme-specific settings'), '#description' => t('These settings only exist for the %theme theme and all the styles based on it.', array('%theme' => $key)));
+            $form['theme_specific'] = array_merge($form['theme_specific'], $group);
+          }
+        }
+      }
+      break;
+
+    case 'system_admin_theme_settings':
+      // Add a setting to allow theme switching when editing a node (backport of D6 setting)
+      $form['node_admin_theme'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Use administration theme for content editing'),
+        '#description' => t('Use the administration theme when editing existing posts or creating new ones.'),
+        '#default_value' => variable_get('node_admin_theme', '0'),
+      );
+
+      // Add a setting to allow theme switching even with an admin theme
+      $form['theme_settings_admin_theme'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Use administration theme when configuring theme settings'),
+        '#description' => t('If this setting is disabled or if using the "System default" theme, the theme settings pages will be switched to the theme being configured.'),
+        '#default_value' => variable_get('theme_settings_admin_theme', '1'),
+      );
+
+      // Move submit buttons to bottom
+      $form['buttons']['#weight'] = 1;
+      break;
+  }
+}
+
+/**
  * Implementation of hook_menu().
@@ -26,9 +158,2 @@
 
-    // Conditionally load on admin/build/themes/settings/* and admin/settings/admin
-    if (arg(0) == 'admin'
-        && (arg(4) != '' && arg(2) == 'themes' && arg(3) == 'settings' && arg(1) == 'build'
-            || arg(2) == 'admin' && arg(1) == 'settings')) {
-      include_once('./'. drupal_get_path('module', 'themesettingsapi') .'/themesettingsapi.admin.inc');
-    }
-
     // Conditionally load the admin theme on node/add/* and node/*/edit
@@ -40,2 +165,2 @@
   }
-}
+}
\ No newline at end of file
