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.js322
1 files changed, 243 insertions, 79 deletions
diff --git a/program/js/app.js b/program/js/app.js
index a5ae90d05..47545e240 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -13,6 +13,7 @@
$Id$
*/
+
// Constants
var CONTROL_KEY = 1;
var SHIFT_KEY = 2;
@@ -247,6 +248,9 @@ function rcube_webmail()
document.onmousedown = function(){ return rcube_webmail_client.reset_click(); };
document.onkeydown = function(e){ return rcube_webmail_client.key_pressed(e, msg_list_frame); };
+ // set default keep alive interval
+ if (!this.keep_alive_interval)
+ this.keep_alive_interval = this._interval;
// flag object as complete
this.loaded = true;
@@ -256,23 +260,27 @@ function rcube_webmail()
this.display_message(this.pending_message[0], this.pending_message[1]);
// start interval for keep-alive/recent_check signal
- if (this._interval && this.task=='mail' && this.gui_objects.messagelist)
+ if (this.keep_alive_interval && this.task=='mail' && this.gui_objects.messagelist)
this._int = setInterval(this.ref+'.check_for_recent()', this.keep_alive_interval);
else if (this.task!='login')
this._int = setInterval(this.ref+'.send_keep_alive()', this.keep_alive_interval);
};
// reset last clicked if user clicks on anything other than the message table
- this.reset_click = function() {
+ this.reset_click = function()
+ {
+ var id;
this.in_message_list = false;
- 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] && this.list_rows[id].obj)
+ {
this.set_classname(this.list_rows[id].obj, 'selected', false);
this.set_classname(this.list_rows[id].obj, 'unfocused', true);
- }
- }
- };
+ }
+ }
+ };
this.click_on_list = function(e)
{
@@ -619,9 +627,10 @@ function rcube_webmail()
if (this.env.search_request<0 || (this.env.search_request && props != this.env.mailbox))
this.reset_qsearch();
- // Reset message list header, unless returning from compose/read/etc
- if (this.env.mailbox != props && this.message_rows)
- this.clear_message_list_header();
+ // Reset message list header, unless returning from compose/read/etc
+ // don't know what this is good for (thomasb, 2006/07/25)
+ //if (this.env.mailbox != props && this.message_rows)
+ // this.clear_message_list_header();
this.list_mailbox(props);
}
@@ -645,7 +654,7 @@ function rcube_webmail()
else
sort_order = this.env.sort_order;
}
-
+
if (this.env.sort_col==sort_col && this.env.sort_order==sort_order)
break;
@@ -1406,7 +1415,9 @@ function rcube_webmail()
}
}
}
- if (this.last_selected != 0) { this.set_classname(this.list_rows[this.last_selected].obj, 'focused', false);}
+ if (this.last_selected != 0 && this.list_rows[this.last_selected])
+ this.set_classname(this.list_rows[this.last_selected].obj, 'focused', false);
+
this.last_selected = id;
this.set_classname(this.list_rows[id].obj, 'focused', true);
};
@@ -1596,19 +1607,25 @@ function rcube_webmail()
};
+
this.clear_message_list_header = function()
{
- var table = this.gui_objects.messagelist;
-
- var colgroup = document.createElement('COLGROUP');
- table.removeChild(table.colgroup);
- table.insertBefore(colgroup, table.thead);
+ var table;
+ if (table = this.gui_objects.messagelist)
+ {
+ if (table.colgroup)
+ table.removeChild(table.colgroup);
+ if (table.tHead)
+ table.removeChild(table.tHead);
- var thead = document.createElement('THEAD');
- table.removeChild(table.thead);
- table.insertBefore(thead, table.tBodies[0]);
+ var colgroup = document.createElement('COLGROUP');
+ var thead = document.createElement('THEAD');
+ table.insertBefore(colgroup, table.tBodies[0]);
+ table.insertBefore(thead, table.tBodies[0]);
+ }
};
+
this.expunge_mailbox = function(mbox)
{
var lock = false;
@@ -2640,8 +2657,12 @@ function rcube_webmail()
};
+ // tell server to create and subscribe a new mailbox
this.create_folder = function(name)
{
+ if (this.edit_folder)
+ this.reset_folder_rename();
+
var form;
if ((form = this.gui_objects.editform) && form.elements['_folder_name'])
name = form.elements['_folder_name'].value;
@@ -2652,37 +2673,192 @@ function rcube_webmail()
form.elements['_folder_name'].focus();
};
+
+ // entry point for folder renaming
this.rename_folder = function(props)
{
- var form;
- if ((form = this.gui_objects.editform) && form.elements['_folder_oldname'] && form.elements['_folder_newname'])
- {
+ var form, oldname, newname;
+
+ // rename a specific mailbox
+ if (props)
+ this.edit_foldername(props);
+
+ // use a dropdown and input field (old behavior)
+ else if ((form = this.gui_objects.editform) && form.elements['_folder_oldname'] && form.elements['_folder_newname'])
+ {
oldname = form.elements['_folder_oldname'].value;
newname = form.elements['_folder_newname'].value;
}
if (oldname && newname)
this.http_request('rename-folder', '_folder_oldname='+escape(oldname)+'&_folder_newname='+escape(newname));
+ };
+
+
+ // start editing the mailbox name.
+ // this will replace the name string with an input field
+ this.edit_foldername = function(folder)
+ {
+ var temp, row, form;
+ var id = this.get_folder_row_id(folder);
+ // reset current renaming
+ if (temp = this.edit_folder)
+ {
+ this.reset_folder_rename();
+ if (temp == id)
+ return;
+ }
+
+ if (id && (row = document.getElementById(id)))
+ {
+ this.name_input = document.createElement('INPUT');
+ this.name_input.value = this.env.subscriptionrows[id];
+ this.name_input.style.width = '100%';
+ this.name_input.onkeypress = function(e){ rcmail.name_input_keypress(e); };
+
+ row.cells[0].replaceChild(this.name_input, row.cells[0].firstChild);
+ this.edit_folder = id;
+ this.name_input.select();
+
+ if (form = this.gui_objects.editform)
+ form.onsubmit = function(){ return false; };
+ }
+ };
+
+
+ // remove the input field and write the current mailbox name to the table cell
+ this.reset_folder_rename = function()
+ {
+ var cell = this.name_input ? this.name_input.parentNode : null;
+ if (cell && this.edit_folder)
+ cell.innerHTML = this.env.subscriptionrows[this.edit_folder];
+
+ this.edit_folder = null;
};
+ // handler for keyboard events on the input field
+ this.name_input_keypress = function(e)
+ {
+ var key = document.all ? event.keyCode : document.getElementById ? e.keyCode : 0;
+
+ // enter
+ if (key==13)
+ {
+ var newname = this.name_input ? this.name_input.value : null;
+ if (this.edit_folder && newname)
+ this.http_request('rename-folder', '_folder_oldname='+escape(this.env.subscriptionrows[this.edit_folder])+'&_folder_newname='+escape(newname));
+ }
+ // escape
+ else if (key==27)
+ this.reset_folder_rename();
+ };
+
+
+ // delete a specific mailbox with all its messages
this.delete_folder = function(folder)
{
+ if (this.edit_folder)
+ this.reset_folder_rename();
+
if (folder)
- {
this.http_request('delete-folder', '_mboxes='+escape(folder));
- }
};
- this.remove_folder_row = function(folder)
+ // add a new folder to the subscription list by cloning a folder row
+ this.add_folder_row = function(name, replace)
{
- for (var id in this.env.subscriptionrows)
- if (this.env.subscriptionrows[id]==folder)
+ name = name.replace('\\',"");
+ if (!this.gui_objects.subscriptionlist)
+ return false;
+
+ for (var refid in this.env.subscriptionrows)
+ if (this.env.subscriptionrows[refid]!=null)
break;
+ var refrow, form;
+ var tbody = this.gui_objects.subscriptionlist.tBodies[0];
+ var id = replace && replace.id ? replace.id : tbody.childNodes.length+1;
+
+ if (!id || !(refrow = document.getElementById(refid)))
+ {
+ // Refresh page if we don't have a table row to clone
+ location.href = this.env.comm_path+'&_action=folders';
+ }
+ else
+ {
+ // clone a table row if there are existing rows
+ var row = this.clone_table_row(refrow);
+ row.id = 'rcmrow'+id;
+ if (replace)
+ tbody.replaceChild(row, replace);
+ else
+ tbody.appendChild(row);
+ }
+
+ // add to folder/row-ID map
+ this.env.subscriptionrows[row.id] = name;
+
+ // set folder name
+ row.cells[0].innerHTML = name;
+ if (row.cells[1] && row.cells[1].firstChild.tagName=='INPUT')
+ {
+ row.cells[1].firstChild.value = name;
+ row.cells[1].firstChild.checked = true;
+ }
+
+ if (row.cells[2] && row.cells[2].firstChild.tagName=='A')
+ row.cells[2].firstChild.onclick = new Function(this.ref+".command('rename-folder','"+name.replace('\'','\\\'')+"')");
+ if (row.cells[3] && row.cells[3].firstChild.tagName=='A')
+ row.cells[3].firstChild.onclick = new Function(this.ref+".command('delete-folder','"+name.replace('\'','\\\'')+"')");
+
+ // add new folder to rename-folder list and clear input field
+ if (!replace && (form = this.gui_objects.editform) && form.elements['_folder_name'])
+ {
+ form.elements['_folder_oldname'].options[form.elements['_folder_oldname'].options.length] = new Option(name,name);
+ form.elements['_folder_name'].value = '';
+ }
+
+ };
+
+
+ // replace an existing table row with a new folder line
+ this.replace_folder_row = function(newfolder, oldfolder)
+ {
+ var id = this.get_folder_row_id(oldfolder);
+ var row = document.getElementById(id);
+
+ // replace an existing table row (if found)
+ this.add_folder_row(newfolder, row);
+ this.env.subscriptionrows[id] = null;
+
+ // rename folder in rename-folder dropdown
+ var form, elm;
+ if ((form = this.gui_objects.editform) && (elm = form.elements['_folder_oldname']))
+ {
+ for (var i=0;i<elm.options.length;i++)
+ {
+ if (elm.options[i].value == oldfolder)
+ {
+ elm.options[i].text = newfolder;
+ elm.options[i].value = newfolder;
+ break;
+ }
+ }
+
+ form.elements['_folder_newname'].value = '';
+ }
+ };
+
+
+ // remove the table row of a specific mailbox from the table
+ // (the row will not be removed, just hidden)
+ this.remove_folder_row = function(folder)
+ {
var row;
+ var id = this.get_folder_row_id(folder);
if (id && (row = document.getElementById(id)))
row.style.display = 'none';
@@ -2693,13 +2869,14 @@ function rcube_webmail()
for (var i=0;i<form.elements['_folder_oldname'].options.length;i++)
{
if (form.elements['_folder_oldname'].options[i].value == folder)
- {
+ {
form.elements['_folder_oldname'].options[i] = null;
- break;
+ break;
}
}
}
- form.elements['_folder_newname'].value='';
+
+ form.elements['_folder_newname'].value = '';
};
@@ -2759,52 +2936,15 @@ function rcube_webmail()
};
-
- // add a new folder to the subscription list by cloning a folder row
- this.add_folder_row = function(name)
- {
- name = name.replace('\\',"");
- if (!this.gui_objects.subscriptionlist)
- return false;
-
- var tbody = this.gui_objects.subscriptionlist.tBodies[0];
- var id = tbody.childNodes.length+1;
-
- if (!tbody.rows[0])
- {
- // Refresh to create the first table row
- location.href = this.env.comm_path+'&_action=folders';
- }
- else
- {
- // clone a table row if there are existing rows
- var row = this.clone_table_row(tbody.rows[0]);
- row.id = 'rcmrow'+id;
- tbody.appendChild(row);
- }
-
- // add to folder/row-ID map
- this.env.subscriptionrows[row.id] = name;
-
- // set folder name
- row.cells[0].innerHTML = name;
- if (row.cells[1].firstChild.tagName=='INPUT')
- {
- row.cells[1].firstChild.value = name;
- row.cells[1].firstChild.checked = true;
- }
- if (row.cells[2].firstChild.tagName=='A')
- row.cells[2].firstChild.onclick = new Function(this.ref+".command('delete-folder','"+name.replace('\'','\\\'')+"')");
-
- var form;
- if ((form = this.gui_objects.editform) && form.elements['_folder_name'])
- form.elements['_folder_name'].value = '';
-
- // add new folder to rename-folder list
- form.elements['_folder_oldname'].options[form.elements['_folder_oldname'].options.length] = new Option(name,name);
-
- };
-
+ // helper method to find a specific mailbox row ID
+ this.get_folder_row_id = function(folder)
+ {
+ for (var id in this.env.subscriptionrows)
+ if (this.env.subscriptionrows[id]==folder)
+ break;
+
+ return id;
+ };
// duplicate a specific table row
this.clone_table_row = function(row)
@@ -3033,11 +3173,35 @@ function rcube_webmail()
this.env.mailbox = mbox;
};
+
// for reordering column array, Konqueror workaround
this.set_message_coltypes = function(coltypes)
{
- this.coltypes = coltypes;
- }
+ this.coltypes = coltypes;
+
+ // set correct list titles
+ var cell, col;
+ var thead = this.gui_objects.messagelist ? this.gui_objects.messagelist.tHead : null;
+ for (var n=0; thead && n<this.coltypes.length; n++)
+ {
+ col = this.coltypes[n];
+ if ((cell = thead.rows[0].cells[n+1]) && (col=='from' || col=='to'))
+ {
+ // if we have links for sorting, it's a bit more complicated...
+ if (cell.firstChild && cell.firstChild.tagName=='A')
+ {
+ cell.firstChild.innerHTML = this.get_label(this.coltypes[n]);
+ cell.firstChild.onclick = function(){ return rcmail.command('sort', this.__col, this); };
+ cell.firstChild.__col = col;
+ }
+ else
+ cell.innerHTML = this.get_label(this.coltypes[n]);
+
+ cell.id = 'rcmHead'+col;
+ }
+ }
+
+ };
// create a table row in the message list
this.add_message_row = function(uid, cols, flags, attachment, attop)