summaryrefslogtreecommitdiff
path: root/program/js/app.js
diff options
context:
space:
mode:
Diffstat (limited to 'program/js/app.js')
-rw-r--r--program/js/app.js115
1 files changed, 95 insertions, 20 deletions
diff --git a/program/js/app.js b/program/js/app.js
index 31544abf0..3d714b92b 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -58,7 +58,6 @@ function rcube_webmail()
request_timeout: 180, // seconds
draft_autosave: 0, // seconds
comm_path: './',
- blankpage: 'program/resources/blank.gif',
recipients_separator: ',',
recipients_delimiter: ', ',
popup_width: 1150,
@@ -163,6 +162,9 @@ function rcube_webmail()
return;
}
+ if (!this.env.blankpage)
+ this.env.blankpage = this.assets_path('program/resources/blank.gif');
+
// find all registered gui containers
for (n in this.gui_containers)
this.gui_containers[n] = $('#'+this.gui_containers[n]);
@@ -556,7 +558,7 @@ function rcube_webmail()
// show message
if (this.pending_message)
- this.display_message(this.pending_message[0], this.pending_message[1], this.pending_message[2]);
+ this.display_message.apply(this, this.pending_message);
// init treelist widget
if (this.gui_objects.folderlist && window.rcube_treelist_widget) {
@@ -572,6 +574,7 @@ function rcube_webmail()
this.treelist
.addEventListener('collapse', function(node) { ref.folder_collapsed(node) })
.addEventListener('expand', function(node) { ref.folder_collapsed(node) })
+ .addEventListener('beforeselect', function(node) { return !ref.busy; })
.addEventListener('select', function(node) { ref.triggerEvent('selectfolder', { folder:node.id, prefix:'rcmli' }) });
}
@@ -630,8 +633,9 @@ function rcube_webmail()
if (obj && obj.blur && !(event && rcube_event.is_keyboard(event)))
obj.blur();
- // do nothing if interface is locked by other command (with exception for searching reset)
- if (this.busy && !(command == 'reset-search' && this.last_command == 'search'))
+ // do nothing if interface is locked by another command
+ // with exception for searching reset and menu
+ if (this.busy && !(command == 'reset-search' && this.last_command == 'search') && !command.match(/^menu-/))
return false;
// let the browser handle this click (shift/ctrl usually opens the link in a new window/tab)
@@ -1212,7 +1216,8 @@ function rcube_webmail()
// reset quicksearch
case 'reset-search':
- var n, s = this.env.search_request || this.env.qsearch;
+ var n, s = this.env.search_request || this.env.qsearch,
+ ss = this.gui_objects.qsearchbox && this.gui_objects.qsearchbox.value != '';
this.reset_qsearch();
this.select_all_mode = false;
@@ -1221,7 +1226,7 @@ function rcube_webmail()
if (this.contact_list)
this.list_contacts_clear();
}
- else if (s && this.env.mailbox) {
+ else if (s && ss && this.env.mailbox) {
this.list_mailbox(this.env.mailbox, 1);
}
else if (s && this.task == 'addressbook') {
@@ -1405,8 +1410,10 @@ function rcube_webmail()
if (task == 'mail')
url += '&_mbox=INBOX';
- else if (task == 'logout' && !this.env.server_error)
+ else if (task == 'logout' && !this.env.server_error) {
+ url += '&_token=' + this.env.request_token;
this.clear_compose_data();
+ }
this.redirect(url);
};
@@ -1416,7 +1423,10 @@ function rcube_webmail()
if (!url)
url = this.env.comm_path;
- return url.replace(/_task=[a-z0-9_-]+/i, '_task='+task);
+ if (url.match(/[?&]_task=[a-zA-Z0-9_-]+/))
+ return url.replace(/_task=[a-zA-Z0-9_-]+/, '_task=' + task);
+ else
+ return url.replace(/\?.*$/, '') + '?_task=' + task;
};
this.reload = function(delay)
@@ -2027,7 +2037,7 @@ function rcube_webmail()
}
if (flags.forwarded) {
status_class += ' forwarded';
- status_label += this.get_label('replied') + ' ';
+ status_label += this.get_label('forwarded') + ' ';
}
// update selection
@@ -3426,6 +3436,7 @@ function rcube_webmail()
this.get_label('restoremessage'),
[{
text: this.get_label('restore'),
+ 'class': 'mainaction',
click: function(){
ref.restore_compose_form(key, html_mode);
ref.remove_compose_data(key); // remove old copy
@@ -3435,6 +3446,7 @@ function rcube_webmail()
},
{
text: this.get_label('delete'),
+ 'class': 'delete',
click: function(){
ref.remove_compose_data(key);
$(this).dialog('close');
@@ -3687,7 +3699,7 @@ function rcube_webmail()
$(this).dialog('close');
};
- this.show_popup_dialog(html, this.gettext('newresponse'), buttons);
+ this.show_popup_dialog(html, this.gettext('newresponse'), buttons, {button_classes: ['mainaction']});
$('#ffresponsetext').val(text);
$('#ffresponsename').select();
@@ -4704,7 +4716,7 @@ function rcube_webmail()
source = this.env.source ? this.env.address_sources[this.env.source] : null;
// we don't have dblclick handler here, so use 200 instead of this.dblclick_time
- if (id = list.get_single_selection())
+ if (this.env.contentframe && (id = list.get_single_selection()))
this.preview_timer = setTimeout(function(){ ref.load_contact(id, 'show'); }, 200);
else if (this.env.contentframe)
this.show_contentframe(false);
@@ -5173,6 +5185,7 @@ function rcube_webmail()
this.show_popup_dialog(content, this.get_label('newgroup'),
[{
text: this.get_label('save'),
+ 'class': 'mainaction',
click: function() {
var name;
@@ -5200,6 +5213,7 @@ function rcube_webmail()
this.show_popup_dialog(content, this.get_label('grouprename'),
[{
text: this.get_label('save'),
+ 'class': 'mainaction',
click: function() {
var name;
@@ -5563,6 +5577,7 @@ function rcube_webmail()
this.show_popup_dialog(content, this.get_label('searchsave'),
[{
text: this.get_label('save'),
+ 'class': 'mainaction',
click: function() {
var name;
@@ -6347,7 +6362,7 @@ function rcube_webmail()
};
// display a system message, list of types in common.css (below #message definition)
- this.display_message = function(msg, type, timeout)
+ this.display_message = function(msg, type, timeout, key)
{
// pass command to parent window
if (this.is_framed())
@@ -6356,18 +6371,34 @@ function rcube_webmail()
if (!this.gui_objects.message) {
// save message in order to display after page loaded
if (type != 'loading')
- this.pending_message = [msg, type, timeout];
+ this.pending_message = [msg, type, timeout, key];
return 1;
}
- type = type ? type : 'notice';
+ if (!type)
+ type = 'notice';
+
+ if (!key)
+ key = this.html_identifier(msg);
- var key = this.html_identifier(msg),
- date = new Date(),
+ var date = new Date(),
id = type + date.getTime();
- if (!timeout)
- timeout = this.message_time * (type == 'error' || type == 'warning' ? 2 : 1);
+ if (!timeout) {
+ switch (type) {
+ case 'error':
+ case 'warning':
+ timeout = this.message_time * 2;
+ break;
+
+ case 'uploading':
+ timeout = 0;
+ break;
+
+ default:
+ timeout = this.message_time;
+ }
+ }
if (type == 'loading') {
key = 'loading';
@@ -6400,7 +6431,7 @@ function rcube_webmail()
if (type == 'loading') {
this.messages[key].labels = [{'id': id, 'msg': msg}];
}
- else {
+ else if (type != 'uploading') {
obj.click(function() { return ref.hide_message(obj); })
.attr('role', 'alert');
}
@@ -6409,6 +6440,7 @@ function rcube_webmail()
if (timeout > 0)
setTimeout(function() { ref.hide_message(id, type != 'loading'); }, timeout);
+
return id;
};
@@ -6487,6 +6519,35 @@ function rcube_webmail()
this.messages = {};
};
+ // display uploading message with progress indicator
+ // data should contain: name, total, current, percent, text
+ this.display_progress = function(data)
+ {
+ if (!data || !data.name)
+ return;
+
+ var msg = this.messages['progress' + data.name];
+
+ if (!data.label)
+ data.label = this.get_label('uploadingmany');
+
+ if (!msg) {
+ if (!data.percent || data.percent < 100)
+ this.display_message(data.label, 'uploading', 0, 'progress' + data.name);
+ return;
+ }
+
+ if (!data.total || data.percent >= 100) {
+ this.hide_message(msg.obj);
+ return;
+ }
+
+ if (data.text)
+ data.label += ' ' + data.text;
+
+ msg.obj.text(data.label);
+ };
+
// open a jquery UI dialog with the given content
this.show_popup_dialog = function(content, title, buttons, options)
{
@@ -6520,6 +6581,11 @@ function rcube_webmail()
width: Math.min(w - 20, width + 36)
});
+ // assign special classes to dialog buttons
+ $.each(options.button_classes || [], function(i, v) {
+ if (v) $($('.ui-dialog-buttonpane button.ui-button', popup.parent()).get(i)).addClass(v);
+ });
+
return popup;
};
@@ -7982,7 +8048,7 @@ function rcube_webmail()
img.onload = function() { ref.env.browser_capabilities.tif = 1; };
img.onerror = function() { ref.env.browser_capabilities.tif = 0; };
- img.src = 'program/resources/blank.tif';
+ img.src = this.assets_path('program/resources/blank.tif');
};
this.pdf_support_check = function()
@@ -8039,6 +8105,15 @@ function rcube_webmail()
return 0;
};
+ this.assets_path = function(path)
+ {
+ if (this.env.assets_path && !path.startsWith(this.env.assets_path)) {
+ path = this.env.assets_path + path;
+ }
+
+ return path;
+ };
+
// Cookie setter
this.set_cookie = function(name, value, expires)
{