Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.812
diff -u -r1.812 common.inc
--- includes/common.inc	29 Oct 2008 10:06:06 -0000	1.812
+++ includes/common.inc	31 Oct 2008 04:03:10 -0000
@@ -25,6 +25,22 @@
 define('SAVED_DELETED', 3);
 
 /**
+ * The weight of JavaScript libraries, settings or jQuery plugins being
+ * added to the page.
+ */
+define('JS_WEIGHT_LIBRARY', -100);
+
+/**
+ * The default weight of JavaScript being added to the page.
+ */
+define('JS_WEIGHT_DEFAULT', 0);
+
+/**
+ * The weight of theme JavaScript code being added to the page.
+ */
+define('JS_WEIGHT_THEME', 100);
+
+/**
  * Set content for a specified region.
  *
  * @param $region
@@ -2069,7 +2085,7 @@
  * reference to an existing file or as inline code. The following actions can be
  * performed using this function:
  *
- * - Add a file ('core', 'module' and 'theme'):
+ * - Add a file ('file'):
  *   Adds a reference to a JavaScript file to the page. JavaScript files
  *   are placed in a certain order, from 'core' first, to 'module' and finally
  *   'theme' so that files, that are added later, can override previously added
@@ -2088,41 +2104,54 @@
  * Examples:
  * @code
  *   drupal_add_js('misc/collapse.js');
- *   drupal_add_js('misc/collapse.js', 'module');
+ *   drupal_add_js('misc/collapse.js', 'file');
  *   drupal_add_js('$(document).ready(function(){alert("Hello!");});',
- *     array('type' => 'inline', 'scope' => 'footer')
+ *     array('#type' => 'inline', '#scope' => 'footer', '#weight' => 5)
  *   );
  * @endcode
  *
  * @param $data
  *   (optional) If given, the value depends on the $options parameter:
- *   - 'core', 'module' or 'theme': Path to the file relative to base_path().
+ *   - 'file': Path to the file relative to base_path().
  *   - 'inline': The JavaScript code that should be placed in the given scope.
  *   - 'setting': An array with configuration options as associative array. The
- *       array is directly placed in Drupal.settings. You might want to wrap your
- *       actual configuration settings in another variable to prevent the pollution
- *       of the Drupal.settings namespace.
+ *       array is directly placed in Drupal.settings. You might want to wrap
+ *       your actual configuration settings in another variable to prevent
+ *       the pollution of the Drupal.settings namespace.
  * @param $options
  *   (optional) A string defining the type of JavaScript that is being added
- *   in the $data parameter ('core', 'module', 'theme', 'setting', 'inline'),
- *   or an array which can have any or all of the following keys (these are
- *   not valid with type => 'setting'):
- *   - type
- *       The type of JavaScript that should be added to the page. Allowed
- *       values are 'core', 'module', 'theme', 'inline' and 'setting'. Defaults
- *       to 'module'.
- *   - scope
+ *   in the $data parameter ('file', 'setting', 'inline'), or an array which
+ *   can have any or all of the following keys (these are not valid when the
+ *   type is 'setting'):
+ *   - #type
+ *       The type of JavaScript that is to be added to the page.
+ *       Allowed values are 'file', 'inline' and 'setting'. Defaults to 'file'.
+ *   - #scope
  *       The location in which you want to place the script. Possible
  *       values are 'header' and 'footer'. If your theme implements different
  *       locations, however, you can also use these. Defaults to 'header'.
- *   - defer
+ *   - #weight
+ *       A number defining the order in which the JavaScript is added to the
+ *       page. In some cases, the order in which the JavaScript is presented
+ *       on the page is very important. Behaviors, for example, require
+ *       registration before being put to use. Defaults to JS_WEIGHT_DEFAULT.
+ *
+ *       Possible constants are as follows...
+ *       - JS_WEIGHT_LIBRARY: Any libraries, settings, or jQuery plugins.
+ *       - JS_WEIGHT_DEFAULT: Any module-layer JavaScript.
+ *       - JS_WEIGHT_THEME: Any theme-layer JavaScript.
+ *       If you need to invoke a JavaScript file before any other module's
+ *       JavaScript, for example, you would use JS_WEIGHT_DEFAULT - 1. Note
+ *       that inline JavaScript will be outputed after files regardless of
+ *       their weight.
+ *   - #defer
  *       If set to TRUE, the defer attribute is set on the <script> tag.
  *       Defaults to FALSE. This parameter is not used with 'type' => 'setting'.
- *   - cache
+ *   - #cache
  *       If set to FALSE, the JavaScript file is loaded anew on every page
  *       call, that means, it is not cached. Used only when type references
  *       a JavaScript file. Defaults to TRUE.
- *   - preprocess
+ *   - #preprocess
  *       Aggregate the JavaScript if the JavaScript optimization setting has
  *       been toggled in admin/settings/performance. Defaults to TRUE.
  * @param $reset
@@ -2137,25 +2166,23 @@
   // Construct the options, taking the defaults into consideration.
   if (isset($options)) {
     if (!is_array($options)) {
-      $options = array('type' => $options);
+      $options = array('#type' => $options);
     }
   }
   else {
     $options = array();
   }
   $options += array(
-    'type' => 'module',
-    // Default to a header scope only if we're adding some data.
-    'scope' => isset($data) ? 'header' : NULL,
-    'cache' => TRUE,
-    'defer' => FALSE,
-    'preprocess' => TRUE
+    '#type' => 'file',
+    '#weight' => JS_WEIGHT_DEFAULT,
+    '#scope' => 'header',
+    '#cache' => TRUE,
+    '#defer' => FALSE,
+    '#preprocess' => TRUE,
+    '#data' => $data
   );
   // Preprocess can only be set if caching is enabled.
-  $options['preprocess'] = $options['cache'] ? $options['preprocess'] : FALSE;
-  $type = $options['type'];
-  $scope = $options['scope'];
-  unset($options['type'], $options['scope']);
+  $options['#preprocess'] = $options['#cache'] ? $options['#preprocess'] : FALSE;
 
   // Request made to reset the JavaScript added so far.
   if ($reset) {
@@ -2167,47 +2194,52 @@
     // first time a Javascript file is added.
     if (empty($javascript)) {
       $javascript = array(
-        'header' => array(
-          'core' => array(
-            'misc/jquery.js' => array('cache' => TRUE, 'defer' => FALSE, 'preprocess' => TRUE),
-            'misc/drupal.js' => array('cache' => TRUE, 'defer' => FALSE, 'preprocess' => TRUE),
-          ),
-          'module' => array(),
-          'theme' => array(),
-          'setting' => array(
+        'settings' => array(
+          '#data' => array(
             array('basePath' => base_path()),
           ),
-          'inline' => array(),
-        )
+          '#type' => 'setting',
+          '#scope' => 'header',
+          '#weight' => JS_WEIGHT_LIBRARY
+        ),
+        'misc/jquery.js' => array(
+          '#data' => 'misc/jquery.js',
+          '#type' => 'file',
+          '#scope' => 'header',
+          '#weight' => JS_WEIGHT_LIBRARY - 1,
+          '#cache' => TRUE,
+          '#defer' => FALSE,
+          '#preprocess' => TRUE
+        ),
+        'misc/drupal.js' => array(
+          '#data' => 'misc/drupal.js',
+          '#type' => 'file',
+          '#scope' => 'header',
+          '#weight' => JS_WEIGHT_LIBRARY,
+          '#cache' => TRUE,
+          '#defer' => FALSE,
+          '#preprocess' => TRUE
+        ),
       );
     }
 
-    if (isset($scope) && !isset($javascript[$scope])) {
-      $javascript[$scope] = array('core' => array(), 'module' => array(), 'theme' => array(), 'setting' => array(), 'inline' => array());
-    }
-
-    if (isset($type) && isset($scope) && !isset($javascript[$scope][$type])) {
-      $javascript[$scope][$type] = array();
-    }
-
-    switch ($type) {
+    switch ($options['#type']) {
       case 'setting':
-        $javascript[$scope][$type][] = $data;
+        // All JavaScript settings are placed in the header of the page with
+        // the library weight so that inline scripts appear afterwards.
+        $javascript['settings']['#data'][] = $data;
         break;
       case 'inline':
-        $javascript[$scope][$type][] = array('code' => $data, 'defer' => $options['defer']);
+        $javascript[] = $options;
+        break;
+      case 'file':
+        // Files must keep their name as the associative key so the same
+        // JavaScript files can not be added twice.
+        $javascript[$options['#data']] = $options;
         break;
-      default:
-        $javascript[$scope][$type][$data] = $options;
     }
   }
-
-  if (isset($scope)) {
-    return isset($javascript[$scope]) ? $javascript[$scope] : array();
-  }
-  else {
-    return $javascript;
-  }
+  return $javascript;
 }
 
 /**
@@ -2232,18 +2264,24 @@
   if ((!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update') && function_exists('locale_update_js_files')) {
     locale_update_js_files();
   }
-
   if (!isset($javascript)) {
-    $javascript = drupal_add_js(NULL, array('scope' => $scope));
+    $javascript = drupal_add_js();
   }
-
   if (empty($javascript)) {
     return '';
   }
 
+  // Filter out elements of the given scope.
+  $items = array();
+  foreach ($javascript as $item) {
+    if ($item['#scope'] == $scope) {
+      $items[] = $item;
+    }
+  }
+
   $output = '';
   $preprocessed = '';
-  $no_preprocess = array('core' => '', 'module' => '', 'theme' => '');
+  $no_preprocess = '';
   $files = array();
   $preprocess_js = (variable_get('preprocess_js', FALSE) && (!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update'));
   $directory = file_directory_path();
@@ -2263,29 +2301,26 @@
   $embed_prefix = "\n<!--//--><![CDATA[//><!--\n";
   $embed_suffix = "\n//--><!]]>\n";
 
-  foreach ($javascript as $type => $data) {
-    if (!$data) continue;
-
-    switch ($type) {
+  // Sort the JavaScript by weight so that it appears in the correct order.
+  uasort($items, 'element_sort');
+  
+  // Loop through the JavaScript to construct the rendered output.
+  foreach ($items as $item) {
+    switch ($item['#type']) {
       case 'setting':
-        $output .= '<script type="text/javascript">' . $embed_prefix . 'jQuery.extend(Drupal.settings, ' . drupal_to_js(call_user_func_array('array_merge_recursive', $data)) . ");" . $embed_suffix . "</script>\n";
+        $output .= '<script type="text/javascript">' . $embed_prefix . 'jQuery.extend(Drupal.settings, ' . drupal_to_js(call_user_func_array('array_merge_recursive', $item['#data'])) . ");" . $embed_suffix . "</script>\n";
         break;
       case 'inline':
-        foreach ($data as $info) {
-          $output .= '<script type="text/javascript"' . ($info['defer'] ? ' defer="defer"' : '') . '>' . $embed_prefix . $info['code'] . $embed_suffix . "</script>\n";
-        }
+        $output .= '<script type="text/javascript"' . ($item['#defer'] ? ' defer="defer"' : '') . '>' . $embed_prefix . $item['#data'] . $embed_suffix . "</script>\n";
         break;
-      default:
-        // If JS preprocessing is off, we still need to output the scripts.
-        // Additionally, go through any remaining scripts if JS preprocessing is on and output the non-cached ones.
-        foreach ($data as $path => $info) {
-          if (!$info['preprocess'] || !$is_writable || !$preprocess_js) {
-            $no_preprocess[$type] .= '<script type="text/javascript"' . ($info['defer'] ? ' defer="defer"' : '') . ' src="' . base_path() . $path . ($info['cache'] ? $query_string : '?' . REQUEST_TIME) . "\"></script>\n";
-          }
-          else {
-            $files[$path] = $info;
-          }
+      case 'file':
+        if (!$item['#preprocess'] || !$is_writable || !$preprocess_js) {
+          $no_preprocess .= '<script type="text/javascript"' . ($item['#defer'] ? ' defer="defer"' : '') . ' src="' . base_path() . $item['#data'] . ($item['#cache'] ? $query_string : '?' . REQUEST_TIME) . "\"></script>\n";
+        }
+        else {
+          $files[$item['#data']] = $item;
         }
+        break;
     }
   }
 
@@ -2298,9 +2333,7 @@
 
   // Keep the order of JS files consistent as some are preprocessed and others are not.
   // Make sure any inline or JS setting variables appear last after libraries have loaded.
-  $output = $preprocessed . implode('', $no_preprocess) . $output;
-
-  return $output;
+  return $preprocessed . $no_preprocess . $output;
 }
 
 /**
@@ -2413,7 +2446,10 @@
 function drupal_add_tabledrag($table_id, $action, $relationship, $group, $subgroup = NULL, $source = NULL, $hidden = TRUE, $limit = 0) {
   static $js_added = FALSE;
   if (!$js_added) {
-    drupal_add_js('misc/tabledrag.js', 'core');
+    // Add the table drag JavaScript to the page before the module JavaScript
+    // to ensure that table drag behaviors are registered before any module
+    // uses it.
+    drupal_add_js('misc/tabledrag.js', array('#weight' => JS_WEIGHT_DEFAULT - 1));
     $js_added = TRUE;
   }
 
@@ -2451,7 +2487,7 @@
   if (!file_exists($jspath . '/' . $filename)) {
     // Build aggregate JS file.
     foreach ($files as $path => $info) {
-      if ($info['preprocess']) {
+      if ($info['#preprocess']) {
         // Append a ';' after each JS file to prevent them from running together.
         $contents .= file_get_contents($path) . ';';
       }
Index: includes/batch.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/batch.inc,v
retrieving revision 1.26
diff -u -r1.26 batch.inc
--- includes/batch.inc	22 Oct 2008 19:39:36 -0000	1.26
+++ includes/batch.inc	31 Oct 2008 04:03:10 -0000
@@ -84,7 +84,7 @@
   // error messages. Only safe strings should be passed in to batch_set().
   $current_set = _batch_current_set();
   drupal_set_title($current_set['title'], PASS_THROUGH);
-  drupal_add_js('misc/progress.js', array('type' => 'core', 'cache' => FALSE));
+  drupal_add_js('misc/progress.js', array('#cache' => FALSE));
 
   $url = url($batch['url'], array('query' => array('id' => $batch['id'])));
   $js_setting = array(
@@ -95,7 +95,7 @@
     ),
   );
   drupal_add_js($js_setting, 'setting');
-  drupal_add_js('misc/batch.js', array('type' => 'core', 'cache' => FALSE));
+  drupal_add_js('misc/batch.js', array('#cache' => FALSE));
 
   $output = '<div id="progress"></div>';
   return $output;
Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.299
diff -u -r1.299 form.inc
--- includes/form.inc	30 Oct 2008 02:35:54 -0000	1.299
+++ includes/form.inc	31 Oct 2008 04:03:10 -0000
@@ -1879,7 +1879,7 @@
   // Adding the same javascript settings twice will cause a recursion error,
   // we avoid the problem by checking if the javascript has already been added.
   if (isset($element['#ahah']['path']) && isset($element['#ahah']['event']) && !isset($js_added[$element['#id']])) {
-    drupal_add_js('misc/jquery.form.js');
+    drupal_add_js('misc/jquery.form.js', array('#weight' => JS_WEIGHT_LIBRARY));
     drupal_add_js('misc/ahah.js');
 
     $ahah_binding = array(
@@ -1905,7 +1905,7 @@
 
     // Add progress.js if we're doing a bar display.
     if ($ahah_binding['progress']['type'] == 'bar') {
-      drupal_add_js('misc/progress.js');
+      drupal_add_js('misc/progress.js', array('#cache' => FALSE));
     }
 
     drupal_add_js(array('ahah' => array($element['#id'] => $ahah_binding)), 'setting');
Index: includes/theme.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/theme.inc,v
retrieving revision 1.446
diff -u -r1.446 theme.inc
--- includes/theme.inc	26 Oct 2008 18:06:38 -0000	1.446
+++ includes/theme.inc	31 Oct 2008 04:03:10 -0000
@@ -158,7 +158,7 @@
 
   // Add scripts used by this theme.
   foreach ($final_scripts as $script) {
-    drupal_add_js($script, 'theme');
+    drupal_add_js($script, array('#weight' => JS_WEIGHT_THEME));
   }
 
   $theme_engine = NULL;
Index: modules/node/node.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.admin.inc,v
retrieving revision 1.27
diff -u -r1.27 node.admin.inc
--- modules/node/node.admin.inc	12 Oct 2008 04:30:06 -0000	1.27
+++ modules/node/node.admin.inc	31 Oct 2008 04:03:10 -0000
@@ -254,7 +254,7 @@
     $form['filters']['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset'));
   }
 
-  drupal_add_js('misc/form.js', 'core');
+  drupal_add_js('misc/form.js');
 
   return $form;
 }
Index: modules/simpletest/simpletest.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.module,v
retrieving revision 1.23
diff -u -r1.23 simpletest.module
--- modules/simpletest/simpletest.module	27 Oct 2008 15:46:26 -0000	1.23
+++ modules/simpletest/simpletest.module	31 Oct 2008 04:03:10 -0000
@@ -210,7 +210,10 @@
 
 function theme_simpletest_test_table($table) {
   drupal_add_css(drupal_get_path('module', 'simpletest') . '/simpletest.css');
-  drupal_add_js(drupal_get_path('module', 'simpletest') . '/simpletest.js', 'module');
+
+  // Since SimpleTest is a special use case for the table select, stick the
+  // SimpleTest JavaScript above the table select.
+  drupal_add_js(drupal_get_path('module', 'simpletest') . '/simpletest.js', array('#weight' => JS_WEIGHT_DEFAULT - 1));
 
   // Create header for test selection table.
   $header = array(
Index: modules/user/user.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.admin.inc,v
retrieving revision 1.30
diff -u -r1.30 user.admin.inc
--- modules/user/user.admin.inc	19 Oct 2008 21:19:02 -0000	1.30
+++ modules/user/user.admin.inc	31 Oct 2008 04:03:10 -0000
@@ -83,7 +83,7 @@
     );
   }
 
-  drupal_add_js('misc/form.js', 'core');
+  drupal_add_js('misc/form.js');
 
   return $form;
 }
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.930
diff -u -r1.930 user.module
--- modules/user/user.module	26 Oct 2008 18:06:39 -0000	1.930
+++ modules/user/user.module	31 Oct 2008 04:03:10 -0000
@@ -2160,7 +2160,7 @@
   global $user;
   // Only need to do once per page.
   if (!$complete) {
-    drupal_add_js(drupal_get_path('module', 'user') . '/user.js', 'module');
+    drupal_add_js(drupal_get_path('module', 'user') . '/user.js');
 
     drupal_add_js(array(
       'password' => array(
Index: modules/simpletest/tests/common.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/common.test,v
retrieving revision 1.10
diff -u -r1.10 common.test
--- modules/simpletest/tests/common.test	26 Oct 2008 18:06:39 -0000	1.10
+++ modules/simpletest/tests/common.test	31 Oct 2008 04:03:10 -0000
@@ -307,6 +307,11 @@
  */
 class JavaScriptTestCase extends DrupalWebTestCase {
   /**
+   * Store configured value for JavaScript preprocessing.
+   */
+  var $preprocess_js;
+
+  /**
    * Implementation of getInfo().
    */
   function getInfo() {
@@ -316,44 +321,58 @@
       'group' => t('System')
     );
   }
-  
+
   /**
    * Implementation of setUp().
    */
   function setUp() {
     // Reset drupal_add_js() before each test.
     drupal_add_js(NULL, NULL, TRUE);
+    // Disable Preprocessing
+    $this->preprocess_js = variable_get('preprocess_js', 0);
+    variable_set('preprocess_js', 0);
+    // Enable locale in test enviornment.
+    parent::setUp('locale');
   }
-  
+
+  /**
+   * Implementation of tearDown()
+   */
+  function tearDown() {
+    // Restore configured value for JavaScript preprocessing.
+    variable_set('preprocess_js', $this->preprocess_js);
+    parent::tearDown();
+  }
+
   /**
    * Test default JavaScript is empty.
    */
   function testDefault() {
     $this->assertEqual(array(), drupal_add_js(), t('Default JavaScript is empty.'));
   }
-  
+
   /**
    * Test adding a JavaScript file.
    */
   function testAddFile() {
     drupal_add_js('misc/collapse.js');
     $javascript = drupal_add_js();
-    $this->assertTrue(array_key_exists('misc/jquery.js', $javascript['header']['core']), t('jQuery is added when a file is added.'));
-    $this->assertTrue(array_key_exists('misc/drupal.js', $javascript['header']['core']), t('Drupal.js is added when file is added.'));
-    $this->assertTrue(array_key_exists('misc/collapse.js', $javascript['header']['module']), t('JavaScript files are correctly added.'));
-    $this->assertEqual(base_path(), $javascript['header']['setting'][0]['basePath'], t('Base path JavaScript setting is correctly set.'));
+    $this->assertTrue(array_key_exists('misc/jquery.js', $javascript), t('jQuery is added when a file is added.'));
+    $this->assertTrue(array_key_exists('misc/drupal.js', $javascript), t('Drupal.js is added when file is added.'));
+    $this->assertTrue(array_key_exists('misc/collapse.js', $javascript), t('JavaScript files are correctly added.'));
+    $this->assertEqual(base_path(), $javascript['settings']['#data'][0]['basePath'], t('Base path JavaScript setting is correctly set.'));
   }
-  
+
   /**
    * Test adding settings.
    */
   function testAddSetting() {
     drupal_add_js(array('drupal' => 'rocks', 'dries' => 280342800), 'setting');
     $javascript = drupal_add_js();
-    $this->assertEqual(280342800, $javascript['header']['setting'][1]['dries'], t('JavaScript setting is set correctly.'));
-    $this->assertEqual('rocks', $javascript['header']['setting'][1]['drupal'], t('The other JavaScript setting is set correctly.'));
+    $this->assertEqual(280342800, $javascript['settings']['#data'][1]['dries'], t('JavaScript setting is set correctly.'));
+    $this->assertEqual('rocks', $javascript['settings']['#data'][1]['drupal'], t('The other JavaScript setting is set correctly.'));
   }
-  
+
   /**
    * Test drupal_get_js() for JavaScript settings.
    */
@@ -364,44 +383,54 @@
     $this->assertTrue(strpos($javascript, 'testSetting') > 0, t('Rendered JavaScript header returns custom setting.'));
     $this->assertTrue(strpos($javascript, 'misc/jquery.js') > 0, t('Rendered JavaScript header includes jQuery.'));
   }
-  
+
   /**
    * Test to see if resetting the JavaScript empties the cache.
    */
   function testReset() {
     drupal_add_js('misc/collapse.js');
-    drupal_add_js(NULL, NULL, TRUE);    
+    drupal_add_js(NULL, NULL, TRUE);
     $this->assertEqual(array(), drupal_add_js(), t('Resetting the JavaScript correctly empties the cache.'));
   }
-  
+
   /**
    * Test adding inline scripts.
    */
   function testAddInline() {
     $inline = '$(document).ready(function(){});';
-    drupal_add_js($inline, array('type' => 'inline', 'scope' => 'footer'));
+    drupal_add_js($inline, array('#type' => 'inline', '#scope' => 'footer'));
     $javascript = drupal_add_js();
-    $this->assertTrue(array_key_exists('misc/jquery.js', $javascript['header']['core']), t('jQuery is added when inline scripts are added.'));
-    $this->assertEqual($inline, $javascript['footer']['inline'][0]['code'], t('Inline JavaScript is correctly added to the footer.'));
+    $this->assertTrue(array_key_exists('misc/jquery.js', $javascript), t('jQuery is added when inline scripts are added.'));
+    $data = end($javascript);
+    $this->assertEqual($inline, $data['#data'], t('Inline JavaScript is correctly added to the footer.'));
   }
-  
+
   /**
    * Test drupal_get_js() with a footer scope.
    */
   function testFooterHTML() {
     $inline = '$(document).ready(function(){});';
-    drupal_add_js($inline, array('type' => 'inline', 'scope' => 'footer'));
+    drupal_add_js($inline, array('#type' => 'inline', '#scope' => 'footer'));
     $javascript = drupal_get_js('footer');
     $this->assertTrue(strpos($javascript, $inline) > 0, t('Rendered JavaScript footer returns the inline code.'));
   }
-  
+
   /**
    * Test drupal_add_js() sets preproccess to false when cache is set to false.
    */
   function testNoCache() {
-    drupal_add_js('misc/collapse.js', array('cache' => FALSE));
+    drupal_add_js('misc/collapse.js', array('#cache' => FALSE));
+    $javascript = drupal_add_js();
+    $this->assertFalse($javascript['misc/collapse.js']['#preprocess'], t('Setting cache to FALSE sets proprocess to FALSE when adding JavaScript.'));
+  }
+
+  /**
+   * Test adding a JavaScript file with a different weight.
+   */
+  function testDifferentWeight() {
+    drupal_add_js('misc/collapse.js', array('#weight' => JS_WEIGHT_THEME));
     $javascript = drupal_add_js();
-    $this->assertTrue(!$javascript['header']['module']['misc/collapse.js']['preprocess'], t('Setting cache to FALSE sets proprocess to FALSE when adding JavaScript.'));
+    $this->assertTrue(array_key_exists('misc/collapse.js', $javascript), t('Adding a JavaScript file with a different weight.'));
   }
 }
 
Index: modules/color/color.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/color/color.module,v
retrieving revision 1.49
diff -u -r1.49 color.module
--- modules/color/color.module	26 Oct 2008 18:06:38 -0000	1.49
+++ modules/color/color.module	31 Oct 2008 04:03:10 -0000
@@ -154,7 +154,7 @@
 
   // Add Farbtastic color picker.
   drupal_add_css('misc/farbtastic/farbtastic.css', array('preprocess' => FALSE));
-  drupal_add_js('misc/farbtastic/farbtastic.js');
+  drupal_add_js('misc/farbtastic/farbtastic.js', array('#weight' => JS_WEIGHT_LIBRARY));
 
   // Add custom CSS and JS.
   drupal_add_css($base . '/color.css', array('preprocess' => FALSE));
Index: modules/locale/locale.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/locale/locale.module,v
retrieving revision 1.230
diff -u -r1.230 locale.module
--- modules/locale/locale.module	22 Oct 2008 19:39:36 -0000	1.230
+++ modules/locale/locale.module	31 Oct 2008 04:03:10 -0000
@@ -522,20 +522,17 @@
   $javascript = drupal_add_js();
   $files = $new_files = FALSE;
 
-  foreach ($javascript as $scope) {
-    foreach ($scope as $type => $data) {
-      if ($type != 'setting' && $type != 'inline') {
-        foreach ($data as $filepath => $info) {
-          $files = TRUE;
-          if (!in_array($filepath, $parsed)) {
-            // Don't parse our own translations files.
-            if (substr($filepath, 0, strlen($dir)) != $dir) {
-              locale_inc_callback('_locale_parse_js_file', $filepath);
-              watchdog('locale', 'Parsed JavaScript file %file.', array('%file' => $filepath));
-              $parsed[] = $filepath;
-              $new_files = TRUE;
-            }
-          }
+  foreach ($javascript as $item) {
+    if ($item['#type'] == 'file') {
+      $files = TRUE;
+      $filepath = $item['#data'];
+      if (!in_array($filepath, $parsed)) {
+        // Don't parse our own translations files.
+        if (substr($filepath, 0, strlen($dir)) != $dir) {
+          locale_inc_callback('_locale_parse_js_file', $filepath);
+          watchdog('locale', 'Parsed JavaScript file %file.', array('%file' => $filepath));
+          $parsed[] = $filepath;
+          $new_files = TRUE;
         }
       }
     }
@@ -566,7 +563,7 @@
 
   // Add the translation JavaScript file to the page.
   if ($files && !empty($language->javascript)) {
-    drupal_add_js($dir . '/' . $language->language . '_' . $language->javascript . '.js', 'core');
+    drupal_add_js($dir . '/' . $language->language . '_' . $language->javascript . '.js');
   }
 }
 
Index: modules/system/system.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.admin.inc,v
retrieving revision 1.102
diff -u -r1.102 system.admin.inc
--- modules/system/system.admin.inc	16 Oct 2008 20:23:08 -0000	1.102
+++ modules/system/system.admin.inc	31 Oct 2008 04:03:10 -0000
@@ -1528,7 +1528,7 @@
  * @see system_date_time_settings_submit()
  */
 function system_date_time_settings() {
-  drupal_add_js(drupal_get_path('module', 'system') . '/system.js', 'module');
+  drupal_add_js(drupal_get_path('module', 'system') . '/system.js');
   drupal_add_js(array('dateTime' => array('lookup' => url('admin/settings/date-time/lookup'))), 'setting');
 
   // Date settings:
@@ -1736,7 +1736,7 @@
 
   if (!variable_get('clean_url', 0)) {
     if (strpos(request_uri(), '?q=') !== FALSE) {
-      drupal_add_js(drupal_get_path('module', 'system') . '/system.js', 'module');
+      drupal_add_js(drupal_get_path('module', 'system') . '/system.js');
 
       $form['clean_url']['#description'] .= ' <span>' . t('Before enabling clean URLs, you must perform a test to determine if your server is properly configured. If you are able to see this page again after clicking the "Run the clean URL test" link, the test has succeeded and the radio buttons above will be available. If instead you are directed to a "Page not found" error, you will need to change the configuration of your server. The <a href="@handbook">handbook page on Clean URLs</a> has additional troubleshooting information.', array('@handbook' => 'http://drupal.org/node/15365')) . '</span>';
 
Index: install.php
===================================================================
RCS file: /cvs/drupal/drupal/install.php,v
retrieving revision 1.138
diff -u -r1.138 install.php
--- install.php	29 Oct 2008 10:08:51 -0000	1.138
+++ install.php	31 Oct 2008 04:03:10 -0000
@@ -726,7 +726,7 @@
 
       // Add JavaScript validation.
       _user_password_dynamic_validation();
-      drupal_add_js(drupal_get_path('module', 'system') . '/system.js', 'module');
+      drupal_add_js(drupal_get_path('module', 'system') . '/system.js');
       // We add these strings as settings because JavaScript translation does not
       // work on install time.
       drupal_add_js(array('copyFieldValue' => array('edit-site-mail' => array('edit-account-mail')), 'cleanURL' => array('success' => st('Your server has been successfully tested to support this feature.'), 'failure' => st('Your system configuration does not currently support this feature. The <a href="http://drupal.org/node/15365">handbook page on Clean URLs</a> has additional troubleshooting information.'), 'testing' => st('Testing clean URLs...'))), 'setting');
