summaryrefslogtreecommitdiff
path: root/program/include/rcube_json_output.php
diff options
context:
space:
mode:
Diffstat (limited to 'program/include/rcube_json_output.php')
-rw-r--r--program/include/rcube_json_output.php237
1 files changed, 237 insertions, 0 deletions
diff --git a/program/include/rcube_json_output.php b/program/include/rcube_json_output.php
new file mode 100644
index 000000000..6bf4f8a2a
--- /dev/null
+++ b/program/include/rcube_json_output.php
@@ -0,0 +1,237 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_json_output.php |
+ | |
+ | This file is part of the RoundCube Webmail client |
+ | Copyright (C) 2008, RoundCube Dev. - Switzerland |
+ | Licensed under the GNU GPL |
+ | |
+ | PURPOSE: |
+ | Class to handle HTML page output using a skin template. |
+ | Extends rcube_html_page class from rcube_shared.inc |
+ | |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com> |
+ +-----------------------------------------------------------------------+
+
+ $Id: $
+
+*/
+
+
+/**
+ * View class to produce JSON responses
+ *
+ * @package View
+ */
+class rcube_json_output
+{
+ private $config;
+ private $charset = 'UTF-8';
+ private $env = array();
+ private $texts = array();
+ private $commands = array();
+
+ public $task = '';
+ public $ajax_call = true;
+
+
+ /**
+ * Constructor
+ */
+ public function __construct(&$config, $task)
+ {
+ $this->task = $task;
+ $this->config = $config;
+ }
+
+
+ /**
+ * Set environment variable
+ *
+ * @param string Property name
+ * @param mixed Property value
+ */
+ public function set_env($name, $value)
+ {
+ $this->env[$name] = $value;
+ }
+
+ /**
+ * @ignore
+ */
+ public function set_pagetitle($title)
+ {
+ // ignore
+ }
+
+ /**
+ * @ignore
+ */
+ function set_charset($charset)
+ {
+ // ignore: $this->charset = $charset;
+ }
+
+
+ /**
+ * Get charset for output
+ *
+ * @return string Output charset
+ */
+ function get_charset()
+ {
+ return $this->charset;
+ }
+
+
+ /**
+ * Register a template object handler
+ *
+ * @param string Object name
+ * @param string Function name to call
+ * @return void
+ */
+ public function add_handler($obj, $func)
+ {
+ // ignore
+ }
+
+ /**
+ * Register a list of template object handlers
+ *
+ * @param array Hash array with object=>handler pairs
+ * @return void
+ */
+ public function add_handlers($arr)
+ {
+ // ignore
+ }
+
+
+ /**
+ * Call a client method
+ *
+ * @param string Method to call
+ * @param ... Additional arguments
+ */
+ public function command()
+ {
+ $this->commands[] = func_get_args();
+ }
+
+
+ /**
+ * Add a localized label to the client environment
+ */
+ public function add_label()
+ {
+ $arg_list = func_get_args();
+ foreach ($arg_list as $i => $name) {
+ $this->texts[$name] = rcube::gettext($name);
+ }
+ }
+
+
+ /**
+ * Invoke display_message command
+ *
+ * @param string Message to display
+ * @param string Message type [notice|confirm|error]
+ * @param array Key-value pairs to be replaced in localized text
+ * @uses self::command()
+ */
+ public function show_message($message, $type='notice', $vars=null)
+ {
+ $this->command(
+ 'display_message',
+ rcube::gettext(array('name' => $message, 'vars' => $vars)),
+ $type
+ );
+ }
+
+ /**
+ * Delete all stored env variables and commands
+ */
+ public public function reset()
+ {
+ $this->env = array();
+ $this->texts = array();
+ $this->commands = array();
+ }
+
+
+ /**
+ * Send an AJAX response to the client.
+ */
+ public function send()
+ {
+ $this->remote_response();
+ exit;
+ }
+
+
+ /**
+ * Send an AJAX response with executable JS code
+ *
+ * @param string Additional JS code
+ * @param boolean True if output buffer should be flushed
+ * @return void
+ * @deprecated
+ */
+ public function remote_response($add='', $flush=false)
+ {
+ static $s_header_sent = false;
+
+ if (!$s_header_sent) {
+ $s_header_sent = true;
+ send_nocacheing_headers();
+ header('Content-Type: application/x-javascript; charset=' . $this->get_charset());
+ print '/** ajax response ['.date('d/M/Y h:i:s O')."] **/\n";
+ }
+
+ // unset default env vars
+ unset($this->env['task'], $this->env['action'], $this->env['comm_path']);
+
+ // send response code
+ echo $this->get_js_commands() . $add;
+
+ // flush the output buffer
+ if ($flush)
+ flush();
+ }
+
+
+ /**
+ * Return executable javascript code for all registered commands
+ *
+ * @return string $out
+ */
+ private function get_js_commands()
+ {
+ $out = 'this.set_env('.json_serialize($this->env).");\n";
+
+ foreach($this->texts as $name => $text) {
+ $out .= sprintf("this.add_label('%s', '%s');\n", $name, JQ($text));
+ }
+
+ foreach ($this->commands as $i => $args) {
+ $method = array_shift($args);
+ foreach ($args as $i => $arg) {
+ $args[$i] = json_serialize($arg);
+ }
+
+ $out .= sprintf(
+ "this.%s(%s);\n",
+ preg_replace('/^parent\./', '', $method),
+ implode(',', $args)
+ );
+ }
+
+ return $out;
+ }
+}
+
+