summaryrefslogtreecommitdiff
path: root/program/include/rcube_output_html.php
diff options
context:
space:
mode:
Diffstat (limited to 'program/include/rcube_output_html.php')
-rw-r--r--program/include/rcube_output_html.php83
1 files changed, 56 insertions, 27 deletions
diff --git a/program/include/rcube_output_html.php b/program/include/rcube_output_html.php
index d42171869..ac07d58e9 100644
--- a/program/include/rcube_output_html.php
+++ b/program/include/rcube_output_html.php
@@ -206,6 +206,31 @@ class rcube_output_html extends rcube_output
/**
+ * Find the given file in the current skin path stack
+ *
+ * @param string File name/path to resolve (starting with /)
+ * @param string Reference to the base path of the matching skin
+ * @param string Additional path to search in
+ * @return mixed Relative path to the requested file or False if not found
+ */
+ public function get_skin_file($file, &$skin_path, $add_path = null)
+ {
+ $skin_paths = $this->skin_paths;
+ if ($add_path)
+ array_unshift($skin_paths, $add_path);
+
+ foreach ($skin_paths as $skin_path) {
+ $path = realpath($skin_path . $file);
+ if (is_file($path)) {
+ return $skin_path . $file;
+ }
+ }
+
+ return false;
+ }
+
+
+ /**
* Register a GUI object to the client script
*
* @param string Object name
@@ -401,13 +426,13 @@ class rcube_output_html extends rcube_output
// 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->dir . $plugin . '/' . $skin_path;
+ $plugin_skin_paths[] = $this->app->plugins->url . $plugin . '/' . $skin_path;
}
// add fallback to default skin
if (is_dir($this->app->plugins->dir . $plugin . '/skins/default')) {
$skin_dir = $plugin . '/skins/default';
- $plugin_skin_paths[] = $this->app->plugins->dir . $skin_dir;
+ $plugin_skin_paths[] = $this->app->plugins->url . $skin_dir;
}
// add plugin skin paths to search list
@@ -432,7 +457,7 @@ class rcube_output_html extends rcube_output
if (is_readable($path)) {
$this->config->set('skin_path', $skin_path);
- $this->base_path = $skin_path;
+ $this->base_path = preg_replace('!plugins/\w+/!', '', $skin_path); // set base_path to core skin directory (not plugin's skin)
break;
}
else {
@@ -469,8 +494,6 @@ class rcube_output_html extends rcube_output
$output = $hook['content'];
unset($hook['content']);
- $output = $this->parse_with_globals($this->fix_paths($output));
-
// make sure all <form> tags have a valid request token
$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);
@@ -536,12 +559,17 @@ class rcube_output_html extends rcube_output
* Make URLs starting with a slash point to skin directory
*
* @param string Input string
+ * @param boolean True if URL should be resolved using the current skin path stack
* @return string
*/
- public function abs_url($str)
+ public function abs_url($str, $search_path = false)
{
- if ($str[0] == '/')
+ if ($str[0] == '/') {
+ if ($search_path && ($file_url = $this->get_skin_file($str, $skin_path)))
+ return $file_url;
+
return $this->base_path . $str;
+ }
else
return $str;
}
@@ -825,15 +853,9 @@ class rcube_output_html extends rcube_output
// include a file
case 'include':
$old_base_path = $this->base_path;
- $skin_paths = $this->skin_paths;
- if ($attrib['skin_path'])
- array_unshift($skin_paths, $attrib['skin_path']);
- foreach ($skin_paths as $skin_path) {
- $path = realpath($skin_path . $attrib['file']);
- if (is_file($path)) {
- $this->base_path = $skin_path;
- break;
- }
+ if ($path = $this->get_skin_file($attrib['file'], $skin_path, $attrib['skinpath'])) {
+ $this->base_path = preg_replace('!plugins/\w+/!', '', $skin_path); // set base_path to core skin directory (not plugin's skin)
+ $path = realpath($path);
}
if (is_readable($path)) {
@@ -1065,7 +1087,7 @@ class rcube_output_html extends rcube_output
// make valid href to specific buttons
if (in_array($attrib['command'], rcmail::$main_tasks)) {
$attrib['href'] = $this->app->url(array('task' => $attrib['command']));
- $attrib['onclick'] = sprintf("%s.command('switch-task','%s',null,event); return false", rcmail::JS_OBJECT_NAME, $attrib['command']);
+ $attrib['onclick'] = sprintf("return %s.command('switch-task','%s',this,event)", rcmail::JS_OBJECT_NAME, $attrib['command']);
}
else if ($attrib['task'] && in_array($attrib['task'], rcmail::$main_tasks)) {
$attrib['href'] = $this->app->url(array('action' => $attrib['command'], 'task' => $attrib['task']));
@@ -1333,6 +1355,8 @@ class rcube_output_html extends rcube_output
$output = substr_replace($output, $css, $pos, 0);
}
+ $output = $this->parse_with_globals($this->fix_paths($output));
+
// trigger hook with final HTML content to be sent
$hook = $this->app->plugins->exec_hook("send_page", array('content' => $output));
if (!$hook['abort']) {
@@ -1350,21 +1374,25 @@ class rcube_output_html extends rcube_output
* Returns iframe object, registers some related env variables
*
* @param array $attrib HTML attributes
- *
+ * @param boolean $is_contentframe Register this iframe as the 'contentframe' gui object
* @return string IFRAME element
*/
- public function frame($attrib)
+ public function frame($attrib, $is_contentframe = false)
{
+ static $idcount = 0;
+
if (!$attrib['id']) {
- $attrib['id'] = 'rcmframe';
+ $attrib['id'] = 'rcmframe' . ++$idcount;
}
- if (!$attrib['name']) {
- $attrib['name'] = $attrib['id'];
- }
+ $attrib['name'] = $attrib['id'];
+ $attrib['src'] = $attrib['src'] ? $this->abs_url($attrib['src'], true) : 'program/resources/blank.gif';
- $this->set_env('contentframe', $attrib['id']);
- $this->set_env('blankpage', $attrib['src'] ? $this->abs_url($attrib['src']) : 'program/resources/blank.gif');
+ // register as 'contentframe' object
+ if ($is_contentframe || $attrib['contentframe']) {
+ $this->set_env('contentframe', $attrib['contentframe'] ? $attrib['contentframe'] : $attrib['name']);
+ $this->set_env('blankpage', $attrib['src']);
+ }
return html::iframe($attrib);
}
@@ -1493,7 +1521,6 @@ class rcube_output_html extends rcube_output
$input_task = new html_hiddenfield(array('name' => '_task', 'value' => 'login'));
$input_action = new html_hiddenfield(array('name' => '_action', 'value' => 'login'));
$input_tzone = new html_hiddenfield(array('name' => '_timezone', 'id' => 'rcmlogintz', 'value' => '_default_'));
- $input_dst = new html_hiddenfield(array('name' => '_dstactive', 'id' => 'rcmlogindst', 'value' => '_default_'));
$input_url = new html_hiddenfield(array('name' => '_url', 'id' => 'rcmloginurl', 'value' => $url));
$input_user = new html_inputfield(array('name' => '_user', 'id' => 'rcmloginuser')
+ $attrib + $user_attrib);
@@ -1545,7 +1572,6 @@ class rcube_output_html extends rcube_output
$out = $input_task->show();
$out .= $input_action->show();
$out .= $input_tzone->show();
- $out .= $input_dst->show();
$out .= $input_url->show();
$out .= $table->show();
@@ -1558,6 +1584,9 @@ class rcube_output_html extends rcube_output
$out = $this->form_tag(array('name' => $form_name, 'method' => 'post'), $out);
}
+ // include script for timezone detection
+ $this->include_script('jstz.min.js');
+
return $out;
}