--- /dev/null
+Use json_encode to ensure compatibility with JQuery 1.4.\r
+\r
+Index: roundcubemail/program/include/rcube_template.php\r
+===================================================================\r
+--- roundcubemail/program/include/rcube_template.php (revision 2980)\r
++++ roundcubemail/program/include/rcube_template.php (revision 3170)\r
+@@ -415,10 +415,10 @@\r
+ $out = '';\r
+ if (!$this->framed && !empty($this->js_env)) {\r
+- $out .= JS_OBJECT_NAME . '.set_env('.json_serialize($this->js_env).");\n";\r
++ $out .= JS_OBJECT_NAME . '.set_env('.json_encode($this->js_env).");\n";\r
+ }\r
+ foreach ($this->js_commands as $i => $args) {\r
+ $method = array_shift($args);\r
+ foreach ($args as $i => $arg) {\r
+- $args[$i] = json_serialize($arg);\r
++ $args[$i] = json_encode($arg);\r
+ }\r
+ $parent = $this->framed || preg_match('/^parent\./', $method);\r
+Index: roundcubemail/program/include/rcube_shared.inc\r
+===================================================================\r
+--- roundcubemail/program/include/rcube_shared.inc (revision 3132)\r
++++ roundcubemail/program/include/rcube_shared.inc (revision 3170)\r
+@@ -106,95 +106,4 @@\r
+ exit;\r
+ }\r
+-}\r
+-\r
+-\r
+-/**\r
+- * Returns whether an $str is a reserved word for any of the version of Javascript or ECMAScript\r
+- * @param str String to check\r
+- * @return boolean True if $str is a reserver word, False if not\r
+- */\r
+-function is_js_reserved_word($str)\r
+-{\r
+- return in_array($str, array(\r
+- // ECMASript ver 4 reserved words\r
+- 'as','break','case','catch','class','const','continue',\r
+- 'default','delete','do','else','export','extends','false','finally','for','function',\r
+- 'if','import','in','instanceof','is','namespace','new','null','package','private',\r
+- 'public','return','super','switch','this','throw','true','try','typeof','use','var',\r
+- 'void','while','with',\r
+- // ECMAScript ver 4 future reserved words\r
+- 'abstract','debugger','enum','goto','implements','interface','native','protected',\r
+- 'synchronized','throws','transient','volatile',\r
+- // special meaning in some contexts\r
+- 'get','set',\r
+- // were reserved in ECMAScript ver 3\r
+- 'boolean','byte','char','double','final','float','int','long','short','static'\r
+- ));\r
+-}\r
+-\r
+-\r
+-/**\r
+- * Convert a variable into a javascript object notation\r
+- *\r
+- * @param mixed Input value\r
+- * @return string Serialized JSON string\r
+- */\r
+-function json_serialize($var)\r
+-{\r
+- if (is_object($var))\r
+- $var = get_object_vars($var);\r
+-\r
+- if (is_array($var))\r
+- {\r
+- // empty array\r
+- if (!sizeof($var))\r
+- return '[]';\r
+- else\r
+- {\r
+- $keys_arr = array_keys($var);\r
+- $is_assoc = $have_numeric = 0;\r
+-\r
+- for ($i=0; $i<sizeof($keys_arr); ++$i)\r
+- {\r
+- if (is_numeric($keys_arr[$i]))\r
+- $have_numeric = 1;\r
+- if (!is_numeric($keys_arr[$i]) || $keys_arr[$i] != $i)\r
+- $is_assoc = 1;\r
+- if ($is_assoc && $have_numeric)\r
+- break;\r
+- }\r
+- \r
+- $brackets = $is_assoc ? '{}' : '[]';\r
+- $pairs = array();\r
+-\r
+- foreach ($var as $key => $value)\r
+- {\r
+- // enclose key with quotes if it is not variable-name conform\r
+- if (!preg_match('/^[_a-zA-Z]{1}[_a-zA-Z0-9]*$/', $key) || is_js_reserved_word($key))\r
+- $key = "'$key'";\r
+-\r
+- $pairs[] = sprintf("%s%s", $is_assoc ? "$key:" : '', json_serialize($value));\r
+- }\r
+-\r
+- return $brackets{0} . implode(',', $pairs) . $brackets{1};\r
+- }\r
+- }\r
+- else if (!is_string($var) && strval(intval($var)) === strval($var))\r
+- return $var;\r
+- else if (is_bool($var))\r
+- return $var ? '1' : '0';\r
+- else\r
+- return "'".JQ($var)."'";\r
+-}\r
+-\r
+-\r
+-/**\r
+- * Function to convert an array to a javascript array\r
+- * Actually an alias function for json_serialize()\r
+- * @deprecated\r
+- */\r
+-function array2js($arr, $type='')\r
+-{\r
+- return json_serialize($arr);\r
+ }\r
+ \r
+Index: roundcubemail/program/include/rcube_json_output.php\r
+===================================================================\r
+--- roundcubemail/program/include/rcube_json_output.php (revision 2905)\r
++++ roundcubemail/program/include/rcube_json_output.php (revision 3170)\r
+@@ -240,5 +240,5 @@\r
+ $response['callbacks'] = $this->callbacks;\r
+ \r
+- echo json_serialize($response);\r
++ echo json_encode($response);\r
+ }\r
+ \r
+@@ -256,5 +256,5 @@\r
+ $method = array_shift($args);\r
+ foreach ($args as $i => $arg) {\r
+- $args[$i] = json_serialize($arg);\r
++ $args[$i] = json_encode($arg);\r
+ }\r
+ \r
+Index: roundcubemail/program/steps/mail/func.inc\r
+===================================================================\r
+--- roundcubemail/program/steps/mail/func.inc (revision 3099)\r
++++ roundcubemail/program/steps/mail/func.inc (revision 3170)\r
+@@ -523,5 +523,5 @@\r
+ if (is_array($quota)) {\r
+ $OUTPUT->add_script('$(document).ready(function(){\r
+- rcmail.set_quota('.json_serialize($quota).')});', 'foot');\r
++ rcmail.set_quota('.json_encode($quota).')});', 'foot');\r
+ $quota = '';\r
+ }\r
+Index: roundcubemail/program/steps/mail/compose.inc\r
+===================================================================\r
+--- roundcubemail/program/steps/mail/compose.inc (revision 3166)\r
++++ roundcubemail/program/steps/mail/compose.inc (revision 3170)\r
+@@ -507,5 +507,5 @@\r
+ JQ(Q(rcube_label('revertto'))),\r
+ JQ(Q(rcube_label('nospellerrors'))),\r
+- json_serialize($spellcheck_langs),\r
++ json_encode($spellcheck_langs),\r
+ $lang,\r
+ $attrib['id'],\r