From ade8e117dfbb62f6dbd16b4aca81dfbdbd054579 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Tue, 02 Sep 2008 03:42:46 -0400
Subject: [PATCH] Let rcmail class create address book instances

---
 program/include/rcube_template.php |  107 ++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 80 insertions(+), 27 deletions(-)

diff --git a/program/include/rcube_template.php b/program/include/rcube_template.php
index 2173784..ba73539 100755
--- a/program/include/rcube_template.php
+++ b/program/include/rcube_template.php
@@ -32,7 +32,6 @@
 {
     var $app;
     var $config;
-    var $task = '';
     var $framed = false;
     var $pagetitle = '';
     var $env = array();
@@ -56,7 +55,10 @@
         $this->config = $this->app->config->all();
         
         //$this->framed = $framed;
-        $this->task = $task;
+        $this->set_env('task', $task);
+
+        // load the correct skin (in case user-defined)
+        $this->set_skin($this->config['skin']);
 
         // add common javascripts
         $javascript = 'var '.JS_OBJECT_NAME.' = new rcube_webmail();';
@@ -103,6 +105,32 @@
         $this->pagetitle = $title;
     }
 
+    /**
+     * Set skin
+     */
+    public function set_skin($skin)
+    {
+        if (!empty($skin) && is_dir('skins/'.$skin) && is_readable('skins/'.$skin))
+            $skin_path = 'skins/'.$skin;
+        else
+            $skin_path = $this->config['skin_path'] ? $this->config['skin_path'] : 'skins/default';
+
+        $this->app->config->set('skin_path', $skin_path);
+        $this->config['skin_path'] = $skin_path;
+    }
+
+    /**
+     * Check if a specific template exists
+     *
+     * @param string Template name
+     * @return boolean True if template exists
+     */
+    public function template_exists($name)
+    {
+        $filename = $this->config['skin_path'] . '/templates/' . $name . '.html';
+
+        return (is_file($filename) && is_readable($filename));
+    }
 
     /**
      * Register a template object handler
@@ -190,13 +218,27 @@
      * @uses   self::$js_commands
      * @uses   self::$object_handlers
      */
-    public public function reset()
+    public function reset()
     {
         $this->env = array();
         $this->js_env = array();
         $this->js_commands = array();
         $this->object_handlers = array();
         parent::reset();
+    }
+
+
+    /**
+     * Redirect to a certain url
+     *
+     * @param mixed Either a string with the action or url parameters as key-value pairs
+     * @see rcmail::url()
+     */
+    public function redirect($p = array())
+    {
+        $location = $this->app->url($p);
+        header('Location: ' . $location);
+        exit;
     }
 
 
@@ -257,16 +299,13 @@
     private function parse($name = 'main', $exit = true)
     {
         $skin_path = $this->config['skin_path'];
-
-        // read template file
-        $templ = '';
         $path = "$skin_path/templates/$name.html";
 
-        if (($fp = fopen($path, 'r')) === false) {
-            $message = '';
+        // read template file
+	if (($templ = file_get_contents($path)) === false) {
             ob_start();
-            fopen($path, 'r');
-            $message.= ob_get_contents();
+            file_get_contents($path);
+            $message = ob_get_contents();
             ob_end_clean();
             raise_error(array(
                 'code' => 501,
@@ -277,8 +316,6 @@
                 ), true, true);
             return false;
         }
-        $templ = fread($fp, filesize($path));
-        fclose($fp);
 
         // parse for specialtags
         $output = $this->parse_conditions($templ);
@@ -443,11 +480,28 @@
      *
      * @param  string Input string to parse
      * @return string Altered input string
+     * @todo   Use DOM-parser to traverse template HTML
      * @todo   Maybe a cache.
      */
     private function parse_xml($input)
     {
-        return preg_replace('/<roundcube:([-_a-z]+)\s+([^>]+)>/Uie', "\$this->xml_command('\\1', '\\2')", $input);
+        return preg_replace_callback('/<roundcube:([-_a-z]+)\s+([^>]+)>/Ui', array($this, 'xml_command_callback'), $input);
+    }
+
+
+    /**
+     * This is a callback function for preg_replace_callback (see #1485286)
+     * It's only purpose is to reconfigure parameters for xml_command, so that the signature isn't disturbed
+     */
+    private function xml_command_callback($matches)
+    {
+        $str_attrib = isset($matches[2]) ? $matches[2] : '';
+        $add_attrib = isset($matches[3]) ? $matches[3] : array();
+
+        $command = $matches[1];
+        //matches[0] is the entire matched portion of the string
+
+        return $this->xml_command($command, $str_attrib, $add_attrib);
     }
 
 
@@ -487,14 +541,13 @@
             // include a file
             case 'include':
                 $path = realpath($this->config['skin_path'].$attrib['file']);
-                if ($fsize = filesize($path)) {
+                if (is_readable($path)) {
                     if ($this->config['skin_include_php']) {
                         $incl = $this->include_php($path);
                     }
-                    else if ($fp = fopen($path, 'r')) {
-                        $incl = fread($fp, $fsize);
-                        fclose($fp);
-                    }
+                    else {
+		        $incl = file_get_contents($path);
+		    }
                     return $this->parse_xml($incl);
                 }
                 break;
@@ -542,7 +595,7 @@
                     return $ver;
                 }
                 if ($object=='pagetitle') {
-                    $task  = $this->task;
+                    $task  = $this->env['task'];
                     $title = !empty($this->config['product_name']) ? $this->config['product_name'].' :: ' : '';
 
                     if (!empty($this->pagetitle)) {
@@ -760,7 +813,7 @@
                 array(
                     'style', 'class', 'id', 'width',
                     'height', 'border', 'hspace',
-                    'vspace', 'align', 'alt',
+                    'vspace', 'align', 'alt', 'tabindex'
                 )
             );
             $btn_content = sprintf('<img src="%s"%s />', $this->abs_url($attrib['image']), $attrib_str);
@@ -771,7 +824,7 @@
         }
         else if ($attrib['type']=='link') {
             $btn_content = $attrib['label'] ? $attrib['label'] : $attrib['command'];
-            $link_attrib = array('href', 'onclick', 'title', 'id', 'class', 'style');
+            $link_attrib = array('href', 'onclick', 'title', 'id', 'class', 'style', 'tabindex');
         }
         else if ($attrib['type']=='input') {
             $attrib['type'] = 'button';
@@ -784,7 +837,7 @@
                 $attrib,
                 array(
                     'type', 'value', 'onclick',
-                    'id', 'class', 'style'
+                    'id', 'class', 'style', 'tabindex'
                 )
             );
             $out = sprintf('<input%s disabled="disabled" />', $attrib_str);
@@ -866,8 +919,8 @@
 
         $_SESSION['temp'] = true;
 
-        $input_user   = new html_inputfield(array('name' => '_user', 'id' => 'rcmloginuser', 'size' => 30, 'autocomplete' => 'off'));
-        $input_pass   = new html_passwordfield(array('name' => '_pass', 'id' => 'rcmloginpwd', 'size' => 30));
+        $input_user   = new html_inputfield(array('name' => '_user', 'id' => 'rcmloginuser', 'size' => 30) + $attrib);
+        $input_pass   = new html_passwordfield(array('name' => '_pass', 'id' => 'rcmloginpwd', 'size' => 30) + $attrib);
         $input_action = new html_hiddenfield(array('name' => '_action', 'value' => 'login'));
         $input_host   = null;
 
@@ -884,7 +937,7 @@
                 }
             }
         }
-        else if (!strlen($default_host)) {
+        else if (empty($default_host)) {
             $input_host = new html_inputfield(array('name' => '_host', 'id' => 'rcmloginhost', 'size' => 30));
         }
 
@@ -895,7 +948,7 @@
         $table = new html_table(array('cols' => 2));
 
         $table->add('title', html::label('rcmloginuser', Q(rcube_label('username'))));
-        $table->add(null, $input_user->show(get_input_value('_user', RCUVE_INPUT_POST)));
+        $table->add(null, $input_user->show(get_input_value('_user', RCUBE_INPUT_POST)));
 
         $table->add('title', html::label('rcmloginpwd', Q(rcube_label('password'))));
         $table->add(null, $input_pass->show());
@@ -903,7 +956,7 @@
         // add host selection row
         if (is_object($input_host)) {
             $table->add('title', html::label('rcmloginhost', Q(rcube_label('server'))));
-            $table->add(null, $input_host->show(get_input_value('_host', RCUVE_INPUT_POST)));
+            $table->add(null, $input_host->show(get_input_value('_host', RCUBE_INPUT_POST)));
         }
 
         $out = $input_action->show();

--
Gitblit v1.9.1