Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.587
diff -u -F^f -r1.587 common.inc
--- includes/common.inc	16 Nov 2006 09:18:22 -0000	1.587
+++ includes/common.inc	21 Nov 2006 06:35:48 -0000
@@ -1292,10 +1292,12 @@ function drupal_add_link($attributes) {
  *   An array of CSS files.
  */
 function drupal_add_css($path = NULL, $type = 'module', $media = 'all') {
-  static $css = array('core' => array(), 'module' => array(), 'theme' => array());
+  static $css = array();
 
+  // Create an array of CSS files for each media type first, since each type needs to be served
+  // to the browser differently.
   if (!is_null($path)) {
-    $css[$type][$path] = array('path' => $path, 'media' => $media);
+    $css[$media][$type][$path] = array('path' => $path, 'media' => $media);
   }
 
   return $css;
@@ -1313,17 +1315,89 @@ function drupal_add_css($path = NULL, $t
  */
 function drupal_get_css($css = NULL) {
   $output = '';
-  if (is_null($css)) {
+  if (!isset($css)) {
     $css = drupal_add_css();
   }
 
+  $directory_path = file_directory_path();
+  
+  if (is_writable($directory_path) && variable_get('cache_css', TRUE) == TRUE) {
+    foreach ($css as $media => $types) {
+      $filename = md5(serialize($types)) .'.css';
+      $path = $directory_path .'/css/';
+
+      if (!file_exists($path . $filename)) {
+        $filename = drupal_build_css_cache($types);
+      }
+        
+      $output .= '<style type="text/css" media="'. $media .'">@import "'. base_path() . $path . $filename .'";</style>'. "\n";      
+    }
+  }
+  else {
+    foreach ($css as $media => $types) {
+      foreach ($types as $type) {
+        foreach ($type as $file) {
+          $output .= '<style type="text/css" media="'. $media .'">@import "'. base_path() . $file['path'] .'";</style>' ."\n";
+        }
+      }
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * Aggregate and optimize CSS files, putting them in the files directory.
+ *
+ * @param $css
+ *   An array of CSS files to aggregate and compress into one file.
+ * @return
+ *   The name of the CSS file.
+ */
+function drupal_build_css_cache($css) {
+  $data = '';
+  $filename = md5(serialize($css)) .'.css';
+  
+  // Create the css/ within the files folder
+  file_check_directory(file_create_path('css'), FILE_CREATE_DIRECTORY);
+  
+  // Build aggregate CSS file
   foreach ($css as $type) {
     foreach ($type as $file) {
-      $output .= '<style type="text/css" media="'. $file['media'] .'">@import "'. base_path() . $file['path'] ."\";</style>\n";
+      $contents = file_get_contents($file['path']);
+      // Return the path to either the module or theme where this CSS file originated from
+      $path = base_path() . substr($file['path'], 0, strrpos($file['path'], '/')) .'/';
+      // Fix all paths within this CSS file, ignoring absolute paths and paths that go up a directory, ../
+      $contents = preg_replace('/url\(([\'"]?)(?![a-z]+:)(?!\.\.\/)/i', 'url(\1'. $path . '\2', $contents);
+      // Fix all paths to misc/
+      $data .= str_replace('url(../../misc/', 'url('. base_path() .'/misc/', $contents);
     }
   }
 
-  return $output;
+  // If any modules implement hook_compress_css, let them handle compressing
+  // the css, otherwise just strip out the whitespace, which can be done safely.
+  if (module_invoke_all('hook_compress_css')) {
+    foreach (module_implements('compress_css') as $module) {
+      $function = $module .'_compress_css';
+      $function($contents);
+    }
+  }
+  else {
+    // Preform some safe CSS optimizations for removing white space
+    $data = str_replace(array(": ", "; ", "\n", "\t", "\r", ), array(':', ';', '', '', ''), $data);
+  }
+    
+  // Create the CSS file
+  file_save_data($data, file_create_path('css/') .'/'. $filename, FILE_EXISTS_REPLACE);
+  
+  return $filename;
+}
+
+/**
+ * Delete all cached CSS files
+ */
+function drupal_flush_css_cache() {
+  file_scan_directory(file_create_path('css'), '.*', array('.', '..', 'CVS'), 'file_delete', TRUE);  
 }
 
 /**
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.399
diff -u -F^f -r1.399 system.module
--- modules/system/system.module	19 Nov 2006 23:51:01 -0000	1.399
+++ modules/system/system.module	21 Nov 2006 06:35:51 -0000
@@ -1118,6 +1118,8 @@ function system_settings_form_submit($fo
  * Menu callback; displays a listing of all themes.
  */
 function system_themes() {
+  // Clear cached CSS files
+  drupal_flush_css_cache();
   $themes = system_theme_data();
   ksort($themes);
 