Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.824
diff -u -r1.824 common.inc
--- includes/common.inc	11 Nov 2008 22:39:58 -0000	1.824
+++ includes/common.inc	11 Nov 2008 23:48:55 -0000
@@ -2102,7 +2102,9 @@
  * performed using this function:
  *
  * - Add a file ('file'):
- *   Adds a reference to a JavaScript file to the page.
+ *   Adds a reference to a JavaScript file to the page. This must either be
+ *   relative to base_path(), or the absolute path to a JavaScript file hosted
+ *   externally.
  *
  * - Add inline JavaScript code ('inline'):
  *   Executes a piece of JavaScript code on the current page by placing the code
@@ -2123,11 +2125,13 @@
  *   drupal_add_js('$(document).ready(function(){alert("Hello!");});',
  *     array('type' => 'inline', 'scope' => 'footer', 'weight' => 5)
  *   );
+ *   drupal_add_js('http://yui.yahooapis.com/2.6.0/build/utilities/utilities.js');
  * @endcode
  *
  * @param $data
  *   (optional) If given, the value depends on the $options parameter:
- *   - 'file': Path to the file relative to base_path().
+ *   - 'file': Path to the file relative to base_path(), or the absolute path
+ *       to a JavaScript file hosted externally.
  *   - '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. All modules should wrap
@@ -2337,11 +2341,17 @@
         break;
 
       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";
+        // External scripts are embedded straight on the page.
+        if (valid_url($item['data'], TRUE)) {
+          $no_preprocess .= '<script type="text/javascript"' . ($item['defer'] ? ' defer="defer"' : '') . ' src="' . $item['data'] . "\"></script>\n";
         }
         else {
-          $files[$item['data']] = $item;
+          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;
     }
