]> git.donarmstrong.com Git - roundcube.git/blobdiff - program/include/rcube_json_output.php
Imported Upstream version 0.2~alpha
[roundcube.git] / program / include / rcube_json_output.php
diff --git a/program/include/rcube_json_output.php b/program/include/rcube_json_output.php
new file mode 100644 (file)
index 0000000..a633f85
--- /dev/null
@@ -0,0 +1,241 @@
+<?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($task)
+    {
+        $this->task   = $task;
+        $this->config = rcmail::get_instance()->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)
+    {
+       $name = $this->config->get('product_name');
+       $this->command('set_pagetitle', JQ(empty($name) ? $title : $name.' :: '.$title));
+    }
+
+    /**
+     * @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_label($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_label(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 = '';
+       
+       if (sizeof($this->env))
+           $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;
+    }
+}
+
+