summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG7
-rw-r--r--program/include/main.inc42
-rw-r--r--program/js/app.js76
-rw-r--r--program/steps/mail/func.inc27
-rw-r--r--skins/default/mail.css4
5 files changed, 116 insertions, 40 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 4d3bfa533..df1546338 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,13 @@
CHANGELOG RoundCube Webmail
---------------------------
+2006/07/30 (thomasb)
+----------
+- Alter links in HTML messages (Bug #1326402)
+- Added fallback if host not found in 'mail_domain' array
+- Applied patch of Charles to highlight droptargets (Ticket #1473034)
+
+
2006/07/25 (thomasb)
----------
- Made folder renaming a bit more ajax-style
diff --git a/program/include/main.inc b/program/include/main.inc
index e77df19e3..bbfba07fc 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -541,12 +541,14 @@ function rcmail_create_user($user, $host)
if ($user_id = $DB->insert_id(get_sequence_name('users')))
{
- if (is_array($CONFIG['mail_domain']) && isset($CONFIG['mail_domain'][$host]))
- $mail_domain = $CONFIG['mail_domain'][$host];
+ $mail_domain = $host;
+ if (is_array($CONFIG['mail_domain']))
+ {
+ if (isset($CONFIG['mail_domain'][$host]))
+ $mail_domain = $CONFIG['mail_domain'][$host];
+ }
else if (!empty($CONFIG['mail_domain']))
$mail_domain = $CONFIG['mail_domain'];
- else
- $mail_domain = $host;
if ($user_email=='')
$user_email = strstr($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain);
@@ -1125,21 +1127,12 @@ function parse_rcube_xml($input)
}
-function rcube_xml_command($command, $str_attrib, $a_attrib=NULL)
+function rcube_xml_command($command, $str_attrib, $add_attrib=array())
{
global $IMAP, $CONFIG, $OUTPUT;
- $attrib = array();
$command = strtolower($command);
-
- preg_match_all('/\s*([-_a-z]+)=["]([^"]+)["]?/i', stripslashes($str_attrib), $regs, PREG_SET_ORDER);
-
- // convert attributes to an associative array (name => value)
- if ($regs)
- foreach ($regs as $attr)
- $attrib[strtolower($attr[1])] = $attr[2];
- else if ($a_attrib)
- $attrib = $a_attrib;
+ $attrib = parse_attrib_string($str_attrib) + $add_attrib;
// execute command
switch ($command)
@@ -1223,7 +1216,7 @@ function rcube_xml_command($command, $str_attrib, $a_attrib=NULL)
'identityform' => 'rcube_identity_form',
'foldersubscription' => 'rcube_subscription_form',
'createfolder' => 'rcube_create_folder_form',
- 'renamefolder' => 'rcube_rename_folder_form',
+ 'renamefolder' => 'rcube_rename_folder_form',
'composebody' => 'rcmail_compose_body'
);
@@ -1523,18 +1516,33 @@ function rcmail_get_edit_field($col, $value, $attrib, $type='text')
}
+// compose a valid attribute string for HTML tags
function create_attrib_string($attrib, $allowed_attribs=array('id', 'class', 'style'))
{
// allow the following attributes to be added to the <iframe> tag
$attrib_str = '';
foreach ($allowed_attribs as $a)
if (isset($attrib[$a]))
- $attrib_str .= sprintf(' %s="%s"', $a, $attrib[$a]);
+ $attrib_str .= sprintf(' %s="%s"', $a, str_replace('"', '&quot;', $attrib[$a]));
return $attrib_str;
}
+// convert a HTML attribute string attributes to an associative array (name => value)
+function parse_attrib_string($str)
+ {
+ $attrib = array();
+ preg_match_all('/\s*([-_a-z]+)=["]([^"]+)["]?/i', stripslashes($str), $regs, PREG_SET_ORDER);
+
+ // convert attributes to an associative array (name => value)
+ if ($regs)
+ foreach ($regs as $attr)
+ $attrib[strtolower($attr[1])] = $attr[2];
+
+ return $attrib;
+ }
+
function format_date($date, $format=NULL)
{
diff --git a/program/js/app.js b/program/js/app.js
index 47545e240..84e9e45c7 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -287,14 +287,20 @@ function rcube_webmail()
if (!e)
e = window.event;
- for (var n=0; n<this.selection.length; n++) {
+ for (var n=0; n<this.selection.length; n++)
+ {
id = this.selection[n];
- if (this.list_rows[id].obj) {
+ if (this.list_rows[id].obj)
+ {
this.set_classname(this.list_rows[id].obj, 'selected', true);
this.set_classname(this.list_rows[id].obj, 'unfocused', false);
- }
- }
+ }
+ }
+ var mbox_li;
+ if (mbox_li = this.get_mailbox_li())
+ this.set_classname(mbox_li, 'unfocused', true);
+
this.in_message_list = true;
e.cancelBubble = true;
};
@@ -1183,10 +1189,13 @@ function rcube_webmail()
this.mbox_mouse_up = function(mbox)
{
if (this.drag_active)
+ {
+ this.unfocus_mailbox(mbox);
this.command('moveto', mbox);
+ }
else
this.command('list', mbox);
-
+
return false;
};
@@ -1556,8 +1565,7 @@ function rcube_webmail()
if (this.env.search_request)
add_url += '&_search='+this.env.search_request;
- if (this.env.mailbox!=mbox)
- this.select_mailbox(mbox);
+ this.select_mailbox(mbox);
// load message list remotely
if (this.gui_objects.messagelist)
@@ -1667,7 +1675,20 @@ function rcube_webmail()
return true;
};
-
+ this.focus_mailbox = function(mbox)
+ {
+ var mbox_li;
+ if (this.drag_active && mbox != this.env.mailbox && (mbox_li = this.get_mailbox_li(mbox)))
+ this.set_classname(mbox_li, 'droptarget', true);
+ }
+
+ this.unfocus_mailbox = function(mbox)
+ {
+ var mbox_li;
+ if (this.drag_active && (mbox_li = this.get_mailbox_li(mbox)))
+ this.set_classname(mbox_li, 'droptarget', false);
+ }
+
// move selected messages to the specified mailbox
this.move_messages = function(mbox)
{
@@ -1930,6 +1951,19 @@ function rcube_webmail()
return true;
}
+
+ this.get_mailbox_li = function(mbox)
+ {
+ if (this.gui_objects.mailboxlist)
+ {
+ mbox = String((mbox ? mbox : this.env.mailbox)).toLowerCase().replace(this.mbox_expression, '');
+ return document.getElementById('rcmbx'+mbox);
+ }
+
+ return null;
+ };
+
+
/*********************************************************/
/********* message compose methods *********/
/*********************************************************/
@@ -2237,7 +2271,6 @@ function rcube_webmail()
highlight.removeAttribute('id');
//highlight.removeAttribute('class');
this.set_classname(highlight, 'selected', false);
- this.set_classname(highlight, 'unfocused', false);
}
if (next)
@@ -3152,22 +3185,23 @@ function rcube_webmail()
// mark a mailbox as selected and set environment variable
this.select_mailbox = function(mbox)
{
- if (this.gui_objects.mailboxlist)
+ if (this.gui_objects.mailboxlist )
{
- var item, reg, text_obj;
- var s_current = this.env.mailbox.toLowerCase().replace(this.mbox_expression, '');
- var s_mbox = String(mbox).toLowerCase().replace(this.mbox_expression, '');
- var s_current = this.env.mailbox.toLowerCase().replace(this.mbox_expression, '');
-
- var current_li = document.getElementById('rcmbx'+s_current);
- var mbox_li = document.getElementById('rcmbx'+s_mbox);
+ var item, reg, text_obj;
+ var current_li = this.get_mailbox_li();
+ var mbox_li = this.get_mailbox_li(mbox);
- if (current_li) {
+ if (current_li)
+ {
this.set_classname(current_li, 'selected', false);
this.set_classname(current_li, 'unfocused', false);
}
- if (mbox_li)
+
+ if (mbox_li || this.env.mailbox == mbox)
+ {
+ this.set_classname(mbox_li, 'unfocused', false);
this.set_classname(mbox_li, 'selected', true);
+ }
}
this.env.mailbox = mbox;
@@ -3284,9 +3318,9 @@ function rcube_webmail()
if (mbox==this.env.mailbox)
set_title = true;
- var item, reg, text_obj;
+ var reg, text_obj;
+ var item = this.get_mailbox_li(mbox);
mbox = String(mbox).toLowerCase().replace(this.mbox_expression, '');
- item = document.getElementById('rcmbx'+mbox);
if (item && item.className && item.className.indexOf('mailbox '+mbox)>=0)
{
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index b1d3d8b6b..fd0d2c25d 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -216,6 +216,8 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox_name, $m
$out .= sprintf('<li id="rcmbx%s" class="mailbox %s %s%s%s"><a href="%s&amp;_mbox=%s"'.
' onclick="return %s.command(\'list\',\'%s\')"'.
+ ' onmouseover="return %s.focus_mailbox(\'%s\')"' .
+ ' onmouseout="return %s.unfocus_mailbox(\'%s\')"' .
' onmouseup="return %s.mbox_mouse_up(\'%s\')"%s>%s</a>',
$folder_css,
$class_name,
@@ -228,6 +230,10 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox_name, $m
addslashes($folder['id']),
$JS_OBJECT_NAME,
addslashes($folder['id']),
+ $JS_OBJECT_NAME,
+ addslashes($folder['id']),
+ $JS_OBJECT_NAME,
+ addslashes($folder['id']),
$title,
rep_specialchars_output($foldername, 'html', 'all'));
@@ -1170,11 +1176,14 @@ function rcmail_mod_html_body($body, $container_id)
$body = preg_replace('/(url\s*\()(["\']?)([\.\/]+[^"\'\)\s]+)(\2)\)/Uie', "'\\1\''.make_absolute_url('\\3', '$base_url').'\')'", $body);
$body = preg_replace($base_reg, '', $body);
}
+
+ // modify HTML links to open a new window if clicked
+ $body = preg_replace('/<a\s+([^>]+)>/Uie', "rcmail_alter_html_link('\\1');", $body);
// add comments arround html and other tags
$out = preg_replace(array('/(<\/?html[^>]*>)/i',
'/(<\/?head[^>]*>)/i',
- '/(<title[^>]*>.+<\/title>)/ui',
+ '/(<title[^>]*>.*<\/title>)/Ui',
'/(<\/?meta[^>]*>)/i'),
'<!--\\1-->',
$body);
@@ -1184,12 +1193,26 @@ function rcmail_mod_html_body($body, $container_id)
array('<div class="rcmBody">',
'</div>'),
$out);
-
return $out;
}
+// parse link attributes and set correct target
+function rcmail_alter_html_link($in)
+ {
+ $attrib = parse_attrib_string($in);
+
+ if (stristr((string)$attrib['href'], 'mailto:'))
+ $attrib['onclick'] = sprintf("return %s.command('compose','%s',this)",
+ $GLOBALS['JS_OBJECT_NAME'],
+ substr($attrib['href'], 7));
+ else if (!empty($attrib['href']) && $attrib['href']{0}!='#')
+ $attrib['target'] = '_blank';
+
+ return '<a' . create_attrib_string($attrib, array('href', 'name', 'target', 'onclick', 'id', 'class', 'style', 'title')) . '>';
+ }
+
// replace all css definitions with #container [def]
function rcmail_mod_css_styles($source, $container_id)
diff --git a/skins/default/mail.css b/skins/default/mail.css
index 86d6e1e79..72a782bc2 100644
--- a/skins/default/mail.css
+++ b/skins/default/mail.css
@@ -276,6 +276,10 @@
font-weight: bold;
}
+#mailboxlist li.droptarget
+{
+ background-color: #FFFFA6;
+}
/* styles for nested folders */
#mailboxlist ul {