alecpl
2008-08-20 6f488bb55f08d64bbdd5255079a24501e55e6851
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);
@@ -447,7 +484,32 @@
     */
    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)
    {
   if (isset($matches[2])) {
       $str_attrib = $matches[2];
   } else {
       $str_attrib = '';
   }
   if (isset($matches[3])) {
       $add_attrib = $matches[3];
   } else {
       $add_attrib = 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 +549,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;
@@ -534,10 +595,15 @@
                    return Q($name);
                }
                if ($object=='version') {
                    return (string)RCMAIL_VERSION;
                    $ver = (string)RCMAIL_VERSION;
                    if (is_file(INSTALL_PATH . '.svn/entries')) {
                        if (preg_match('/Revision:\s(\d+)/', @shell_exec('svn info'), $regs))
                          $ver .= ' [SVN r'.$regs[1].']';
                    }
                    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)) {
@@ -755,7 +821,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);
@@ -766,7 +832,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';
@@ -779,7 +845,7 @@
                $attrib,
                array(
                    'type', 'value', 'onclick',
                    'id', 'class', 'style'
                    'id', 'class', 'style', 'tabindex'
                )
            );
            $out = sprintf('<input%s disabled="disabled" />', $attrib_str);
@@ -861,8 +927,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;
@@ -879,7 +945,7 @@
                }
            }
        }
        else if (!strlen($default_host)) {
        else if (empty($default_host)) {
            $input_host = new html_inputfield(array('name' => '_host', 'id' => 'rcmloginhost', 'size' => 30));
        }
@@ -890,7 +956,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());
@@ -898,7 +964,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();