Index: ctools.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/ctools.info,v
retrieving revision 1.4
diff -u -p -r1.4 ctools.info
--- ctools.info	27 Sep 2009 03:41:00 -0000	1.4
+++ ctools.info	5 Oct 2009 22:46:20 -0000
@@ -2,4 +2,27 @@
 name = Chaos tools
 description = A library of helpful tools by Merlin of Chaos.
 core = 7.x
-package = Chaos tool suite
\ No newline at end of file
+package = Chaos tool suite
+files[] = ctools.module
+files[] = includes/ajax.inc
+files[] = includes/collapsible.theme.inc
+files[] = includes/content.inc
+files[] = includes/content.menu.inc
+files[] = includes/content.theme.inc
+files[] = includes/context-access-admin.inc
+files[] = includes/context-admin.inc
+files[] = includes/context-task-handler.inc
+files[] = includes/context.inc
+files[] = includes/context.menu.inc
+files[] = includes/context.theme.inc
+files[] = includes/css.inc
+files[] = includes/dependent.inc
+files[] = includes/dropdown.theme.inc
+files[] = includes/export.inc
+files[] = includes/form.inc
+files[] = includes/menu.inc
+files[] = includes/modal.inc
+files[] = includes/object-cache.inc
+files[] = includes/plugins.inc
+files[] = includes/wizard.inc
+files[] = includes/wizard.theme.inc
Index: ctools.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/ctools.install,v
retrieving revision 1.12
diff -u -p -r1.12 ctools.install
--- ctools.install	16 Aug 2009 21:59:42 -0000	1.12
+++ ctools.install	5 Oct 2009 23:01:02 -0000
@@ -13,22 +13,15 @@
 function ctools_requirements($phase) {
   $requirements = array();
   if ($phase == 'runtime') {
-    $path = file_create_path('ctools/css');
-    if (!file_check_directory($path)) {
-      $path = file_directory_path() . '/ctools';
-      file_check_directory($path, FILE_CREATE_DIRECTORY);
-      $path .= '/css';
-      file_check_directory($path, FILE_CREATE_DIRECTORY);
-    }
-
     $requirements['ctools_css_cache'] = array(
       'title' => t('CTools CSS Cache'),
       'severity' => REQUIREMENT_OK,
       'value' => t('Exists'),
     );
 
-    if (!file_check_directory($path)) {
-      $requirements['ctools_css_cache']['description'] = t('The CTools CSS cache directory, %path could not be created due to a misconfigured files directory. Please ensure that the files directory is correctly configured and that the webserver has permission to create directories.', array('%path' => $path));
+    $path = 'public://ctools/css';
+    if (!file_prepare_directory($path, FILE_CREATE_DIRECTORY)) {
+      $requirements['ctools_css_cache']['description'] = t('The CTools CSS cache directory, %path could not be created due to a misconfigured files directory. Please ensure that the files directory is correctly configured and that the webserver has permission to create directories.', array('%path' => file_uri_target($path)));
       $requirements['ctools_css_cache']['severity'] = REQUIREMENT_ERROR;
       $requirements['ctools_css_cache']['value'] = t('Unable to create');
     }
@@ -38,21 +31,7 @@ function ctools_requirements($phase) {
 }
 
 /**
- * Implementation of hook_install()
- */
-function ctools_install() {
-  drupal_install_schema('ctools');
-}
-
-/**
- * Implementation of hook_uninstall()
- */
-function ctools_uninstall() {
-  drupal_uninstall_schema('ctools');
-}
-
-/**
- * Implementation of hook_schemea
+ * Implement hook_schema().
  */
 function ctools_schema() {
   // Currently, schema 1 is the only schema we have. As we make updates,
@@ -110,7 +89,7 @@ function ctools_schema_2() {
  */
 function ctools_schema_1() {
   $schema['ctools_object_cache'] = array(
-    'description' => t('A special cache used to store objects that are being edited; it serves to save state in an ordinarily stateless environment.'),
+    'description' => 'A special cache used to store objects that are being edited; it serves to save state in an ordinarily stateless environment.',
     'fields' => array(
       'sid' => array(
         'type' => 'varchar',
@@ -151,54 +130,12 @@ function ctools_schema_1() {
 }
 
 /**
- * Enlarge the ctools_object_cache.name column to prevent truncation and weird
- * errors.
- */
-function ctools_update_6001() {
-  $ret = array();
-
-  // Perform updates like this to reduce code duplication.
-  $schema = ctools_schema_2();
-
-  db_change_field($ret, 'ctools_object_cache', 'name', 'name', $schema['ctools_object_cache']['fields']['name']);
-
-  return $ret;
-}
-
-/**
- * Add the new css cache table.
+ * Update to Drupal 7.
+ * Could be solved later. Set the version number for new installs.
  */
-function ctools_update_6002() {
+function ctools_update_7000() {
   $ret = array();
 
-  // Schema 2 is locked and should not be changed.
-  $schema = ctools_schema_2();
-
-  db_create_table($ret, 'ctools_css_cache', $schema['ctools_css_cache']);
   return $ret;
 }
 
-/**
- * Take over for the panels_views module if it was on.
- */
-function ctools_update_6003() {
-  $ret = array();
-
-  $result = db_result(db_query("SELECT status FROM {system} WHERE name = 'panels_views'"));
-  if ($result) {
-    $ret[] = update_sql("DELETE from {system} WHERE name = 'panels_views'");
-    drupal_install_modules(array('views_content'));
-  }
-
-  return $ret;
-}
-
-/**
- * Add primary key to the ctools_object_cache table.
- */
-function ctools_update_6004() {
-  $ret = array();
-  db_add_primary_key($ret, 'ctools_object_cache', array('sid', 'obj', 'name'));
-  db_drop_index($ret, 'ctools_object_cache', 'sid_obj_name');
-  return $ret;
-}
Index: ctools.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/ctools.module,v
retrieving revision 1.28
diff -u -p -r1.28 ctools.module
--- ctools.module	27 Sep 2009 03:41:00 -0000	1.28
+++ ctools.module	5 Oct 2009 23:14:06 -0000
@@ -79,7 +79,7 @@ function ctools_api_version($minimum, $m
  * Include ctools .inc files as necessary.
  */
 function ctools_include($file) {
-  static $used = array();
+  $used = &drupal_static(__FUNCTION__, array());
   if (!isset($used[$file])) {
     require_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'ctools') . "/includes/$file.inc";
   }
@@ -95,14 +95,14 @@ function ctools_image_path($image) {
 }
 
 /**
- * Include views .css files.
+ * Include ctools .css files.
  */
 function ctools_add_css($file) {
   drupal_add_css(drupal_get_path('module', 'ctools') . "/css/$file.css");
 }
 
 /**
- * Include views .js files.
+ * Include ctools .js files.
  */
 function ctools_add_js($file) {
   drupal_add_js(drupal_get_path('module', 'ctools') . "/js/$file.js");
@@ -137,7 +137,7 @@ function _ctools_passthrough(&$items, $t
 }
 
 /**
- * Implementation of hook_theme_registry_alter()
+ * Implement hook_theme_registry_alter().
  */
 function ctools_theme_registry_alter(&$registry) {
   if ($registry['menu_local_tasks']['function'] == 'theme_menu_local_tasks') {
@@ -193,7 +193,7 @@ function ctools_garland_preprocess_page(
 }
 
 /**
- * Implementation of hook_theme().
+ * Implement hook_theme().
  */
 function ctools_theme() {
   $items = array();
@@ -202,7 +202,7 @@ function ctools_theme() {
 }
 
 /**
- * Implementation of hook_menu().
+ * Implement hook_menu().
  */
 function ctools_menu() {
   $items = array();
@@ -211,8 +211,8 @@ function ctools_menu() {
 }
 
 /**
- * Implementation of hook_ctools_plugin_dierctory() to let the system know
- * we implement task and task_handler plugins.
+ * Implement hook_ctools_plugin_dierctory().
+ * Let the system know we implement task and task_handler plugins.
  */
 function ctools_ctools_plugin_directory($module, $plugin) {
   if ($module == 'ctools') {
@@ -224,15 +224,10 @@ function ctools_ctools_plugin_directory(
  * Get a list of roles in the system.
  */
 function ctools_get_roles() {
-  static $roles = NULL;
+  $roles = &drupal_static(__FUNCTION__);
   if (!isset($roles)) {
-    $roles = array();
-    $result = db_query("SELECT r.rid, r.name FROM {role} r ORDER BY r.name");
-    while ($obj = db_fetch_object($result)) {
-      $roles[$obj->rid] = $obj->name;
-    }
+    $roles = db_query("SELECT r.rid, r.name FROM {role} r ORDER BY r.name")->fetchAllKeyed();
   }
-
   return $roles;
 }
 
@@ -277,7 +272,8 @@ function ctools_access_menu($access) {
 }
 
 /**
- * Implementation of hook_cron. Clean up old caches.
+ * Implement hook_cron().
+ * Clean up old caches.
  */
 function ctools_cron() {
   // TODO: Should this use the passthrough?
@@ -416,7 +412,7 @@ function ctools_preprocess_page(&$variab
  *   A array of token/variable names to be replaced.
  */
 function ctools_set_page_token($token = NULL, $type = NULL, $argument = NULL) {
-  static $tokens = array();
+  $tokens = &drupal_static(__FUNCTION__, array());
 
   if (isset($token)) {
     $tokens[$token] = array($type, $argument);
Index: bulk_export/bulk_export.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/bulk_export/bulk_export.info,v
retrieving revision 1.2
diff -u -p -r1.2 bulk_export.info
--- bulk_export/bulk_export.info	12 Jul 2009 18:11:58 -0000	1.2
+++ bulk_export/bulk_export.info	5 Oct 2009 22:46:20 -0000
@@ -1,6 +1,7 @@
 ; $Id: bulk_export.info,v 1.2 2009/07/12 18:11:58 merlinofchaos Exp $
 name = Bulk Export
 description = Performs bulk exporting of data objects known about by Chaos tools.
-core = 6.x
+core = 7.x
 dependencies[] = ctools
-package = Chaos tool suite
\ No newline at end of file
+package = Chaos tool suite
+files[] = bulk_export.module
Index: bulk_export/bulk_export.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/bulk_export/bulk_export.module,v
retrieving revision 1.3
diff -u -p -r1.3 bulk_export.module
--- bulk_export/bulk_export.module	22 Jul 2009 21:12:07 -0000	1.3
+++ bulk_export/bulk_export.module	5 Oct 2009 23:04:03 -0000
@@ -7,24 +7,30 @@
  */
 
 /**
- * Implementation of hook_perm().
+ * Implement hook_perm().
  */
-function bulk_export_perm() {
-  return array('use bulk exporter');
+function bulk_export_permission() {
+  return array(
+    'use bulk exporter' => array(
+      'title' => t('Access Bulk Exporter'),
+      'description' => t('Export various system objects into code.'),
+    ),
+  );
 }
 
 /**
- * Implementation of hook_theme().
+ * Implement hook_theme().
  */
 function bulk_export_theme() {
-  return array('bulk_export_export_form' => array(
+  return array(
+    'bulk_export_export_form' => array(
       'arguments' => array('form' => NULL),
     ),
   );
 }
 
 /**
- * Implementation of hook_menu().
+ * Implement hook_menu().
  */
 function bulk_export_menu() {
   $items['admin/build/bulkexport'] = array(
@@ -56,14 +62,13 @@ function bulk_export_export() {
     }
   }
   if ($exportables) {
-    ctools_include('form');
     $form_state = array(
       're_render' => FALSE,
       'no_redirect' => TRUE,
       'exportables' => $exportables,
       'export_tables' => $export_tables,
     );
-    $output = ctools_build_form('bulk_export_export_form', $form_state);
+    $output = drupal_build_form('bulk_export_export_form', $form_state);
     if (!$output) {
       drupal_set_title(t('Bulk export results'));
       $output = '';
@@ -138,8 +143,7 @@ function bulk_export_export() {
  * FAPI definition for the bulk exporter form.
  *
  */
-function bulk_export_export_form(&$form_state) {
-  $form = array();
+function bulk_export_export_form($form, &$form_state) {
   $form['tables'] = array(
     '#prefix' => '<div class="clear-block">',
     '#suffix' => '</div>',
Index: includes/ajax.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/includes/ajax.inc,v
retrieving revision 1.15
diff -u -p -r1.15 ajax.inc
--- includes/ajax.inc	27 Sep 2009 03:41:01 -0000	1.15
+++ includes/ajax.inc	5 Oct 2009 22:46:20 -0000
@@ -44,7 +44,7 @@ function ctools_ajax_image_button($image
  *   to use-ajax.
  */
 function ctools_ajax_text_button($text, $dest, $alt, $class = '', $type = 'use-ajax') {
-  return l($text, $dest, array('html' => TRUE, 'attributes' => array('class' => "$type $class", 'title' => $alt)));
+  return l($text, $dest, array('html' => TRUE, 'attributes' => array('class' => array($type, $class), 'title' => $alt)));
 }
 
 /**
@@ -125,13 +125,13 @@ function ctools_ajax_associate_url_to_el
     //Create a unique ID to associate $form_element and hidden elements since we dont have an ID
     $form_element['#id'] = uniqid('ctools-ajax-url-');
 
-    $form_element['#attributes']['class'] = $type;
+    $form_element['#attributes']['class'] = array($type);
   }
 
   //Add hidden form element to hold base URL
   $form[$form_element['#id'] . '-url'] = array(
     '#type' => 'hidden',
     '#value' => $dest,
-    '#attributes' => array('class' =>  $form_element['#id'] . '-url'),
+    '#attributes' => array('class' => array($form_element['#id'] . '-url')),
   );
 }
Index: includes/content.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/includes/content.inc,v
retrieving revision 1.12
diff -u -p -r1.12 content.inc
--- includes/content.inc	19 Aug 2009 23:21:55 -0000	1.12
+++ includes/content.inc	5 Oct 2009 23:06:45 -0000
@@ -298,7 +298,7 @@ function ctools_content_render($type, $s
           $url = $content->title_link;
         }
         // set defaults so we don't bring up notices
-        $url += array('href' => '', 'attributes' => NULL, 'query' => NULL, 'fragment' => NULL, 'absolute' => NULL, 'html' => TRUE);
+        $url += array('href' => '', 'attributes' => array(), 'query' => array(), 'fragment' => '', 'absolute' => NULL, 'html' => TRUE);
         $content->title = l($content->title, $url['href'], $url);
       }
     }
@@ -419,7 +419,7 @@ function ctools_content_admin_info($type
   if (empty($output) || !is_object($output)) {
     $output = new stdClass();
     $output->title = t('No info');
-    $output->content =t ('No info available.');
+    $output->content = t('No info available.');
   }
   return $output;
 }
Index: includes/content.menu.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/includes/content.menu.inc,v
retrieving revision 1.3
diff -u -p -r1.3 content.menu.inc
--- includes/content.menu.inc	27 Sep 2009 03:41:01 -0000	1.3
+++ includes/content.menu.inc	5 Oct 2009 22:46:20 -0000
@@ -31,20 +31,20 @@ function ctools_content_autocomplete_nod
       $match = preg_match('/^nid: (\d+)/', $string, $preg_matches);
     }
     if ($match) {
-      $arg = $preg_matches[1];
-      $where = "n.nid = %d";
+      $arg = array(':nid' => $preg_matches[1]);
+      $where = "n.nid = :nid";
     }
     else {
-      $arg = $string;
-      $where = "LOWER(n.title) LIKE LOWER('%%%s%%')";
+      $arg = array(':title' => '%' . $string . '%');
+      $where = "LOWER(n.title) LIKE LOWER(:title)";
     }
-    $result = db_query_range("SELECT n.nid, n.title, u.name FROM {node} n INNER JOIN {users} u ON u.uid = n.uid WHERE $where", $arg, 0, 10);
+    $result = db_query_range("SELECT n.nid, n.title, u.name FROM {node} n INNER JOIN {users} u ON u.uid = n.uid WHERE $where", 0, 10, $arg);
 
     $matches = array();
-    while ($node = db_fetch_object($result)) {
+    foreach ($result as $node) {
       $name = empty($node->name) ? variable_get('anonymous', t('Anonymous')) : check_plain($node->name);
       $matches[$node->title . " [nid: $node->nid]"] = '<span class="autocomplete_title">' . check_plain($node->title) . '</span> <span class="autocomplete_user">(' . t('by @user', array('@user' => $name)) . ')</span>';
     }
-    drupal_json($matches);
+    drupal_json_output($matches);
   }
 }
Index: includes/context-access-admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/includes/context-access-admin.inc,v
retrieving revision 1.8
diff -u -p -r1.8 context-access-admin.inc
--- includes/context-access-admin.inc	27 Sep 2009 03:41:01 -0000	1.8
+++ includes/context-access-admin.inc	5 Oct 2009 22:46:20 -0000
@@ -113,7 +113,7 @@
 /**
  * Administrative form for access control.
  */
-function ctools_access_admin_form(&$form_state) {
+function ctools_access_admin_form($form, &$form_state) {
   ctools_include('context');
   $argument = isset($form_state['callback argument']) ? $form_state['callback argument'] : '';
   $fragment = $form_state['module'];
@@ -132,7 +132,7 @@ function ctools_access_admin_form(&$form
   );
   // This sets up the URL for the add access modal.
   $form['add-button']['add-url'] = array(
-    '#attributes' => array('class' => "ctools-access-add-url"),
+    '#attributes' => array('class' => array("ctools-access-add-url")),
     '#type' => 'hidden',
     '#value' => url("ctools/context/ajax/access/add/$fragment", array('absolute' => TRUE)),
   );
@@ -147,14 +147,14 @@ function ctools_access_admin_form(&$form
 
   $form['add-button']['type'] = array(
     // This ensures that the form item is added to the URL.
-    '#attributes' => array('class' => "ctools-access-add-url"),
+    '#attributes' => array('class' => array("ctools-access-add-url")),
     '#type' => 'select',
     '#options' => $options,
   );
 
   $form['add-button']['add'] = array(
     '#type' => 'submit',
-    '#attributes' => array('class' => 'ctools-use-modal'),
+    '#attributes' => array('class' => array('ctools-use-modal')),
     '#id' => "ctools-access-add",
     '#value' => t('Add'),
   );
@@ -197,23 +197,23 @@ function ctools_access_admin_render_tabl
     $plugin = ctools_get_access_plugin($test['name']);
     $title  = isset($plugin['title']) ? $plugin['title'] : t('Broken/missing access plugin %plugin', array('%plugin' => $test['name']));
 
-    $row[] = array('data' => $title, 'class' => 'ctools-access-title');
+    $row[] = array('data' => $title, 'class' => array('ctools-access-title'));
 
     $description = ctools_access_summary($plugin, $contexts, $test);
-    $row[] = array('data' => $description, 'class' => 'ctools-access-description');
+    $row[] = array('data' => $description, 'class' => array('ctools-access-description'));
 
     $operations = ctools_modal_image_button(ctools_image_path('icon-configure.png'), "ctools/context/ajax/access/configure/$fragment/$id", t('Configure settings for this item.'));
     $operations .= ctools_ajax_image_button(ctools_image_path('icon-delete.png'), "ctools/context/ajax/access/delete/$fragment/$id", t('Remove this item.'));
 
-    $row[] = array('data' => $operations, 'class' => 'ctools-access-operations', 'align' => 'right');
+    $row[] = array('data' => $operations, 'class' => array('ctools-access-operations'), 'align' => 'right');
 
     $rows[] = $row;
   }
 
   $header = array(
-    array('data' => t('Title'), 'class' => 'ctools-access-title'),
-    array('data' => t('Description'), 'class' => 'ctools-access-description'),
-    array('data' => '', 'class' => 'ctools-access-operations', 'align' => 'right'),
+    array('data' => t('Title'), 'class' => array('ctools-access-title')),
+    array('data' => t('Description'), 'class' => array('ctools-access-description')),
+    array('data' => '', 'class' => array('ctools-access-operations'), 'align' => 'right'),
   );
 
   if (empty($rows)) {
Index: includes/context-admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/includes/context-admin.inc,v
retrieving revision 1.10
diff -u -p -r1.10 context-admin.inc
--- includes/context-admin.inc	27 Sep 2009 03:41:01 -0000	1.10
+++ includes/context-admin.inc	5 Oct 2009 23:16:33 -0000
@@ -17,7 +17,7 @@
  * and can let modules utilize.
  */
 function ctools_context_info($type = NULL) {
-  static $info = NULL;
+  $info = &drupal_static(__FUNCTION__);
 
   // static doesn't work with functions like t().
   if (empty($info)) {
@@ -288,21 +288,21 @@ function ctools_context_add_item_table_b
 
     // The URL for this ajax button
     $form['buttons'][$type]['add-url'] = array(
-      '#attributes' => array('class' => "ctools-$type-add-url"),
+      '#attributes' => array('class' => array("ctools-$type-add-url")),
       '#type' => 'hidden',
       '#value' => url("ctools/context/ajax/add/$module/$type/$name", array('absolute' => TRUE)),
     );
 
     // This also will be in the URL.
     $form['buttons'][$type]['item'] = array(
-      '#attributes' => array('class' => "ctools-$type-add-url"),
+      '#attributes' => array('class' => array("ctools-$type-add-url")),
       '#type' => 'select',
       '#options' => $available_contexts,
     );
 
     $form['buttons'][$type]['add'] = array(
       '#type' => 'submit',
-      '#attributes' => array('class' => 'ctools-use-modal'),
+      '#attributes' => array('class' => array('ctools-use-modal')),
       '#id' => "ctools-$type-add",
       '#value' => $type_info['add button'],
     );
@@ -327,7 +327,7 @@ function ctools_context_add_item_to_form
     $form['position'] = array(
       '#type' => 'weight',
       '#default_value' => $position,
-      '#attributes' => array('class' => 'drag-position'),
+      '#attributes' => array('class' => array('drag-position')),
     );
   }
 
Index: includes/context.theme.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/includes/context.theme.inc,v
retrieving revision 1.7
diff -u -p -r1.7 context.theme.inc
--- includes/context.theme.inc	3 Aug 2009 21:41:41 -0000	1.7
+++ includes/context.theme.inc	5 Oct 2009 22:46:20 -0000
@@ -93,8 +93,8 @@ function theme_ctools_context_item_form(
   if (!empty($form['buttons'])) {
     // Display the add context item.
     $row   = array();
-    $row[] = array('data' => drupal_render($form['buttons'][$type]['item']), 'class' => 'title');
-    $row[] = array('data' => drupal_render($form['buttons'][$type]['add']), 'class' => 'add', 'width' => "60%");
+    $row[] = array('data' => drupal_render($form['buttons'][$type]['item']), 'class' => array('title'));
+    $row[] = array('data' => drupal_render($form['buttons'][$type]['add']), 'class' => array('add'), 'width' => "60%");
     $output .= '<div class="buttons">';
     $output .= drupal_render($form['buttons'][$type]);
     $output .= theme('table', array(), array($row), array('id' => $type . '-add-table'));
Index: includes/export.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/includes/export.inc,v
retrieving revision 1.20
diff -u -p -r1.20 export.inc
--- includes/export.inc	1 Oct 2009 21:43:53 -0000	1.20
+++ includes/export.inc	5 Oct 2009 23:18:54 -0000
@@ -220,11 +220,11 @@ function ctools_export_load_object($tabl
 }
 
 /**
- * Reset all static caches in ctools_export_load_object() or static caches for 
+ * Reset all static caches in ctools_export_load_object() or static caches for
  * a given table in ctools_export_load_object().
- * 
+ *
  * @param $table
- *   String that is the name of a table. If not defined, all static caches in 
+ *   String that is the name of a table. If not defined, all static caches in
  *   ctools_export_load_object() will be reset.
  */
 function ctools_export_load_object_reset($table = NULL) {
@@ -285,7 +285,7 @@ function ctools_get_default_object($tabl
  * to get default objects.
  */
 function _ctools_export_get_defaults($table, $export) {
-  static $cache = array();
+  $cache = &drupal_static(__FUNCTION__, array());
 
   if (!isset($cache[$table])) {
     $cache[$table] = array();
@@ -491,7 +491,8 @@ function ctools_export_get_schema($table
  * Gets the schemas for all tables with ctools object metdata.
  */
 function ctools_export_get_schemas($for_export = FALSE) {
-  static $export_tables;
+  $export_tables = &drupal_static(__FUNCTION__);
+
   if (is_null($export_tables)) {
     $export_tables = array();
     $schemas = drupal_get_schema();
Index: includes/plugins.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/includes/plugins.inc,v
retrieving revision 1.19
diff -u -p -r1.19 plugins.inc
--- includes/plugins.inc	27 Sep 2009 03:41:01 -0000	1.19
+++ includes/plugins.inc	5 Oct 2009 23:10:06 -0000
@@ -56,7 +56,7 @@
  *   need. This should be in the documentation for that particular API.
  */
 function ctools_plugin_api_info($owner, $api, $minimum_version, $current_version) {
-  static $cache = array();
+  $cache = &drupal_static(__FUNCTION__, array());
   if (!isset($cache[$owner][$api])) {
     $cache[$owner][$api] = array();
     foreach (module_implements('ctools_plugin_api') as $module) {
@@ -104,7 +104,7 @@ function ctools_plugin_api_info($owner, 
  *   The API information, in case you need it.
  */
 function ctools_plugin_api_include($owner, $api, $minimum_version, $current_version) {
-  static $already_done = array();
+  $already_done = &drupal_static(__FUNCTION__, array());
 
   $info = ctools_plugin_api_info($owner, $api, $minimum_version, $current_version);
   if (!isset($already_done[$owner][$api])) {
@@ -141,10 +141,10 @@ function ctools_plugin_api_include($owne
  *   of the array are specific to the plugin.
  */
 function ctools_get_plugins($module, $type, $id = NULL) {
-  static $plugins = array();
-  static $all_hooks = array();
-  static $all_files = array();
-  static $info = array();
+  $plugins = &drupal_static('ctools_get_plugins_plugins', array());
+  $all_hooks = &drupal_static('ctools_get_plugins_all_hooks', array());
+  $all_files = &drupal_static('ctools_get_plugins_all_files', array());
+  $info = &drupal_static('ctools_get_plugins_info', array());
 
   if (!isset($info[$module][$type])) {
     $info[$module][$type] = ctools_plugin_get_info($module, $type);
Index: includes/wizard.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/includes/wizard.inc,v
retrieving revision 1.13
diff -u -p -r1.13 wizard.inc
--- includes/wizard.inc	27 Sep 2009 03:41:01 -0000	1.13
+++ includes/wizard.inc	5 Oct 2009 22:46:20 -0000
@@ -218,7 +218,7 @@ function ctools_wizard_wrapper(&$form, &
 
     $button_attributes = array();
     if (!empty($form_state['ajax']) && empty($form_state['modal'])) {
-      $button_attributes = array('class' => 'ctools-use-ajax');
+      $button_attributes = array('class' => array('ctools-use-ajax'));
     }
 
     if (!empty($form_info['show back']) && isset($form_state['previous'])) {
Index: page_manager/page_manager.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/page_manager/page_manager.admin.inc,v
retrieving revision 1.28
diff -u -p -r1.28 page_manager.admin.inc
--- page_manager/page_manager.admin.inc	27 Sep 2009 03:41:02 -0000	1.28
+++ page_manager/page_manager.admin.inc	5 Oct 2009 22:46:20 -0000
@@ -71,14 +71,14 @@ function page_manager_list_page($js = NU
   $form = ctools_build_form('page_manager_list_pages_form', $form_state);
 
   $header = array(
-    array('data' => t('Type'), 'class' => 'page-manager-page-type'),
-    array('data' => t('Name'), 'class' => 'page-manager-page-name'),
-    array('data' => t('Title'), 'class' => 'page-manager-page-title'),
-    array('data' => t('Path'), 'class' => 'page-manager-page-path'),
-    array('data' => t('Storage'), 'class' => 'page-manager-page-storage'),
+    array('data' => t('Type'), 'class' => array('page-manager-page-type')),
+    array('data' => t('Name'), 'class' => array('page-manager-page-name')),
+    array('data' => t('Title'), 'class' => array('page-manager-page-title')),
+    array('data' => t('Path'), 'class' => array('page-manager-page-path')),
+    array('data' => t('Storage'), 'class' => array('page-manager-page-storage')),
   );
 
-  $header[] = array('data' => t('Operations'), 'class' => 'page-manager-page-operations');
+  $header[] = array('data' => t('Operations'), 'class' => array('page-manager-page-operations'));
   $table = theme('table', $header, $pages['rows'], array('id' => 'page-manager-list-pages'));
 
   $operations = '<div id="page-manager-links" class="links">' . theme('links', $pages['operations']) . '</div>';
@@ -120,13 +120,13 @@ function page_manager_get_pages($tasks, 
       $task_name = $task['name'];
     }
 
-    $class = 'page-task-' . $id;
+    $class = array('page-task-' . $id);
     if (isset($task['row class'])) {
-      $class .= ' ' . $task['row class'];
+      $class[] = $task['row class'];
     }
 
     if (!empty($task['disabled'])) {
-      $class .= ' page-manager-disabled';
+      $class[] = 'page-manager-disabled';
     }
 
     $path = array();
@@ -148,15 +148,15 @@ function page_manager_get_pages($tasks, 
 
     $type = isset($task['admin type']) ? $task['admin type'] : t('System');
     $pages['types'][$type] = $type;
-    $row['data']['type'] = array('data' => $type, 'class' => 'page-manager-page-type');
+    $row['data']['type'] = array('data' => $type, 'class' => array('page-manager-page-type'));
 
-    $row['data']['name'] = array('data' => $task_name, 'class' => 'page-manager-page-name');
-    $row['data']['title'] = array('data' => $task['admin title'], 'class' => 'page-manager-page-title');
-    $row['data']['path'] = array('data' => $visible_path, 'class' => 'page-manager-page-path');
+    $row['data']['name'] = array('data' => $task_name, 'class' => array('page-manager-page-name'));
+    $row['data']['title'] = array('data' => $task['admin title'], 'class' => array('page-manager-page-title'));
+    $row['data']['path'] = array('data' => $visible_path, 'class' => array('page-manager-page-path'));
 
     $storage = isset($task['storage']) ? $task['storage'] : t('In code');
     $pages['storages'][$storage] = $storage;
-    $row['data']['storage'] = array('data' => $storage, 'class' => 'page-manager-page-storage');
+    $row['data']['storage'] = array('data' => $storage, 'class' => array('page-manager-page-storage'));
 
 
 /*
@@ -192,7 +192,7 @@ function page_manager_get_pages($tasks, 
       }
     }
 
-    $row['data']['operations'] = array('data' => theme('links', $operations), 'class' => 'page-manager-page-operations');
+    $row['data']['operations'] = array('data' => theme('links', $operations), 'class' => array('page-manager-page-operations'));
 
     $pages['disabled'][$task_name] = !empty($task['disabled']);
     $pages['rows'][$task_name] = $row;
@@ -273,14 +273,14 @@ function page_manager_list_pages_form(&$
     '#type' => 'submit',
     '#id' => 'edit-pages-apply',
     '#value' => t('Apply'),
-    '#attributes' => array('class' => 'ctools-use-ajax'),
+    '#attributes' => array('class' => array('ctools-use-ajax')),
   );
 
   $form['reset'] = array(
     '#type' => 'submit',
     '#id' => 'edit-pages-reset',
     '#value' => t('Reset'),
-    '#attributes' => array('class' => 'ctools-use-ajax'),
+    '#attributes' => array('class' => array('ctools-use-ajax')),
   );
 
   ctools_add_js('ajax-responder');
@@ -373,7 +373,7 @@ function page_manager_edit_page($page) {
 
   $operations = page_manager_get_operations($page);
   $args = array('summary');
-  $rendered_operations = page_manager_render_operations($page, $operations, $args, array('class' => 'operations-main'), 'nav');
+  $rendered_operations = page_manager_render_operations($page, $operations, $args, array('class' => array('operations-main')), 'nav');
   $content = page_manager_get_operation_content(FALSE, $page, $args, $operations);
 
   $output = theme('page_manager_edit_page', $page, $form, $rendered_operations, $content);
@@ -410,7 +410,7 @@ function page_manager_edit_page_operatio
   // operations, such as renaming or adding a handler. Thus we get a new set
   // of operations.
   $operations = page_manager_get_operations($page);
-  $rendered_operations = page_manager_render_operations($page, $operations, $args, array('class' => 'operations-main'), 'nav');
+  $rendered_operations = page_manager_render_operations($page, $operations, $args, array('class' => array('operations-main')), 'nav');
 
   // Since this form should never be submitted to this page, process it late so
   // that we can be sure it notices changes.
@@ -465,7 +465,7 @@ function page_manager_get_operations($pa
       'actions' => array(
         'type' => 'group',
         'title' => '',
-        'class' => 'operations-actions',
+        'class' => array('operations-actions'),
         'location' => 'primary',
         'children' => array(),
       ),
@@ -611,7 +611,7 @@ function page_manager_get_handler_operat
   ctools_include('export');
   $group = array(
     'type' => 'group',
-    'class' => 'operations-handlers',
+    'class' => array('operations-handlers'),
     'title' => t('Variants'),
   );
 
@@ -628,7 +628,7 @@ function page_manager_get_handler_operat
 
     $operations[$id] = array(
       'type' => 'group',
-      'class' => 'operations-handlers-' . $id,
+      'class' => array('operations-handlers-' . $id),
       'title' => page_manager_get_handler_title($plugin, $handler, $page->task, $page->subtask_id),
       'collapsible' => $collapsible,
       'children' => array(),
@@ -636,7 +636,7 @@ function page_manager_get_handler_operat
 
     $operations[$id]['children']['actions'] = array(
       'type' => 'group',
-      'class' => 'operations-handlers-actions-' . $id,
+      'class' => array('operations-handlers-actions-' . $id),
       'title' => t('Variant operations'),
       'children' => array(),
       'location' => $id,
@@ -1042,29 +1042,29 @@ function page_manager_render_operations(
 
     // We only render an li for things in the same nav tree.
     if (empty($operation['location']) || $operation['location'] == $location) {
-      $class = $attributes['class'];
+      $class = array($attributes['class']);
       if ($id == $first) {
-        $class .= ' operation-first';
+        $class[] = 'operation-first';
       }
       else if ($id == $last) {
-        $class .= ' operation-last';
+        $class[] = 'operation-last';
       }
 
       if (empty($operation['silent']) && !empty($page->changes[$current_path])) {
-        $class .= $operation['type'] == 'group' ? ' changed-group' : ' changed';
+        $class[] = $operation['type'] == 'group' ? 'changed-group' : 'changed';
       }
       else {
-        $class .= ' not-changed';
+        $class[] = 'not-changed';
       }
 
       if ($active == $id) {
-        $class .= $operation['type'] == 'group' ? ' active-group' : ' active';
+        $class[] = $operation['type'] == 'group' ? 'active-group' : 'active';
       }
       else {
-        $class .= ' not-active';
+        $class[] = 'not-active';
       }
 
-      $output[$location] .= '<li class="' . $class . '">';
+      $output[$location] .= '<li class="' . implode(' ', $class) . '">';
     }
 
     switch ($operation['type']) {
@@ -1084,12 +1084,12 @@ function page_manager_render_operations(
           }
         }
 
-        $class = 'page-manager-operation';
+        $class = array('page-manager-operation');
         if (!isset($operation['ajax']) || !empty($operation['ajax'])) {
-          $class .= ' ctools-use-ajax';
+          $class[] = 'ctools-use-ajax';
         }
         if (!empty($operation['class'])) {
-          $class .= ' ' . $operation['class'];
+          $class[] = $operation['class'];
         }
 
         $description = isset($operation['description']) ? $operation['description'] : '';
Index: page_manager/plugins/tasks/page.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/page_manager/plugins/tasks/page.admin.inc,v
retrieving revision 1.19
diff -u -p -r1.19 page.admin.inc
--- page_manager/plugins/tasks/page.admin.inc	27 Sep 2009 03:41:02 -0000	1.19
+++ page_manager/plugins/tasks/page.admin.inc	5 Oct 2009 22:46:20 -0000
@@ -858,14 +858,14 @@ function page_manager_page_form_argument
 
     // The URL for this ajax button
     $form['table']['argument'][$keyword]['change-url'] = array(
-      '#attributes' => array('class' => "page-manager-context-$keyword-change-url"),
+      '#attributes' => array('class' => array("page-manager-context-$keyword-change-url")),
       '#type' => 'hidden',
       '#value' => url("admin/build/pages/argument/change/$task_name/$keyword", array('absolute' => TRUE)),
     );
     $form['table']['argument'][$keyword]['change'] = array(
       '#type' => 'submit',
       '#value' => t('Change'),
-      '#attributes' => array('class' => 'ctools-use-modal'),
+      '#attributes' => array('class' => array('ctools-use-modal')),
       '#id' => "page-manager-context-$keyword-change",
     );
 
@@ -875,14 +875,14 @@ function page_manager_page_form_argument
     if (!empty($plugin)) {
       // The URL for this ajax button
       $form['table']['argument'][$keyword]['settings-url'] = array(
-        '#attributes' => array('class' => "page-manager-context-$keyword-settings-url"),
+        '#attributes' => array('class' => array("page-manager-context-$keyword-settings-url")),
         '#type' => 'hidden',
         '#value' => url("admin/build/pages/argument/settings/$task_name/$keyword", array('absolute' => TRUE)),
       );
       $form['table']['argument'][$keyword]['settings'] = array(
         '#type' => 'submit',
         '#value' => t('Settings'),
-        '#attributes' => array('class' => 'ctools-use-modal'),
+        '#attributes' => array('class' => array('ctools-use-modal')),
         '#id' => "page-manager-context-$keyword-settings",
       );
     }
@@ -894,10 +894,10 @@ function page_manager_page_form_argument
  */
 function theme_page_manager_page_form_argument_table($form) {
   $header = array(
-    array('data' => t('Argument'), 'class' => 'page-manager-argument'),
-    array('data' => t('Position in path'), 'class' => 'page-manager-position'),
-    array('data' => t('Context assigned'), 'class' => 'page-manager-context'),
-    array('data' => t('Operations'), 'class' => 'page-manager-operations'),
+    array('data' => t('Argument'), 'class' => array('page-manager-argument')),
+    array('data' => t('Position in path'), 'class' => array('page-manager-position')),
+    array('data' => t('Context assigned'), 'class' => array('page-manager-context')),
+    array('data' => t('Operations'), 'class' => array('page-manager-operations')),
   );
 
   $rows = array();
Index: page_manager/plugins/tasks/page.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/page_manager/plugins/tasks/page.inc,v
retrieving revision 1.17
diff -u -p -r1.17 page.inc
--- page_manager/plugins/tasks/page.inc	19 Aug 2009 01:12:24 -0000	1.17
+++ page_manager/plugins/tasks/page.inc	5 Oct 2009 22:46:20 -0000
@@ -572,9 +572,9 @@ function page_manager_page_admin_summary
   $rows = array();
 
   $rows[] = array(
-    array('class' => t('page-summary-label'), 'data' => t('Storage')),
-    array('class' => t('page-summary-data'), 'data' => $subtask['storage']),
-    array('class' => t('page-summary-operation'), 'data' => ''),
+    array('class' => array('page-summary-label'), 'data' => t('Storage')),
+    array('class' => array('page-summary-data'), 'data' => $subtask['storage']),
+    array('class' => array('page-summary-operation'), 'data' => ''),
   );
 
   if (!empty($page->disabled)) {
@@ -587,9 +587,9 @@ function page_manager_page_admin_summary
   }
 
   $rows[] = array(
-    array('class' => t('page-summary-label'), 'data' => t('Status')),
-    array('class' => t('page-summary-data'), 'data' => $text),
-    array('class' => t('page-summary-operation'), 'data' => $link),
+    array('class' => array('page-summary-label'), 'data' => t('Status')),
+    array('class' => array('page-summary-data'), 'data' => $text),
+    array('class' => array('page-summary-operation'), 'data' => $link),
   );
 
 
@@ -614,8 +614,8 @@ function page_manager_page_admin_summary
 
   if ($message) {
     $rows[] = array(
-      array('class' => t('page-summary-data'), 'data' => $message, 'colspan' => 2),
-      array('class' => t('page-summary-operation'), 'data' => $link),
+      array('class' => array('page-summary-data'), 'data' => $message, 'colspan' => 2),
+      array('class' => array('page-summary-operation'), 'data' => $link),
     );
   }
 
@@ -627,9 +627,9 @@ function page_manager_page_admin_summary
   }
 
   $rows[] = array(
-    array('class' => t('page-summary-label'), 'data' => t('Path')),
-    array('class' => t('page-summary-data'), 'data' => $path),
-    array('class' => t('page-summary-operation'), 'data' => $link),
+    array('class' => array('page-summary-label'), 'data' => t('Path')),
+    array('class' => array('page-summary-data'), 'data' => $path),
+    array('class' => array('page-summary-operation'), 'data' => $link),
   );
 
   if (empty($access['plugins'])) {
@@ -648,9 +648,9 @@ function page_manager_page_admin_summary
   $link = l(t('Edit'), page_manager_edit_url($task_name, array('settings', 'access')));
 
   $rows[] = array(
-    array('class' => t('page-summary-label'), 'data' => t('Access')),
-    array('class' => t('page-summary-data'), 'data' => $access),
-    array('class' => t('page-summary-operation'), 'data' => $link),
+    array('class' => array('page-summary-label'), 'data' => t('Access')),
+    array('class' => array('page-summary-data'), 'data' => $access),
+    array('class' => array('page-summary-operation'), 'data' => $link),
   );
 
   $menu_options = array(
@@ -683,9 +683,9 @@ function page_manager_page_admin_summary
 
   $link = l(t('Edit'), page_manager_edit_url($task_name, array('settings', 'menu')));
   $rows[] = array(
-    array('class' => t('page-summary-label'), 'data' => t('Menu')),
-    array('class' => t('page-summary-data'), 'data' => $menu),
-    array('class' => t('page-summary-operation'), 'data' => $link),
+    array('class' => array('page-summary-label'), 'data' => t('Menu')),
+    array('class' => array('page-summary-data'), 'data' => $menu),
+    array('class' => array('page-summary-operation'), 'data' => $link),
   );
 
   $output .= theme('table', array(), $rows, array('id' => 'page-manager-page-summary'));
Index: page_manager/plugins/tasks/term_view.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/page_manager/plugins/tasks/term_view.inc,v
retrieving revision 1.5
diff -u -p -r1.5 term_view.inc
--- page_manager/plugins/tasks/term_view.inc	4 Aug 2009 21:43:06 -0000	1.5
+++ page_manager/plugins/tasks/term_view.inc	5 Oct 2009 22:46:20 -0000
@@ -255,23 +255,23 @@ function page_manager_term_view_admin_su
   $task_name = page_manager_make_task_name($task['name'], $subtask['name']);
 
   $rows[] = array(
-    array('class' => t('page-summary-label'), 'data' => t('Path')),
-    array('class' => t('page-summary-data'), 'data' => 'taxonomy/term/%term'),
-    array('class' => t('page-summary-operation'), 'data' => ''),
+    array('class' => array('page-summary-label'), 'data' => t('Path')),
+    array('class' => array('page-summary-data'), 'data' => 'taxonomy/term/%term'),
+    array('class' => array('page-summary-operation'), 'data' => ''),
   );
 
   $rows[] = array(
-    array('class' => t('page-summary-label'), 'data' => t('Access')),
-    array('class' => t('page-summary-data'), 'data' => t('This page is publicly accessible.')),
-    array('class' => t('page-summary-operation'), 'data' => ''),
+    array('class' => array('page-summary-label'), 'data' => t('Access')),
+    array('class' => array('page-summary-data'), 'data' => t('This page is publicly accessible.')),
+    array('class' => array('page-summary-operation'), 'data' => ''),
   );
 
   $menu = t('No menu entry');
 
   $rows[] = array(
-    array('class' => t('page-summary-label'), 'data' => t('Menu')),
-    array('class' => t('page-summary-data'), 'data' => $menu),
-    array('class' => t('page-summary-operation'), 'data' => ''),
+    array('class' => array('page-summary-label'), 'data' => t('Menu')),
+    array('class' => array('page-summary-data'), 'data' => $menu),
+    array('class' => array('page-summary-operation'), 'data' => ''),
   );
 
   if (variable_get('page_manager_term_view_type', 'multiple') == 'multiple') {
@@ -282,9 +282,9 @@ function page_manager_term_view_admin_su
   }
 
   $rows[] = array(
-    array('class' => t('page-summary-label'), 'data' => t('%term')),
-    array('class' => t('page-summary-data'), 'data' => $message),
-    array('class' => t('page-summary-operation'), 'data' => ''),
+    array('class' => array('page-summary-label'), 'data' => t('%term')),
+    array('class' => array('page-summary-data'), 'data' => $message),
+    array('class' => array('page-summary-operation'), 'data' => ''),
   );
 
   if (variable_get('page_manager_taxonomy_breadcrumb', TRUE)) {
@@ -295,9 +295,9 @@ function page_manager_term_view_admin_su
   }
 
   $rows[] = array(
-    array('class' => t('page-summary-label'), 'data' => t('Breadcrumb')),
-    array('class' => t('page-summary-data'), 'data' => $message),
-    array('class' => t('page-summary-operation'), 'data' => ''),
+    array('class' => array('page-summary-label'), 'data' => t('Breadcrumb')),
+    array('class' => array('page-summary-data'), 'data' => $message),
+    array('class' => array('page-summary-operation'), 'data' => ''),
   );
 
   $output = theme('table', array(), $rows, array('id' => 'page-manager-page-summary'));
Index: page_manager/theme/page_manager.theme.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/page_manager/theme/page_manager.theme.inc,v
retrieving revision 1.5
diff -u -p -r1.5 page_manager.theme.inc
--- page_manager/theme/page_manager.theme.inc	27 Sep 2009 03:41:02 -0000	1.5
+++ page_manager/theme/page_manager.theme.inc	5 Oct 2009 22:46:20 -0000
@@ -84,13 +84,13 @@ function theme_page_manager_handler_rear
 
       $row[] = array(
         'data' => drupal_render($element['title']),
-        'class' => 'page-manager-handler',
+        'class' => array('page-manager-handler'),
       );
 
-      $element['weight']['#attributes']['class'] = 'weight';
+      $element['weight']['#attributes']['class'][] = 'weight';
       $row[] = drupal_render($element['weight']);
 
-      $rows[] = array('data' => $row, 'class' => 'draggable', 'id' => 'page-manager-row-' . $id);
+      $rows[] = array('data' => $row, 'class' => array('draggable'), 'id' => 'page-manager-row-' . $id);
     }
   }
 
@@ -99,7 +99,7 @@ function theme_page_manager_handler_rear
   }
 
   $header = array(
-    array('data' => t('Variant'), 'class' => 'page-manager-handler'),
+    array('data' => t('Variant'), 'class' => array('page-manager-handler')),
     t('Weight'),
   );
 
Index: plugins/content_types/user_context/profile_fields.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/plugins/content_types/user_context/profile_fields.inc,v
retrieving revision 1.5
diff -u -p -r1.5 profile_fields.inc
--- plugins/content_types/user_context/profile_fields.inc	27 Sep 2009 03:41:03 -0000	1.5
+++ plugins/content_types/user_context/profile_fields.inc	5 Oct 2009 22:46:20 -0000
@@ -41,6 +41,7 @@ function ctools_profile_fields_content_t
     if (is_array($account->content[$category])) {
       foreach ($account->content[$category] as $field) {
         if (is_array($field['#attributes'])) {
+          // @todo 'class' is *always* an array now. 04/10/2009 sun
           $vars[$field['#attributes']['class']]['title'] = $field['#title'];
           $vars[$field['#attributes']['class']]['value'] = $field['#value'];
         }
