From c8ae2497b7e4c7393210ed186acd672a0040389f Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Wed, 03 Sep 2008 12:03:19 -0400
Subject: [PATCH] Auto-detect client language and timezone if desired by config/prefs

---
 program/include/rcube_template.php |   45 +++++++++++++++++++++++++++++----------------
 1 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/program/include/rcube_template.php b/program/include/rcube_template.php
index 6f146e0..847ea0d 100755
--- a/program/include/rcube_template.php
+++ b/program/include/rcube_template.php
@@ -299,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,
@@ -319,8 +316,6 @@
                 ), true, true);
             return false;
         }
-        $templ = fread($fp, filesize($path));
-        fclose($fp);
 
         // parse for specialtags
         $output = $this->parse_conditions($templ);
@@ -485,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);
     }
 
 
@@ -529,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;
@@ -659,7 +670,7 @@
      * @todo   Remove all inline JS calls and use jQuery instead.
      * @todo   Remove all sprintf()'s - they are pretty, but also slow.
      */
-    private function button($attrib)
+    public function button($attrib)
     {
         static $sa_buttons = array();
         static $s_button_count = 100;
@@ -911,6 +922,7 @@
         $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_tzone  = new html_hiddenfield(array('name' => '_timezone', 'id' => 'rcmlogintz', 'value' => '_default_'));
         $input_host   = null;
 
         if (is_array($default_host)) {
@@ -949,6 +961,7 @@
         }
 
         $out = $input_action->show();
+        $out .= $input_tzone->show();
         $out .= $table->show();
 
         // surround html output with a form tag

--
Gitblit v1.9.1