From 7c2d30b2e106a23fe2ab295f7dc2e628e4d828bb Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Wed, 13 Aug 2008 07:39:10 -0400
Subject: [PATCH] #1485170: fixed splitter under Firefox3
---
program/include/rcube_template.php | 192 ++++++++++++++++++++++++++++++------------------
1 files changed, 120 insertions(+), 72 deletions(-)
diff --git a/program/include/rcube_template.php b/program/include/rcube_template.php
index 59dfa29..fb65411 100755
--- a/program/include/rcube_template.php
+++ b/program/include/rcube_template.php
@@ -30,8 +30,8 @@
*/
class rcube_template extends rcube_html_page
{
+ var $app;
var $config;
- var $task = '';
var $framed = false;
var $pagetitle = '';
var $env = array();
@@ -45,13 +45,20 @@
* Constructor
*
* @todo Use jQuery's $(document).ready() here.
+ * @todo Replace $this->config with the real rcube_config object
*/
- public function __construct(&$config, $task)
+ public function __construct($task, $framed = false)
{
parent::__construct();
- $this->task = $task;
- $this->config = $config;
+ $this->app = rcmail::get_instance();
+ $this->config = $this->app->config->all();
+
+ //$this->framed = $framed;
+ $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();';
@@ -98,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
@@ -185,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;
}
@@ -252,18 +299,15 @@
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();
- rcube_error::raise(array(
+ raise_error(array(
'code' => 501,
'type' => 'php',
'line' => __LINE__,
@@ -272,8 +316,6 @@
), true, true);
return false;
}
- $templ = fread($fp, filesize($path));
- fclose($fp);
// parse for specialtags
$output = $this->parse_conditions($templ);
@@ -348,7 +390,7 @@
*/
private function parse_with_globals($input)
{
- $GLOBALS['__comm_path'] = Q($GLOBALS['COMM_PATH']);
+ $GLOBALS['__comm_path'] = Q($this->app->comm_path);
return preg_replace('/\$(__[a-z0-9_\-]+)/e', '$GLOBALS["\\1"]', $input);
}
@@ -391,7 +433,7 @@
}
return $matches[0] . $this->parse_conditions($result);
}
- rcube_error::raise(array(
+ raise_error(array(
'code' => 500,
'type' => 'php',
'line' => __LINE__,
@@ -482,14 +524,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;
@@ -529,10 +570,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)) {
@@ -599,7 +645,6 @@
return $out;
}
-
/**
* Create and register a button
*
@@ -610,19 +655,18 @@
*/
private function button($attrib)
{
- global $CONFIG, $OUTPUT, $MAIN_TASKS;
static $sa_buttons = array();
static $s_button_count = 100;
// these commands can be called directly via url
$a_static_commands = array('compose', 'list');
- $browser = new rcube_browser();
- $skin_path = $this->config['skin_path'];
-
if (!($attrib['command'] || $attrib['name'])) {
return '';
}
+
+ $browser = new rcube_browser();
+
// try to find out the button type
if ($attrib['type']) {
$attrib['type'] = strtolower($attrib['type']);
@@ -687,13 +731,13 @@
$command,
$attrib['id'],
$attrib['type'],
- $attrib['imageact'] ? $skin_path.$attrib['imageact'] : $attrib['classact'],
- $attrib['imagesel'] ? $skin_path.$attrib['imagesel'] : $attrib['classsel'],
- $attrib['imageover'] ? $skin_path.$attrib['imageover'] : ''
+ $attrib['imageact'] ? $this->abs_url($attrib['imageact']) : $attrib['classact'],
+ $attrib['imagesel'] ? $this->abs_url($attrib['imagesel']) : $attrib['classsel'],
+ $attrib['imageover'] ? $this->abs_url($attrib['imageover']) : ''
));
// make valid href to specific buttons
- if (in_array($attrib['command'], $MAIN_TASKS)) {
+ if (in_array($attrib['command'], rcmail::$main_tasks)) {
$attrib['href'] = Q(rcmail_url(null, null, $attrib['command']));
}
else if (in_array($attrib['command'], $a_static_commands)) {
@@ -752,11 +796,10 @@
array(
'style', 'class', 'id', 'width',
'height', 'border', 'hspace',
- 'vspace', 'align', 'alt',
+ 'vspace', 'align', 'alt', 'tabindex'
)
);
- $img_tag = sprintf('<img src="%%s"%s />', $attrib_str);
- $btn_content = sprintf($img_tag, $skin_path.$attrib['image']);
+ $btn_content = sprintf('<img src="%s"%s />', $this->abs_url($attrib['image']), $attrib_str);
if ($attrib['label']) {
$btn_content .= ' '.$attrib['label'];
}
@@ -764,7 +807,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';
@@ -777,7 +820,7 @@
$attrib,
array(
'type', 'value', 'onclick',
- 'id', 'class', 'style'
+ 'id', 'class', 'style', 'tabindex'
)
);
$out = sprintf('<input%s disabled="disabled" />', $attrib_str);
@@ -797,15 +840,36 @@
/**
+ * Create a form tag with the necessary hidden fields
+ *
+ * @param array Named tag parameters
+ * @return string HTML code for the form
+ */
+ public function form_tag($attrib, $content = null)
+ {
+ if ($this->framed) {
+ $hiddenfield = new html_hiddenfield(array('name' => '_framed', 'value' => '1'));
+ $hidden = $hiddenfield->show();
+ }
+
+ if (!$content)
+ $attrib['noclose'] = true;
+
+ return html::tag('form',
+ $attrib + array('action' => "./", 'method' => "get"),
+ $hidden . $content);
+ }
+
+
+ /**
* GUI object 'username'
* Showing IMAP username of the current session
*
* @param array Named tag parameters (currently not used)
* @return string HTML code for the gui object
*/
- static function current_username($attrib)
+ public function current_username($attrib)
{
- global $USER;
static $username;
// alread fetched
@@ -814,14 +878,11 @@
}
// get e-mail address form default identity
- if ($sql_arr = $USER->get_identity()) {
- $s_username = $sql_arr['email'];
- }
- else if (strstr($_SESSION['username'], '@')) {
- $username = $_SESSION['username'];
+ if ($sql_arr = $this->app->user->get_identity()) {
+ $username = $sql_arr['email'];
}
else {
- $username = $_SESSION['username'].'@'.$_SESSION['imap_host'];
+ $username = $this->app->user->get_username();
}
return $username;
@@ -837,13 +898,12 @@
*/
private function login_form($attrib)
{
- global $CONFIG, $SESS_HIDDEN_FIELD;
- $default_host = $CONFIG['default_host'];
+ $default_host = $this->config['default_host'];
$_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;
@@ -860,7 +920,7 @@
}
}
}
- else if (!strlen($default_host)) {
+ else if (empty($default_host)) {
$input_host = new html_inputfield(array('name' => '_host', 'id' => 'rcmloginhost', 'size' => 30));
}
@@ -871,7 +931,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());
@@ -879,23 +939,15 @@
// 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 = $SESS_HIDDEN_FIELD;
- $out .= $input_action->show();
+ $out = $input_action->show();
$out .= $table->show();
// surround html output with a form tag
if (empty($attrib['form'])) {
- $out = html::tag(
- 'form',
- array(
- 'name' => $form_name,
- 'action' => "./",
- 'method' => "post"
- ),
- $out);
+ $out = $this->form_tag(array('name' => $form_name, 'method' => "post"), $out);
}
return $out;
@@ -926,15 +978,11 @@
// add form tag around text field
if (empty($attrib['form'])) {
- $out = html::tag(
- 'form',
- array(
- 'name' => "rcmqsearchform",
- 'action' => "./",
- 'onsubmit' => JS_OBJECT_NAME . ".command('search');return false;",
- 'style' => "display:inline",
- ),
- $out);
+ $out = $this->form_tag(array(
+ 'name' => "rcmqsearchform",
+ 'onsubmit' => JS_OBJECT_NAME . ".command('search');return false;",
+ 'style' => "display:inline"),
+ $out);
}
return $out;
--
Gitblit v1.9.1