From 0e99d37a18cf81b549b8fc7e8948e9bd338deaad Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Mon, 01 Jun 2009 11:35:53 -0400
Subject: [PATCH] Use event system on the client to handle ajax callbacks

---
 program/js/common.js                  |    8 ++++----
 program/include/rcube_json_output.php |   13 +++++++++++--
 program/include/rcube_template.php    |    4 +++-
 program/js/app.js                     |    6 ++++++
 4 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/program/include/rcube_json_output.php b/program/include/rcube_json_output.php
index 2fbf9c0..cedc6bf 100644
--- a/program/include/rcube_json_output.php
+++ b/program/include/rcube_json_output.php
@@ -33,6 +33,7 @@
     private $env = array();
     private $texts = array();
     private $commands = array();
+    private $callbacks = array();
     private $message = null;
 
     public $type = 'js';
@@ -122,7 +123,12 @@
      */
     public function command()
     {
-        $this->commands[] = func_get_args();
+        $cmd = func_get_args();
+        
+        if (strpos($cmd[0], 'plugin.') === 0)
+          $this->callbacks[] = $cmd;
+        else
+          $this->commands[] = $cmd;
     }
     
     
@@ -227,8 +233,11 @@
         if (!empty($this->texts))
           $response['texts'] = $this->texts;
 
-        // send response code
+        // send function calls
         $response['exec'] = $this->get_js_commands() . $add;
+        
+        if (!empty($this->callbacks))
+          $response['callbacks'] = $this->callbacks;
 
         echo json_serialize($response);
     }
diff --git a/program/include/rcube_template.php b/program/include/rcube_template.php
index 42b642a..a358d0c 100755
--- a/program/include/rcube_template.php
+++ b/program/include/rcube_template.php
@@ -201,7 +201,9 @@
      */
     public function command()
     {
-        $this->js_commands[] = func_get_args();
+        $cmd = func_get_args();
+        if (strpos($cmd[0], 'plugin.') === false)
+          $this->js_commands[] = $cmd;
     }
 
 
diff --git a/program/js/app.js b/program/js/app.js
index 5e323e2..4f12e80 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -3923,6 +3923,12 @@
       console.log(response.exec);
       eval(response.exec);
     }
+    
+    // execute callback functions of plugins
+    if (response.callbacks && response.callbacks.length) {
+      for (var i=0; i < response.callbacks.length; i++)
+        this.triggerEvent(response.callbacks[i][0], response.callbacks[i][1]);
+    }
  
     // process the response data according to the sent action
     switch (response.action) {
diff --git a/program/js/common.js b/program/js/common.js
index 25b6546..1fd10c2 100644
--- a/program/js/common.js
+++ b/program/js/common.js
@@ -288,8 +288,8 @@
 {
   var ret, h;
   if (typeof e == 'undefined')
-    e = {};
-  if (typeof e == 'object')
+    e = this;
+  else if (typeof e == 'object')
     e.event = evt;
   
   if (this._events && this._events[evt] && !this._event_exec) {
@@ -297,9 +297,9 @@
     for (var i=0; i < this._events[evt].length; i++) {
       if ((h = this._events[evt][i])) {
         if (typeof h.func == 'function')
-          ret = h.func.call ? h.func.call(h.obj, this, e) : h.func(this, e);
+          ret = h.func.call ? h.func.call(h.obj, e) : h.func(e);
         else if (typeof h.obj[h.func] == 'function')
-          ret = h.obj[h.func](this, e);
+          ret = h.obj[h.func](e);
               
         // cancel event execution
         if (typeof ret != 'undefined' && !ret)

--
Gitblit v1.9.1