? autocomplete.html
? content_type.php
? d_13.patch.txt
? d_17.patch.txt
? js.po
? patches
? temp
? test.php
? misc/autofocus.js
? misc/date.js
? misc/dependencies.js
? modules/tree2
? modules/user/access_control.js
? sites/all/modules
Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.619
diff -u -d -F^\s*function -r1.619 common.inc
--- includes/common.inc	8 Mar 2007 19:33:55 -0000	1.619
+++ includes/common.inc	10 Mar 2007 12:31:38 -0000
@@ -1748,13 +1748,59 @@ function drupal_get_js($scope = 'header'
  * Converts a PHP variable into its Javascript equivalent.
  *
  * We use HTML-safe strings, i.e. with <, > and & escaped.
+ *
+ * @parameter $var
+ *   The variable that should be converted to a JavaScript compatible variable.
+ *   If you pass in the plain variable, the type of the variable is determined
+ *   automatically. If you want to specify the type of the variable or passing
+ *   a value that should be treated differently, you can use the advanced
+ *   notation:
+ *
+ *     array(
+ *       '#type' => 'function',
+ *       '#value' => 'function(x) { alert(x); }'
+ *     );
+ *
+ *     array(
+ *       '#type' => 'regex',
+ *       '#value' => '/^(hello\\s+world)!?$/i',
+ *     );
+ *
+ *   Allowed values for the type field are boolean, integer, double, function,
+ *   regex, string, array and object. If you specify another type, it will be
+ *   null.
+ *
+ *   Note that arrays in JavaScript differ from those in PHP: JavaScript arrays
+ *   can only have sequential numeric indices. If you don't specify manually
+ *   that the PHP array should be a JavaScript array, it is converted to an
+ *   object (which allows string indices) when the keys of the array are not
+ *   sequential whole numbers starting with 0.
+ * @return
+ *   The converted variable.
  */
 function drupal_to_js($var) {
-  switch (gettype($var)) {
+  // Determine the type of the variable
+  if (isset($var['#type']) && isset($var['#value']) && count($var) == 2) {
+    $type = $var['#type'];
+    $var = $var['#value'];
+  }
+  else {
+    $type = gettype($var);
+    // Arrays in JSON can't be associative. If the array is not empty or if it
+    // doesn't have sequential whole number keys starting with 0, it's associative
+    // and we need to convert this into an object instead of an array.
+    if ($type == 'array' && (!empty($var) && array_keys($var) !== range(0, sizeof($var) - 1))) {
+      $type = 'object';
+    }
+  }
+
+  switch ($type) {
     case 'boolean':
       return $var ? 'true' : 'false'; // Lowercase necessary!
     case 'integer':
     case 'double':
+    case 'function':
+    case 'regex':
       return $var;
     case 'resource':
     case 'string':
@@ -1762,17 +1808,11 @@ function drupal_to_js($var) {
                               array('\r', '\n', '\x3c', '\x3e', '\x26'),
                               addslashes($var)) .'"';
     case 'array':
-      // Arrays in JSON can't be associative. If the array is empty or if it
-      // has sequential whole number keys starting with 0, it's not associative
-      // so we can go ahead and convert it as an array.
-      if (empty ($var) || array_keys($var) === range(0, sizeof($var) - 1)) {
-        $output = array();
-        foreach ($var as $v) {
-          $output[] = drupal_to_js($v);
-        }
-        return '[ '. implode(', ', $output) .' ]';
+      $output = array();
+      foreach ($var as $v) {
+        $output[] = drupal_to_js($v);
       }
-      // Otherwise, fall through to convert the array as an object.
+      return '[ '. implode(', ', $output) .' ]';
     case 'object':
       $output = array();
       foreach ($var as $k => $v) {
