summaryrefslogtreecommitdiff
path: root/program/js
diff options
context:
space:
mode:
Diffstat (limited to 'program/js')
-rw-r--r--program/js/app.js106
-rw-r--r--program/js/editor.js11
-rw-r--r--program/js/list.js38
3 files changed, 84 insertions, 71 deletions
diff --git a/program/js/app.js b/program/js/app.js
index 5943ad0fd..ad0015452 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -499,6 +499,7 @@ function rcube_webmail()
// flag object as complete
this.loaded = true;
+ this.env.lastrefresh = new Date();
// show message
if (this.pending_message)
@@ -1760,7 +1761,7 @@ function rcube_webmail()
// set eventhandler to status icon
if (row.icon = document.getElementById(status_icon)) {
row.icon._row = row.obj;
- row.icon.onmousedown = function(e) { self.command('toggle_status', this); rcube_event.cancel(e); };
+ row.icon.onclick = function(e) { self.command('toggle_status', this); return rcube_event.cancel(e); };
}
// save message icon position too
@@ -1772,12 +1773,12 @@ function rcube_webmail()
// set eventhandler to flag icon, if icon found
if (this.env.flagged_col != null && (row.flagicon = document.getElementById('flagicn'+row.uid))) {
row.flagicon._row = row.obj;
- row.flagicon.onmousedown = function(e) { self.command('toggle_flag', this); rcube_event.cancel(e); };
+ row.flagicon.onclick = function(e) { self.command('toggle_flag', this); return rcube_event.cancel(e); };
}
if (!row.depth && row.has_children && (expando = document.getElementById('rcmexpando'+row.uid))) {
row.expando = expando;
- expando.onmousedown = function(e) { return self.expand_message_row(e, uid); };
+ expando.onclick = function(e) { return self.expand_message_row(e, uid); };
if (bw.touch) {
expando.addEventListener('touchend', function(e) {
if (e.changedTouches.length == 1) {
@@ -1831,7 +1832,6 @@ function rcube_webmail()
+ (!flags.seen ? ' unread' : '')
+ (flags.deleted ? ' deleted' : '')
+ (flags.flagged ? ' flagged' : '')
- + (flags.unread_children && flags.seen && !this.env.autoexpand_threads ? ' unroot' : '')
+ (message.selected ? ' selected' : ''),
row = { cols:[], style:{}, id:'rcmrow'+uid };
@@ -1881,6 +1881,9 @@ function rcube_webmail()
expando = '<div id="rcmexpando' + uid + '" class="' + (message.expanded ? 'expanded' : 'collapsed') + '">&nbsp;&nbsp;</div>';
row_class += ' thread' + (message.expanded? ' expanded' : '');
}
+
+ if (flags.unread_children && flags.seen && !message.expanded)
+ row_class += ' unroot';
}
tree += '<span id="msgicn'+uid+'" class="'+css_class+'">&nbsp;</span>';
@@ -1926,7 +1929,7 @@ function rcube_webmail()
html = expando;
else if (c == 'subject') {
if (bw.ie) {
- col.onmouseover = function() { rcube_webmail.long_subject_title_ie(this, message.depth+1); };
+ col.onmouseover = function() { rcube_webmail.long_subject_title_ex(this, message.depth+1); };
if (bw.ie8)
tree = '<span></span>' + tree; // #1487821
}
@@ -2877,10 +2880,10 @@ function rcube_webmail()
{
var len = a_uids.length,
i, uid, all_deleted = true,
- rows = this.message_list ? this.message_list.rows : [];
+ rows = this.message_list ? this.message_list.rows : {};
if (len == 1) {
- if (!rows.length || (rows[a_uids[0]] && !rows[a_uids[0]].deleted))
+ if (!this.message_list || (rows[a_uids[0]] && !rows[a_uids[0]].deleted))
this.flag_as_deleted(a_uids);
else
this.flag_as_undeleted(a_uids);
@@ -2921,7 +2924,7 @@ function rcube_webmail()
var r_uids = [],
post_data = this.selection_post_data({_uid: this.uids_to_list(a_uids), _flag: 'delete'}),
lock = this.display_message(this.get_label('markingmessage'), 'loading'),
- rows = this.message_list ? this.message_list.rows : [],
+ rows = this.message_list ? this.message_list.rows : {},
count = 0;
for (var i=0, len=a_uids.length; i<len; i++) {
@@ -2941,7 +2944,7 @@ function rcube_webmail()
// make sure there are no selected rows
if (this.env.skip_deleted && this.message_list) {
- if(!this.env.display_next)
+ if (!this.env.display_next)
this.message_list.clear_selection();
if (count < 0)
post_data._count = (count*-1);
@@ -2965,7 +2968,7 @@ function rcube_webmail()
this.flag_deleted_as_read = function(uids)
{
var icn_src, uid, i, len,
- rows = this.message_list ? this.message_list.rows : [];
+ rows = this.message_list ? this.message_list.rows : {};
uids = String(uids).split(',');
@@ -3620,7 +3623,8 @@ function rcube_webmail()
message = input_message.val(),
is_html = ($("input[name='_is_html']").val() == '1'),
sig = this.env.identity,
- delim = this.env.recipients_delimiter,
+ delim = this.env.recipients_separator,
+ rx_delim = RegExp.escape(delim),
headers = ['replyto', 'bcc'];
// update reply-to/bcc fields with addresses defined in identities
@@ -3637,16 +3641,18 @@ function rcube_webmail()
}
// cleanup
- rx = new RegExp(RegExp.escape(delim) + '\\s*' + RegExp(delim), 'g');
- input_val = input_val.replace(rx, delim)
- rx = new RegExp('^\\s*' + RegExp.escape(delim) + '\\s*$');
- input_val = input_val.replace(rx, '')
+ rx = new RegExp(rx_delim + '\\s*' + rx_delim, 'g');
+ input_val = input_val.replace(rx, delim);
+ rx = new RegExp('^[\\s' + rx_delim + ']+');
+ input_val = input_val.replace(rx, '');
// add new address(es)
- if (new_val) {
- rx = new RegExp(RegExp.escape(delim) + '\\s*$');
- if (input_val && !rx.test(input_val))
- input_val += delim + ' ';
+ if (new_val && input_val.indexOf(new_val) == -1 && input_val.indexOf(new_val.replace(/"/g, '')) == -1) {
+ if (input_val) {
+ rx = new RegExp('[' + rx_delim + '\\s]+$')
+ input_val = input_val.replace(rx, '') + delim + ' ';
+ }
+
input_val += new_val + delim + ' ';
}
@@ -3749,6 +3755,7 @@ function rcube_webmail()
}
this.env.identity = id;
+ this.triggerEvent('change_identity');
return true;
};
@@ -3832,7 +3839,12 @@ function rcube_webmail()
att.html = '<a title="'+this.get_label('cancel')+'" onclick="return rcmail.cancel_attachment_upload(\''+name+'\', \''+att.frame+'\');" href="#cancelupload" class="cancelupload">'
+ (this.env.cancelicon ? '<img src="'+this.env.cancelicon+'" alt="" />' : this.get_label('cancel')) + '</a>' + att.html;
- var indicator, li = $('<li>').attr('id', name).addClass(att.classname).html(att.html);
+ var indicator, li = $('<li>');
+
+ li.attr('id', name)
+ .addClass(att.classname)
+ .html(att.html)
+ .on('mouseover', function() { rcube_webmail.long_subject_title_ex(this, 0); });
// replace indicator's li
if (upload_id && (indicator = document.getElementById(upload_id))) {
@@ -3978,7 +3990,7 @@ function rcube_webmail()
this.env.search_id = null;
};
- this.sent_successfully = function(type, msg, target)
+ this.sent_successfully = function(type, msg, folders)
{
this.display_message(msg, type);
@@ -3987,9 +3999,11 @@ function rcube_webmail()
this.lock_form(this.gui_objects.messageform);
if (rc) {
rc.display_message(msg, type);
- // refresh the folder where sent message was saved
- if (target && rc.env.task == 'mail' && rc.env.action == '' && rc.env.mailbox == target)
- rc.command('checkmail');
+ // refresh the folder where sent message was saved or replied message comes from
+ if (folders && rc.env.task == 'mail' && rc.env.action == '' && $.inArray(rc.env.mailbox, folders) >= 0) {
+ // @TODO: try with 'checkmail' here when #1485186 is fixed. See also #1489249.
+ rc.command('list');
+ }
}
setTimeout(function(){ window.close() }, 1000);
}
@@ -4536,7 +4550,7 @@ function rcube_webmail()
boxtitle.append('&nbsp;&raquo;&nbsp;');
}
- boxtitle.append($('<span>'+prop.name+'</span>'));
+ boxtitle.append($('<span>').text(prop.name));
}
this.triggerEvent('groupupdate', prop);
@@ -6110,24 +6124,23 @@ function rcube_webmail()
};
// open a jquery UI dialog with the given content
- this.show_popup_dialog = function(html, title, buttons)
+ this.show_popup_dialog = function(html, title, buttons, options)
{
// forward call to parent window
if (this.is_framed()) {
- parent.rcmail.show_popup_dialog(html, title, buttons);
- return;
+ return parent.rcmail.show_popup_dialog(html, title, buttons);
}
var popup = $('<div class="popup">')
.html(html)
- .dialog({
+ .dialog($.extend({
title: title,
buttons: buttons,
modal: true,
resizable: true,
width: 500,
close: function(event, ui) { $(this).remove() }
- });
+ }, options || {}));
// resize and center popup
var win = $(window), w = win.width(), h = win.height(),
@@ -6137,6 +6150,8 @@ function rcube_webmail()
height: Math.min(h - 40, height + 75 + (buttons ? 50 : 0)),
width: Math.min(w - 20, width + 20)
});
+
+ return popup;
};
// enable/disable buttons for page shifting
@@ -6509,7 +6524,7 @@ function rcube_webmail()
if (result === false)
return false;
else
- query = result;
+ url = this.url(action, result);
}
url += '&_remote=1';
@@ -6746,7 +6761,7 @@ function rcube_webmail()
// post the given form to a hidden iframe
this.async_upload_form = function(form, action, onload)
{
- var ts = new Date().getTime(),
+ var frame, ts = new Date().getTime(),
frame_name = 'rcmupload'+ts;
// upload progress support
@@ -6765,21 +6780,19 @@ function rcube_webmail()
// have to do it this way for IE
// otherwise the form will be posted to a new window
if (document.all) {
- var html = '<iframe name="'+frame_name+'" src="program/resources/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>';
- document.body.insertAdjacentHTML('BeforeEnd', html);
+ document.body.insertAdjacentHTML('BeforeEnd', '<iframe name="'+frame_name+'"'
+ + ' src="program/resources/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>');
+ frame = $('iframe[name="'+frame_name+'"]');
}
- else { // for standards-compilant browsers
- var frame = document.createElement('iframe');
- frame.name = frame_name;
- frame.style.border = 'none';
- frame.style.width = 0;
- frame.style.height = 0;
- frame.style.visibility = 'hidden';
- document.body.appendChild(frame);
+ // for standards-compliant browsers
+ else {
+ frame = $('<iframe>').attr('name', frame_name)
+ .css({border: 'none', width: 0, height: 0, visibility: 'hidden'})
+ .appendTo(document.body);
}
// handle upload errors, parsing iframe content in onload
- $(frame_name).bind('load', {ts:ts}, onload);
+ frame.bind('load', {ts:ts}, onload);
$(form).attr({
target: frame_name,
@@ -6956,6 +6969,9 @@ function rcube_webmail()
if (this.task == 'mail' && this.gui_objects.mailboxlist)
params = this.check_recent_params();
+ params._last = Math.floor(this.env.lastrefresh.getTime() / 1000);
+ this.env.lastrefresh = new Date();
+
// plugins should bind to 'requestrefresh' event to add own params
this.http_request('refresh', params, lock);
};
@@ -7265,11 +7281,11 @@ rcube_webmail.long_subject_title = function(elem, indent)
if (!elem.title) {
var $elem = $(elem);
if ($elem.width() + indent * 15 > $elem.parent().width())
- elem.title = $elem.html();
+ elem.title = $elem.text();
}
};
-rcube_webmail.long_subject_title_ie = function(elem, indent)
+rcube_webmail.long_subject_title_ex = function(elem, indent)
{
if (!elem.title) {
var $elem = $(elem),
diff --git a/program/js/editor.js b/program/js/editor.js
index e403d1f63..6d7b9538a 100644
--- a/program/js/editor.js
+++ b/program/js/editor.js
@@ -74,11 +74,18 @@ function rcmail_editor_init(config)
// react to real individual tinyMCE editor init
function rcmail_editor_callback()
{
- var elem = rcube_find_object('_from'),
+ var css = {},
+ elem = rcube_find_object('_from'),
fe = rcmail.env.compose_focus_elem;
if (rcmail.env.default_font)
- $(tinyMCE.get(rcmail.env.composebody).getBody()).css('font-family', rcmail.env.default_font);
+ css['font-family'] = rcmail.env.default_font;
+
+ if (rcmail.env.default_font_size)
+ css['font-size'] = rcmail.env.default_font_size;
+
+ if (css['font-family'] || css['font-size'])
+ $(tinyMCE.get(rcmail.env.composebody).getBody()).css(css);
if (elem && elem.type == 'select-one') {
rcmail.change_identity(elem);
diff --git a/program/js/list.js b/program/js/list.js
index c2ad3f7c3..33f88ab10 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -35,7 +35,7 @@ function rcube_list_widget(list, p)
this.tbody;
this.fixed_header;
this.frame = null;
- this.rows = [];
+ this.rows = {};
this.selection = [];
this.rowcount = 0;
this.colcount = 0;
@@ -50,7 +50,6 @@ function rcube_list_widget(list, p)
this.keyboard = false;
this.toggleselect = false;
- this.dont_select = false;
this.drag_active = false;
this.col_drag_active = false;
this.column_fixed = null;
@@ -86,7 +85,7 @@ init: function()
}
if (this.tbody) {
- this.rows = [];
+ this.rows = {};
this.rowcount = 0;
var r, len, rows = this.tbody.childNodes;
@@ -240,7 +239,7 @@ clear: function(sel)
$(this.row_tagname() + ':not(.thead)', this.tbody).remove();
}
- this.rows = [];
+ this.rows = {};
this.rowcount = 0;
if (sel)
@@ -409,7 +408,7 @@ drag_row: function(e, id)
var evtarget = rcube_event.get_target(e),
tagname = evtarget.tagName.toLowerCase();
- if (this.dont_select || (evtarget && (tagname == 'input' || tagname == 'img')))
+ if (evtarget && (tagname == 'input' || tagname == 'img' || (tagname != 'a' && evtarget.onclick)))
return true;
// accept right-clicks
@@ -455,23 +454,16 @@ click_row: function(e, id)
if ((evtarget && (tagname == 'input' || tagname == 'img')))
return true;
- // don't do anything (another action processed before)
- if (this.dont_select) {
- this.dont_select = false;
- return false;
- }
-
var dblclicked = now - this.rows[id].clicked < this.dblclick_time;
- // unselects currently selected row
- if (!this.drag_active && this.in_selection_before == id && !dblclicked)
- this.select_row(id, mod_key, false);
-
+ // selects/unselects currently selected row
+ if (!this.drag_active && !dblclicked)
+ this.select_row(id, mod_key, true);
+
this.drag_start = false;
- this.in_selection_before = false;
// row was double clicked
- if (this.rows && dblclicked && this.in_selection(id)) {
+ if (this.rowcount && dblclicked && this.in_selection(id)) {
this.triggerEvent('dblclick');
now = 0;
}
@@ -509,8 +501,6 @@ expand_row: function(e, id)
evtarget = rcube_event.get_target(e),
mod_key = rcube_event.get_modifier(e);
- // Don't select this message
- this.dont_select = true;
// Don't treat double click on the expando as double click on the message.
row.clicked = 0;
@@ -703,7 +693,7 @@ update_expando: function(uid, expanded)
*/
get_next_row: function()
{
- if (!this.rows)
+ if (!this.rowcount)
return false;
var last_selected_row = this.rows[this.last_selected],
@@ -717,7 +707,7 @@ get_next_row: function()
get_prev_row: function()
{
- if (!this.rows)
+ if (!this.rowcount)
return false;
var last_selected_row = this.rows[this.last_selected],
@@ -796,7 +786,7 @@ select_row: function(id, mod_key, with_mouse)
break;
case CONTROL_KEY:
- if (!with_mouse)
+ if (with_mouse)
this.highlight_row(id, true);
break;
@@ -969,7 +959,7 @@ in_selection: function(id)
*/
select_all: function(filter)
{
- if (!this.rows || !this.rows.length)
+ if (!this.rowcount)
return false;
// reset but remember selection first
@@ -1001,7 +991,7 @@ select_all: function(filter)
*/
invert_selection: function()
{
- if (!this.rows || !this.rows.length)
+ if (!this.rowcount)
return false;
// remember old selection