Aleksander Machniak
2014-11-28 cf7471eb8608740a02b8ef3d1ca4899096e028fc
program/include/rcmail_output_html.php
@@ -187,6 +187,8 @@
            $valid = !$skin;
        }
        $skin_path = rtrim($skin_path, '/');
        $this->config->set('skin_path', $skin_path);
        $this->base_path = $skin_path;
@@ -419,15 +421,6 @@
     */
    public function write($template = '')
    {
        // unlock interface after iframe load
        $unlock = preg_replace('/[^a-z0-9]/i', '', $_REQUEST['_unlock']);
        if ($this->framed) {
            array_unshift($this->js_commands, array('iframe_loaded', $unlock));
        }
        else if ($unlock) {
            array_unshift($this->js_commands, array('hide_message', $unlock));
        }
        if (!empty($this->script_files)) {
            $this->set_env('request_token', $this->app->get_request_token());
        }
@@ -439,6 +432,8 @@
        if ($framed) {
            $this->scripts      = array();
            $this->script_files = array();
            $this->header       = '';
            $this->footer       = '';
        }
        // write all javascript commands
@@ -467,6 +462,8 @@
    {
        $plugin   = false;
        $realname = $name;
        $plugin_skin_paths = array();
        $this->template_name = $realname;
        $temp = explode('.', $name, 2);
@@ -476,7 +473,6 @@
            $skin_dir = $plugin . '/skins/' . $this->config->get('skin');
            // apply skin search escalation list to plugin directory
            $plugin_skin_paths = array();
            foreach ($this->skin_paths as $skin_path) {
                $plugin_skin_paths[] = $this->app->plugins->url . $plugin . '/' . $skin_path;
            }
@@ -487,7 +483,7 @@
                $plugin_skin_paths[] = $this->app->plugins->url . $skin_dir;
            }
            // add plugin skin paths to search list
            // prepend plugin skin paths to search list
            $this->skin_paths = array_merge($plugin_skin_paths, $this->skin_paths);
        }
@@ -530,6 +526,8 @@
                'file' => __FILE__,
                'message' => 'Error loading template for '.$realname
                ), true, $write);
            $this->skin_paths = array_slice($this->skin_paths, count($plugin_skin_paths));
            return false;
        }
@@ -554,6 +552,9 @@
        $output = preg_replace_callback('/<form\s+([^>]+)>/Ui', array($this, 'alter_form_tag'), $output);
        $this->footer = preg_replace_callback('/<form\s+([^>]+)>/Ui', array($this, 'alter_form_tag'), $this->footer);
        // remove plugin skin paths from current context
        $this->skin_paths = array_slice($this->skin_paths, count($plugin_skin_paths));
        if (!$write) {
            return $output;
        }
@@ -572,18 +573,31 @@
     */
    protected function get_js_commands(&$framed = null)
    {
        if (!$this->framed && !empty($this->js_env)) {
            $this->command('set_env', $this->js_env);
        }
        if (!empty($this->js_labels)) {
            $this->command('add_label', $this->js_labels);
        }
        $out = '';
        $out             = '';
        $parent_commands = 0;
        $top_commands    = array();
        foreach ($this->js_commands as $i => $args) {
        // these should be always on top,
        // e.g. hide_message() below depends on env.framed
        if (!$this->framed && !empty($this->js_env)) {
            $top_commands[] = array('set_env', $this->js_env);
        }
        if (!empty($this->js_labels)) {
            $top_commands[] = array('add_label', $this->js_labels);
        }
        // unlock interface after iframe load
        $unlock = preg_replace('/[^a-z0-9]/i', '', $_REQUEST['_unlock']);
        if ($this->framed) {
            $top_commands[] = array('iframe_loaded', $unlock);
        }
        else if ($unlock) {
            $top_commands[] = array('hide_message', $unlock);
        }
        $commands = array_merge($top_commands, $this->js_commands);
        foreach ($commands as $i => $args) {
            $method = array_shift($args);
            $parent = $this->framed || preg_match('/^parent\./', $method);
@@ -604,7 +618,7 @@
            $out .= sprintf("%s(%s);\n", $method, implode(',', $args));
        }
        $framed = $parent_prefix && $parent_commands == count($this->js_commands);
        $framed = $parent_prefix && $parent_commands == count($commands);
        // make the output more compact if all commands go to parent window
        if ($framed) {
@@ -921,16 +935,16 @@
                    $attrib['name'] = $this->eval_expression($attrib['expression']);
                if ($attrib['name'] || $attrib['command']) {
                    // @FIXME: 'noshow' is useless, remove?
                    if ($attrib['noshow']) {
                        return '';
                    }
                    $vars = $attrib + array('product' => $this->config->get('product_name'));
                    unset($vars['name'], $vars['command']);
                    $label   = $this->app->gettext($attrib + array('vars' => $vars));
                    $quoting = !empty($attrib['quoting']) ? strtolower($attrib['quoting']) : (rcube_utils::get_boolean((string)$attrib['html']) ? 'no' : '');
                    // 'noshow' can be used in skins to define new labels
                    if ($attrib['noshow']) {
                        return '';
                    }
                    switch ($quoting) {
                        case 'no':
@@ -1133,7 +1147,8 @@
     */
    public function button($attrib)
    {
        static $s_button_count = 100;
        static $s_button_count   = 100;
        static $disabled_actions = null;
        // these commands can be called directly via url
        $a_static_commands = array('compose', 'list', 'preferences', 'folders', 'identities');
@@ -1142,9 +1157,14 @@
            return '';
        }
        // try to find out the button type
        if ($attrib['type']) {
            $attrib['type'] = strtolower($attrib['type']);
            if ($pos = strpos($attrib['type'], '-menuitem')) {
                $attrib['type'] = substr($attrib['type'], 0, -9);
                $menuitem = true;
            }
        }
        else {
            $attrib['type'] = ($attrib['image'] || $attrib['imagepas'] || $attrib['imageact']) ? 'image' : 'link';
@@ -1152,8 +1172,21 @@
        $command = $attrib['command'];
        if ($attrib['task'])
          $command = $attrib['task'] . '.' . $command;
        if ($attrib['task']) {
            $element = $command = $attrib['task'] . '.' . $command;
        }
        else {
            $element = ($this->env['task'] ? $this->env['task'] . '.' : '') . $command;
        }
        if ($disabled_actions === null) {
            $disabled_actions = (array) $this->config->get('disabled_actions');
        }
        // remove buttons for disabled actions
        if (in_array($element, $disabled_actions)) {
            return '';
        }
        if (!$attrib['image']) {
            $attrib['image'] = $attrib['imagepas'] ? $attrib['imagepas'] : $attrib['imageact'];
@@ -1286,6 +1319,11 @@
            $out = html::tag($attrib['wrapper'], null, $out);
        }
        if ($menuitem) {
            $class = $attrib['menuitem-class'] ? ' class="' . $attrib['menuitem-class'] . '"' : '';
            $out   = '<li role="menuitem"' . $class . '>' . $out . '</li>';
        }
        return $out;
    }