| | |
| | | // set jQuery ajax options |
| | | jQuery.ajaxSetup({ cache:false, |
| | | error:function(request, status, err){ ref.http_error(request, status, err); }, |
| | | beforeSend:function(xmlhttp){ xmlhttp.setRequestHeader('X-RoundCube-Referer', bw.get_cookie('roundcube_sessid')); } |
| | | beforeSend:function(xmlhttp){ xmlhttp.setRequestHeader('X-RoundCube-Request', ref.env.request_token); } |
| | | }); |
| | | |
| | | // set environment variable(s) |
| | |
| | | this.goto_url('error', '_code=0x199'); |
| | | return; |
| | | } |
| | | |
| | | |
| | | // find all registered gui containers |
| | | for (var n in this.gui_containers) |
| | | this.gui_containers[n] = $('#'+this.gui_containers[n]); |
| | |
| | | // find all registered gui objects |
| | | for (var n in this.gui_objects) |
| | | this.gui_objects[n] = rcube_find_object(this.gui_objects[n]); |
| | | |
| | | // init registered buttons |
| | | this.init_buttons(); |
| | | |
| | | // tell parent window that this frame is loaded |
| | | if (this.env.framed && parent.rcmail && parent.rcmail.set_busy) |
| | |
| | | |
| | | if (this.env.permaurl) |
| | | this.enable_command('permaurl', true); |
| | | |
| | | |
| | | switch (this.task) |
| | | { |
| | | case 'mail': |
| | |
| | | this.message_list.addEventListener('keypress', function(o){ p.msglist_keypress(o); }); |
| | | this.message_list.addEventListener('select', function(o){ p.msglist_select(o); }); |
| | | this.message_list.addEventListener('dragstart', function(o){ p.drag_start(o); }); |
| | | this.message_list.addEventListener('dragmove', function(o, e){ p.drag_move(e); }); |
| | | this.message_list.addEventListener('dragend', function(o){ p.drag_active = false; }); |
| | | this.message_list.addEventListener('dragmove', function(e){ p.drag_move(e); }); |
| | | this.message_list.addEventListener('dragend', function(e){ p.drag_end(e); }); |
| | | document.onmouseup = function(e){ return p.doc_mouse_up(e); }; |
| | | |
| | | this.message_list.init(); |
| | |
| | | |
| | | if (this.env.action=='show' || this.env.action=='preview') |
| | | { |
| | | this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 'mark', 'viewsource', 'print', 'load-attachment', 'load-headers', true); |
| | | this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', |
| | | 'open', 'mark', 'edit', 'viewsource', 'download', 'print', 'load-attachment', 'load-headers', true); |
| | | |
| | | if (this.env.next_uid) |
| | | { |
| | | this.enable_command('nextmessage', true); |
| | |
| | | { |
| | | this.enable_command('previousmessage', true); |
| | | this.enable_command('firstmessage', true); |
| | | } |
| | | |
| | | if (this.env.blockedobjects) |
| | | { |
| | | if (this.gui_objects.remoteobjectsmsg) |
| | | this.gui_objects.remoteobjectsmsg.style.display = 'block'; |
| | | this.enable_command('load-images', 'always-load', true); |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | this.enable_command('compose', 'add-contact', false); |
| | | parent.rcmail.show_contentframe(true); |
| | | } |
| | | |
| | | if ((this.env.action=='show' || this.env.action=='preview') && this.env.blockedobjects) |
| | | { |
| | | if (this.gui_objects.remoteobjectsmsg) |
| | | this.gui_objects.remoteobjectsmsg.style.display = 'block'; |
| | | this.enable_command('load-images', 'always-load', true); |
| | | } |
| | | |
| | | if (this.env.action=='compose') |
| | |
| | | this.enable_command('savedraft', true); |
| | | |
| | | document.onmouseup = function(e){ return p.doc_mouse_up(e); }; |
| | | |
| | | // init message compose form |
| | | this.init_messageform(); |
| | | } |
| | | |
| | | if (this.env.messagecount) |
| | |
| | | this.enable_command('purge', true); |
| | | |
| | | this.set_page_buttons(); |
| | | |
| | | // init message compose form |
| | | if (this.env.action=='compose') |
| | | this.init_messageform(); |
| | | |
| | | // show printing dialog |
| | | if (this.env.action=='print') |
| | |
| | | if (this.gui_objects.contactslist) |
| | | { |
| | | this.contact_list = new rcube_list_widget(this.gui_objects.contactslist, {multiselect:true, draggable:true, keyboard:true}); |
| | | this.contact_list.row_init = function(row){ p.triggerEvent('insertrow', { cid:row.uid, row:row }); }; |
| | | this.contact_list.addEventListener('keypress', function(o){ p.contactlist_keypress(o); }); |
| | | this.contact_list.addEventListener('select', function(o){ p.contactlist_select(o); }); |
| | | this.contact_list.addEventListener('dragstart', function(o){ p.drag_start(o); }); |
| | | this.contact_list.addEventListener('dragmove', function(o, e){ p.drag_move(e); }); |
| | | this.contact_list.addEventListener('dragend', function(o){ p.drag_active = false; }); |
| | | this.contact_list.addEventListener('dragmove', function(e){ p.drag_move(e); }); |
| | | this.contact_list.addEventListener('dragend', function(e){ p.drag_end(e); }); |
| | | this.contact_list.init(); |
| | | |
| | | if (this.env.cid) |
| | |
| | | case 'settings': |
| | | this.enable_command('preferences', 'identities', 'save', 'folders', true); |
| | | |
| | | if (this.env.action=='identities' || this.env.action=='edit-identity' || this.env.action=='add-identity') { |
| | | if (this.env.action=='identities') { |
| | | this.enable_command('add', this.env.identities_level < 2); |
| | | this.enable_command('delete', 'edit', true); |
| | | } |
| | | |
| | | if (this.env.action=='edit-identity' || this.env.action=='add-identity') |
| | | this.enable_command('save', true); |
| | | |
| | | if (this.env.action=='folders') |
| | | } |
| | | else if (this.env.action=='edit-identity' || this.env.action=='add-identity') { |
| | | this.enable_command('add', this.env.identities_level < 2); |
| | | this.enable_command('save', 'delete', 'edit', true); |
| | | } |
| | | else if (this.env.action=='folders') |
| | | this.enable_command('subscribe', 'unsubscribe', 'create-folder', 'rename-folder', 'delete-folder', true); |
| | | |
| | | if (this.gui_objects.identitieslist) |
| | |
| | | if (this.env.iid) |
| | | this.identity_list.highlight_row(this.env.iid); |
| | | } |
| | | |
| | | if (this.gui_objects.subscriptionlist) |
| | | else if (this.gui_objects.sectionslist) |
| | | { |
| | | this.sections_list = new rcube_list_widget(this.gui_objects.sectionslist, {multiselect:false, draggable:false, keyboard:false}); |
| | | this.sections_list.addEventListener('select', function(o){ p.section_select(o); }); |
| | | this.sections_list.init(); |
| | | this.sections_list.focus(); |
| | | } |
| | | else if (this.gui_objects.subscriptionlist) |
| | | this.init_subscription_list(); |
| | | |
| | | break; |
| | |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | // enable basic commands |
| | | this.enable_command('logout', true); |
| | | |
| | | // flag object as complete |
| | | this.loaded = true; |
| | |
| | | } |
| | | |
| | | // set eventhandler to message icon |
| | | if (row.icon = row.obj.getElementsByTagName('TD')[0].getElementsByTagName('IMG')[0]) |
| | | if (row.icon = row.obj.getElementsByTagName('td')[0].getElementsByTagName('img')[0]) |
| | | { |
| | | var p = this; |
| | | row.icon.id = 'msgicn_'+row.uid; |
| | |
| | | } |
| | | |
| | | // set eventhandler to flag icon, if icon found |
| | | if (this.env.flagged_col && (row.flagged_icon = row.obj.getElementsByTagName('TD')[this.env.flagged_col].getElementsByTagName('IMG')[0])) |
| | | if (this.env.flagged_col && (row.flagged_icon = row.obj.getElementsByTagName('td')[this.env.flagged_col].getElementsByTagName('img')[0])) |
| | | { |
| | | var p = this; |
| | | row.flagged_icon.id = 'flaggedicn_'+row.uid; |
| | | row.flagged_icon._row = row.obj; |
| | | row.flagged_icon.onmousedown = function(e) { p.command('toggle_flag', this); }; |
| | | } |
| | | |
| | | this.triggerEvent('insertrow', { uid:uid, row:row }); |
| | | }; |
| | | |
| | | // init message compose form: set focus and eventhandlers |
| | |
| | | else if (input_subject.val() == '') |
| | | input_subject.focus(); |
| | | else if (input_message) |
| | | this.set_caret2start(input_message); |
| | | input_message.focus(); |
| | | |
| | | // get summary of all field values |
| | | this.compose_field_hash(true); |
| | |
| | | this.init_address_input_events = function(obj) |
| | | { |
| | | var handler = function(e){ return ref.ksearch_keypress(e,this); }; |
| | | obj.bind((bw.safari ? 'keydown' : 'keypress'), handler); |
| | | obj.bind((bw.safari || bw.ie ? 'keydown' : 'keypress'), handler); |
| | | obj.attr('autocomplete', 'off'); |
| | | }; |
| | | |
| | |
| | | this.gui_objects.loginform.submit(); |
| | | break; |
| | | |
| | | case 'logout': |
| | | this.goto_url('logout', '', true); |
| | | break; |
| | | |
| | | // commands to switch task |
| | | case 'mail': |
| | | case 'addressbook': |
| | | case 'settings': |
| | | case 'logout': |
| | | this.switch_task(command); |
| | | break; |
| | | |
| | |
| | | return true; |
| | | else if (this.env.permaurl) |
| | | parent.location.href = this.env.permaurl; |
| | | break; |
| | | break; |
| | | |
| | | case 'open': |
| | | var uid; |
| | | if (uid = this.get_single_uid()) |
| | | { |
| | | obj.href = '?_task='+this.env.task+'&_action=show&_mbox='+urlencode(this.env.mailbox)+'&_uid='+uid; |
| | | return true; |
| | | } |
| | | break; |
| | | |
| | | // misc list commands |
| | | case 'list': |
| | |
| | | this.load_contact(cid, 'edit'); |
| | | else if (this.task=='settings' && props) |
| | | this.load_identity(props, 'edit-identity'); |
| | | else if (this.task=='mail' && (cid = this.get_single_uid())) { |
| | | var url = (this.env.mailbox == this.env.drafts_mailbox) ? '_draft_uid=' : '_uid='; |
| | | this.goto_url('compose', url+cid+'&_mbox='+urlencode(this.env.mailbox), true); |
| | | } |
| | | break; |
| | | |
| | | case 'save-identity': |
| | |
| | | break; |
| | | |
| | | case 'select-all': |
| | | this.message_list.select_all(props); |
| | | if (props == 'invert') |
| | | this.message_list.invert_selection(); |
| | | else |
| | | this.message_list.select_all(props); |
| | | break; |
| | | |
| | | case 'select-none': |
| | |
| | | break; |
| | | |
| | | case 'spellcheck': |
| | | if (window.tinyMCE && tinyMCE.get('compose-body')) { |
| | | if (window.tinyMCE && tinyMCE.get(this.env.composebody)) { |
| | | tinyMCE.execCommand('mceSpellCheck', true); |
| | | } |
| | | else if (this.env.spellcheck && this.env.spellcheck.spellCheck && this.spellcheck_ready) { |
| | |
| | | var uid; |
| | | if (uid = this.get_single_uid()) |
| | | { |
| | | ref.sourcewin = window.open(this.env.comm_path+'&_action=viewsource&_uid='+this.env.uid+'&_mbox='+urlencode(this.env.mailbox)); |
| | | ref.sourcewin = window.open(this.env.comm_path+'&_action=viewsource&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)); |
| | | if (this.sourcewin) |
| | | window.setTimeout(function(){ ref.sourcewin.focus(); }, 20); |
| | | } |
| | | break; |
| | | |
| | | case 'download': |
| | | var uid; |
| | | if (uid = this.get_single_uid()) |
| | | this.goto_url('viewsource', '&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+'&_save=1'); |
| | | break; |
| | | |
| | | case 'add-contact': |
| | |
| | | this.env.folder_coords = new Array(); |
| | | for (var k in model) { |
| | | if (li = this.get_folder_li(k)) { |
| | | pos = $(li.firstChild).offset(); |
| | | // only visible folders |
| | | if (height = li.firstChild.offsetHeight) |
| | | this.env.folder_coords[k] = { x1:pos.left, y1:pos.top, x2:pos.left + li.firstChild.offsetWidth, y2:pos.top + height }; |
| | | if (height = li.firstChild.offsetHeight) { |
| | | pos = $(li.firstChild).offset(); |
| | | this.env.folder_coords[k] = { x1:pos.left, y1:pos.top, |
| | | x2:pos.left + li.firstChild.offsetWidth, y2:pos.top + height, on:0 }; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | this.drag_end = function(e) |
| | | { |
| | | this.drag_active = false; |
| | | this.env.last_folder_target = null; |
| | | |
| | | if (this.folder_auto_timer) { |
| | | window.clearTimeout(this.folder_auto_timer); |
| | | this.folder_auto_timer = null; |
| | | this.folder_auto_expand = null; |
| | | } |
| | | |
| | | // over the folders |
| | | if (this.gui_objects.folderlist && this.env.folder_coords) { |
| | | for (var k in this.env.folder_coords) { |
| | | if (this.env.folder_coords[k].on) |
| | | $(this.get_folder_li(k)).removeClass('droptarget'); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | this.drag_move = function(e) |
| | | { |
| | | if (this.gui_objects.folderlist && this.env.folder_coords) { |
| | |
| | | var moffset = this.initialListScrollTop-this.gui_objects.folderlist.parentNode.scrollTop; |
| | | var toffset = -moffset-boffset; |
| | | |
| | | var li, pos, mouse; |
| | | var li, div, pos, mouse; |
| | | mouse = rcube_event.get_mouse_pos(e); |
| | | pos = this.env.folderlist_coords; |
| | | |
| | | mouse.y += toffset; |
| | | |
| | | // if mouse pointer is outside of folderlist |
| | | if (mouse.x < pos.x1 || mouse.x >= pos.x2 || mouse.y < pos.y1 || mouse.y >= pos.y2) { |
| | | if (this.env.last_folder_target) { |
| | | $(this.get_folder_li(this.env.last_folder_target)).removeClass('droptarget'); |
| | | this.env.folder_coords[this.env.last_folder_target].on = 0; |
| | | this.env.last_folder_target = null; |
| | | } |
| | | return; |
| | | } |
| | | |
| | | |
| | | // over the folders |
| | | for (var k in this.env.folder_coords) { |
| | | pos = this.env.folder_coords[k]; |
| | | if (this.check_droptarget(k) && ((mouse.x >= pos.x1) && (mouse.x < pos.x2) |
| | | && (mouse.y >= pos.y1) && (mouse.y < pos.y2))) { |
| | | $(this.get_folder_li(k)).addClass('droptarget'); |
| | | if (mouse.x >= pos.x1 && mouse.x < pos.x2 && mouse.y >= pos.y1 && mouse.y < pos.y2 |
| | | && this.check_droptarget(k)) { |
| | | |
| | | li = this.get_folder_li(k); |
| | | div = $(li.getElementsByTagName("div")[0]); |
| | | |
| | | // if the folder is collapsed, expand it after 1sec and restart the drag & drop process. |
| | | if (div.hasClass('collapsed')) { |
| | | if (this.folder_auto_timer) |
| | | window.clearTimeout(this.folder_auto_timer); |
| | | |
| | | this.folder_auto_expand = k; |
| | | this.folder_auto_timer = window.setTimeout(function() { |
| | | rcmail.command("collapse-folder", rcmail.folder_auto_expand); |
| | | rcmail.drag_start(null); |
| | | }, 1000); |
| | | } else if (this.folder_auto_timer) { |
| | | window.clearTimeout(this.folder_auto_timer); |
| | | this.folder_auto_timer = null; |
| | | this.folder_auto_expand = null; |
| | | } |
| | | |
| | | $(li).addClass('droptarget'); |
| | | this.env.last_folder_target = k; |
| | | this.env.folder_coords[k].on = 1; |
| | | } |
| | | else { |
| | | else if (pos.on) { |
| | | $(this.get_folder_li(k)).removeClass('droptarget'); |
| | | if (k == this.env.last_folder_target) |
| | | this.env.last_folder_target = null; |
| | | this.env.folder_coords[k].on = 0; |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | |
| | | this.collapse_folder = function(id) |
| | | { |
| | | var div; |
| | |
| | | if (this.env.mailbox == this.env.drafts_mailbox) |
| | | { |
| | | this.enable_command('reply', 'reply-all', 'forward', false); |
| | | this.enable_command('show', 'print', selected); |
| | | this.enable_command('show', 'print', 'open', 'edit', 'download', 'viewsource', selected); |
| | | this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false)); |
| | | } |
| | | else |
| | | { |
| | | this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', selected); |
| | | this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', 'edit', 'open', 'download', 'viewsource', selected); |
| | | this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false)); |
| | | } |
| | | |
| | |
| | | // list messages of a specific mailbox |
| | | this.list_mailbox = function(mbox, page, sort) |
| | | { |
| | | this.last_selected = 0; |
| | | var add_url = ''; |
| | | var target = window; |
| | | |
| | |
| | | add_url += '&_search='+this.env.search_request; |
| | | |
| | | // set page=1 if changeing to another mailbox |
| | | if (!page && mbox != this.env.mailbox) |
| | | if (!page) |
| | | { |
| | | page = 1; |
| | | this.env.current_page = page; |
| | | if (this.message_list) |
| | | this.message_list.clear_selection(); |
| | | this.show_contentframe(false); |
| | | } |
| | | |
| | | if (mbox != this.env.mailbox || (mbox == this.env.mailbox && !page && !sort)) |
| | | add_url += '&_refresh=1'; |
| | | |
| | | // unselect selected messages |
| | | this.last_selected = 0; |
| | | if (this.message_list) |
| | | this.message_list.clear_selection(); |
| | | |
| | | this.select_folder(mbox, this.env.mailbox); |
| | | this.env.mailbox = mbox; |
| | |
| | | lock = true; |
| | | this.set_busy(true, 'movingmessage'); |
| | | } |
| | | else if (!this.env.flag_for_deletion) |
| | | else |
| | | this.show_contentframe(false); |
| | | |
| | | // Hide message command buttons until a message is selected |
| | | this.enable_command('reply', 'reply-all', 'forward', 'delete', 'mark', 'print', false); |
| | | this.enable_command('reply', 'reply-all', 'forward', 'delete', 'mark', 'print', 'open', 'edit', 'viewsource', 'download', false); |
| | | |
| | | this._with_selected_messages('moveto', lock, add_url, (this.env.flag_for_deletion ? false : true)); |
| | | this._with_selected_messages('moveto', lock, add_url); |
| | | }; |
| | | |
| | | // delete selected messages from the current mailbox |
| | |
| | | |
| | | // exit if no mailbox specified or if selection is empty |
| | | if (!this.env.uid && !selection.length) |
| | | return; |
| | | return; |
| | | |
| | | // if there is a trash mailbox defined and we're not currently in it: |
| | | if (this.env.trash_mailbox && String(this.env.mailbox).toLowerCase() != String(this.env.trash_mailbox).toLowerCase()) |
| | | { |
| | | // if config is set to flag for deletion |
| | | if (this.env.flag_for_deletion) |
| | | this.mark_message('delete'); |
| | | // if there isn't a defined trash mailbox or we are in it |
| | | else if (!this.env.trash_mailbox || String(this.env.mailbox).toLowerCase() == String(this.env.trash_mailbox).toLowerCase()) |
| | | this.permanently_remove_messages(); |
| | | // if there is a trash mailbox defined and we're not currently in it |
| | | else { |
| | | // if shift was pressed delete it immediately |
| | | if (this.message_list && this.message_list.shiftkey) |
| | | { |
| | |
| | | else |
| | | this.move_messages(this.env.trash_mailbox); |
| | | } |
| | | // if there is a trash mailbox defined but we *are* in it: |
| | | else if (this.env.trash_mailbox && String(this.env.mailbox).toLowerCase() == String(this.env.trash_mailbox).toLowerCase()) |
| | | this.permanently_remove_messages(); |
| | | // if there isn't a defined trash mailbox and the config is set to flag for deletion |
| | | else if (!this.env.trash_mailbox && this.env.flag_for_deletion) |
| | | { |
| | | this.mark_message('delete'); |
| | | if(this.env.action=="show") |
| | | this.command('nextmessage','',this); |
| | | else if (selection.length == 1) |
| | | this.message_list.select_next(); |
| | | } |
| | | // if there isn't a defined trash mailbox and the config is set NOT to flag for deletion |
| | | else if (!this.env.trash_mailbox) |
| | | this.permanently_remove_messages(); |
| | | }; |
| | | |
| | | // delete the selected messages permanently |
| | |
| | | return; |
| | | |
| | | this.show_contentframe(false); |
| | | this._with_selected_messages('delete', false, '&_from='+(this.env.action ? this.env.action : ''), true); |
| | | this._with_selected_messages('delete', false, '&_from='+(this.env.action ? this.env.action : '')); |
| | | }; |
| | | |
| | | // Send a specifc request with UIDs of all selected messages |
| | |
| | | var selection = this.message_list.get_selection(); |
| | | var rows = this.message_list.rows; |
| | | var id; |
| | | for (var n=0; n<selection.length; n++) |
| | | { |
| | | for (var n=0; n<selection.length; n++) { |
| | | id = selection[n]; |
| | | a_uids[a_uids.length] = id; |
| | | |
| | | if (remove) |
| | | this.message_list.remove_row(id, (n == selection.length-1)); |
| | | else |
| | | { |
| | | this.set_message_status(id, 'deleted', true); |
| | | if (this.env.read_when_deleted) |
| | | this.set_message_status(id, 'unread', false); |
| | | this.set_message(id); |
| | | } |
| | | this.message_list.remove_row(id, (this.env.display_next && n == selection.length-1)); |
| | | } |
| | | // make sure there are no selected rows |
| | | if (!this.env.display_next) |
| | | this.message_list.clear_selection(); |
| | | } |
| | | |
| | | // also send search request to get the right messages |
| | | if (this.env.search_request) |
| | | add_url += '&_search='+this.env.search_request; |
| | | |
| | | if (this.env.display_next && this.env.next_uid) |
| | | add_url += '&_next_uid='+this.env.next_uid; |
| | | |
| | | // send request to server |
| | | this.http_post(action, '_uid='+a_uids.join(',')+'&_mbox='+urlencode(this.env.mailbox)+add_url, lock); |
| | |
| | | uid = a_uids[i]; |
| | | if (rows[uid]) |
| | | { |
| | | this.set_message(uid, 'deleted', true); |
| | | if (rows[uid].unread) |
| | | r_uids[r_uids.length] = uid; |
| | | |
| | | if (this.env.skip_deleted) |
| | | this.message_list.remove_row(uid, (this.env.display_next && i == this.message_list.selection.length-1)); |
| | | else |
| | | this.set_message(uid, 'deleted', true); |
| | | } |
| | | } |
| | | |
| | | if (r_uids.length) |
| | | add_url = '&_ruid='+r_uids.join(','); |
| | | // make sure there are no selected rows |
| | | if (this.env.skip_deleted && !this.env.display_next && this.message_list) |
| | | this.message_list.clear_selection(); |
| | | |
| | | add_url = '&_from='+(this.env.action ? this.env.action : ''); |
| | | |
| | | if (r_uids.length) |
| | | add_url += '&_ruid='+r_uids.join(','); |
| | | |
| | | if (this.env.skip_deleted) { |
| | | // also send search request to get the right messages |
| | | if (this.env.search_request) |
| | | add_url += '&_search='+this.env.search_request; |
| | | if (this.env.display_next && this.env.next_uid) |
| | | add_url += '&_next_uid='+this.env.next_uid; |
| | | } |
| | | |
| | | this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag=delete'+add_url); |
| | | return true; |
| | | }; |
| | |
| | | } |
| | | |
| | | // check for empty body |
| | | if ((!window.tinyMCE || !tinyMCE.get('compose-body')) && input_message.val() == '' && !confirm(this.get_label('nobodywarning'))) |
| | | if ((!window.tinyMCE || !tinyMCE.get(this.env.composebody)) |
| | | && input_message.val() == '' && !confirm(this.get_label('nobodywarning'))) |
| | | { |
| | | input_message.focus(); |
| | | return false; |
| | | } |
| | | else if (window.tinyMCE && tinyMCE.get('compose-body') && !tinyMCE.get('compose-body').getContent() && !confirm(this.get_label('nobodywarning'))) |
| | | else if (window.tinyMCE && tinyMCE.get(this.env.composebody) |
| | | && !tinyMCE.get(this.env.composebody).getContent() |
| | | && !confirm(this.get_label('nobodywarning'))) |
| | | { |
| | | tinyMCE.get('compose-body').focus(); |
| | | tinyMCE.get(this.env.composebody).focus(); |
| | | return false; |
| | | } |
| | | |
| | | // Apply spellcheck changes if spell checker is active |
| | | this.stop_spellchecking(); |
| | | |
| | | // move body from html editor to textarea (just to be sure, #1485860) |
| | | if (window.tinyMCE && tinyMCE.get(this.env.composebody)) |
| | | tinyMCE.triggerSave(); |
| | | |
| | | return true; |
| | | }; |
| | |
| | | if (value_subject) |
| | | str += value_subject+':'; |
| | | |
| | | var editor = tinyMCE.get('compose-body'); |
| | | var editor = tinyMCE.get(this.env.composebody); |
| | | if (editor) |
| | | str += editor.getContent(); |
| | | else |
| | |
| | | var input_message = $("[name='_message']"); |
| | | var message = input_message.val(); |
| | | var is_html = ($("input[name='_is_html']").val() == '1'); |
| | | var sig, p; |
| | | var sig, p, len; |
| | | |
| | | if (!this.env.identity) |
| | | this.env.identity = id |
| | |
| | | } |
| | | |
| | | message = message.replace(/[\r\n]+$/, ''); |
| | | |
| | | len = message.length; |
| | | |
| | | // add the new signature string |
| | | if (this.env.signatures && this.env.signatures[id]) |
| | | { |
| | |
| | | if (sig.indexOf('-- ')!=0) |
| | | sig = '-- \n'+sig; |
| | | message += '\n\n'+sig; |
| | | if (len) len += 1; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var editor = tinyMCE.get('compose-body'); |
| | | var editor = tinyMCE.get(this.env.composebody); |
| | | |
| | | if (this.env.signatures) |
| | | { |
| | |
| | | } |
| | | |
| | | input_message.val(message); |
| | | |
| | | // move cursor before the signature |
| | | if (!is_html) |
| | | this.set_caret_pos(input_message.get(0), len); |
| | | |
| | | this.env.identity = id; |
| | | return true; |
| | |
| | | } |
| | | else // for standards-compilant browsers |
| | | { |
| | | var frame = document.createElement('IFRAME'); |
| | | var frame = document.createElement('iframe'); |
| | | frame.name = frame_name; |
| | | frame.style.border = 'none'; |
| | | frame.style.width = 0; |
| | |
| | | // trim query string |
| | | q = q.replace(/(^\s+|\s+$)/g, '').toLowerCase(); |
| | | |
| | | // Don't (re-)search if string is empty or if the last results are still active |
| | | if (!q.length || q == this.ksearch_value) |
| | | // Don't (re-)search if the last results are still active |
| | | if (q == this.ksearch_value) |
| | | return; |
| | | |
| | | var old_value = this.ksearch_value; |
| | | this.ksearch_value = q; |
| | | |
| | | // ...string is empty |
| | | if (!q.length) |
| | | return; |
| | | |
| | | this.ksearch_value = q; |
| | | // ...new search value contains old one and previous search result was empty |
| | | if (old_value && old_value.length && this.env.contacts && !this.env.contacts.length && q.indexOf(old_value) == 0) |
| | | return; |
| | | |
| | | this.display_message(this.get_label('searching'), 'loading', true); |
| | | this.http_post('autocomplete', '_search='+urlencode(q)); |
| | |
| | | this.subscription_list.addEventListener('dragend', function(o){ p.subscription_move_folder(o); }); |
| | | this.subscription_list.row_init = function (row) |
| | | { |
| | | var anchors = row.obj.getElementsByTagName('A'); |
| | | var anchors = row.obj.getElementsByTagName('a'); |
| | | if (anchors[0]) |
| | | anchors[0].onclick = function() { p.rename_folder(row.id); return false; }; |
| | | if (anchors[1]) |
| | |
| | | } |
| | | this.subscription_list.init(); |
| | | } |
| | | |
| | | // preferences section select and load options frame |
| | | this.section_select = function(list) |
| | | { |
| | | var id = list.get_single_selection() |
| | | |
| | | if (id) { |
| | | var add_url = ''; |
| | | var target = window; |
| | | this.set_busy(true); |
| | | |
| | | if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { |
| | | add_url = '&_framed=1'; |
| | | target = window.frames[this.env.contentframe]; |
| | | } |
| | | |
| | | target.location.href = this.env.comm_path+'&_action=edit-prefs&_section='+id+add_url; |
| | | } |
| | | |
| | | return true; |
| | | }; |
| | | |
| | | this.identity_select = function(list) |
| | | { |
| | |
| | | if (!id) |
| | | id = this.env.iid ? this.env.iid : selection[0]; |
| | | |
| | | // if (this.env.framed && id) |
| | | this.goto_url('delete-identity', '_iid='+id, true); |
| | | // append token to request |
| | | this.goto_url('delete-identity', '_iid='+id+'&_token='+this.env.request_token, true); |
| | | |
| | | return true; |
| | | }; |
| | | |
| | |
| | | if (id && this.env.subscriptionrows[id] && (row = document.getElementById(id))) |
| | | { |
| | | var reg = new RegExp('.*['+RegExp.escape(this.env.delimiter)+']'); |
| | | this.name_input = document.createElement('INPUT'); |
| | | this.name_input = document.createElement('input'); |
| | | this.name_input.type = 'text'; |
| | | this.name_input.value = this.env.subscriptionrows[id][0].replace(reg, ''); |
| | | |
| | | reg = new RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$'); |
| | |
| | | if (!replace) |
| | | row.cells[1].innerHTML = '*'; |
| | | |
| | | if (!replace && row.cells[2] && row.cells[2].firstChild.tagName=='INPUT') |
| | | if (!replace && row.cells[2] && row.cells[2].firstChild.tagName.toLowerCase()=='input') |
| | | { |
| | | row.cells[2].firstChild.value = name; |
| | | row.cells[2].firstChild.checked = true; |
| | |
| | | this.clone_table_row = function(row) |
| | | { |
| | | var cell, td; |
| | | var new_row = document.createElement('TR'); |
| | | var new_row = document.createElement('tr'); |
| | | for(var n=0; n<row.cells.length; n++) |
| | | { |
| | | cell = row.cells[n]; |
| | | td = document.createElement('TD'); |
| | | td = document.createElement('td'); |
| | | |
| | | if (cell.className) |
| | | td.className = cell.className; |
| | |
| | | |
| | | // eable/disable buttons for page shifting |
| | | this.set_page_buttons = function() |
| | | { |
| | | { |
| | | this.enable_command('nextpage', (this.env.pagecount > this.env.current_page)); |
| | | this.enable_command('lastpage', (this.env.pagecount > this.env.current_page)); |
| | | this.enable_command('previouspage', (this.env.current_page > 1)); |
| | | this.enable_command('firstpage', (this.env.current_page > 1)); |
| | | }; |
| | | |
| | | // set event handlers on registered buttons |
| | | this.init_buttons = function() |
| | | { |
| | | for (var cmd in this.buttons) { |
| | | if (typeof cmd != 'string') |
| | | continue; |
| | | |
| | | for (var i=0; i< this.buttons[cmd].length; i++) { |
| | | var prop = this.buttons[cmd][i]; |
| | | var elm = document.getElementById(prop.id); |
| | | if (!elm) |
| | | continue; |
| | | |
| | | var preload = false; |
| | | if (prop.type == 'image') { |
| | | elm = elm.parentNode; |
| | | preload = true; |
| | | } |
| | | |
| | | elm._command = cmd; |
| | | elm._id = prop.id; |
| | | if (prop.sel) { |
| | | elm.onmousedown = function(e){ return rcmail.button_sel(this._command, this._id); }; |
| | | elm.onmouseup = function(e){ return rcmail.button_out(this._command, this._id); }; |
| | | if (preload) |
| | | new Image().src = prop.sel; |
| | | } |
| | | if (prop.over) { |
| | | elm.onmouseover = function(e){ return rcmail.button_over(this._command, this._id); }; |
| | | elm.onmouseout = function(e){ return rcmail.button_out(this._command, this._id); }; |
| | | if (preload) |
| | | new Image().src = prop.over; |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // set button to a specific state |
| | | this.set_button = function(command, state) |
| | |
| | | if (button.type=='image' && obj) |
| | | { |
| | | obj.setAttribute('alt', this.get_label(label)); |
| | | if ((link = obj.parentNode) && link.tagName == 'A') |
| | | if ((link = obj.parentNode) && link.tagName.toLowerCase() == 'a') |
| | | link.setAttribute('title', this.get_label(label)); |
| | | } |
| | | else if (obj) |
| | |
| | | |
| | | // mouse over button |
| | | this.button_over = function(command, id) |
| | | { |
| | | { |
| | | var a_buttons = this.buttons[command]; |
| | | var button, img; |
| | | var button, elm; |
| | | |
| | | if(!a_buttons || !a_buttons.length) |
| | | return false; |
| | | |
| | | for(var n=0; n<a_buttons.length; n++) |
| | | { |
| | | { |
| | | button = a_buttons[n]; |
| | | if(button.id==id && button.status=='act') |
| | | { |
| | | img = document.getElementById(button.id); |
| | | if (img && button.over) |
| | | img.src = button.over; |
| | | { |
| | | elm = document.getElementById(button.id); |
| | | if (elm && button.over) { |
| | | if (button.type == 'image') |
| | | elm.src = button.over; |
| | | else |
| | | elm.className = button.over; |
| | | } |
| | | } |
| | | |
| | | }; |
| | | } |
| | | }; |
| | | |
| | | // mouse down on button |
| | | this.button_sel = function(command, id) |
| | | { |
| | | { |
| | | var a_buttons = this.buttons[command]; |
| | | var button, img; |
| | | var button, elm; |
| | | |
| | | if(!a_buttons || !a_buttons.length) |
| | | return; |
| | | |
| | | for(var n=0; n<a_buttons.length; n++) |
| | | { |
| | | { |
| | | button = a_buttons[n]; |
| | | if(button.id==id && button.status=='act') |
| | | { |
| | | img = document.getElementById(button.id); |
| | | if (img && button.sel) |
| | | img.src = button.sel; |
| | | { |
| | | elm = document.getElementById(button.id); |
| | | if (elm && button.sel) { |
| | | if (button.type == 'image') |
| | | elm.src = button.sel; |
| | | else |
| | | elm.className = button.sel; |
| | | } |
| | | } |
| | | }; |
| | | } |
| | | }; |
| | | |
| | | // mouse out of button |
| | | this.button_out = function(command, id) |
| | | { |
| | | { |
| | | var a_buttons = this.buttons[command]; |
| | | var button, img; |
| | | var button, elm; |
| | | |
| | | if(!a_buttons || !a_buttons.length) |
| | | return; |
| | | |
| | | for(var n=0; n<a_buttons.length; n++) |
| | | { |
| | | { |
| | | button = a_buttons[n]; |
| | | if(button.id==id && button.status=='act') |
| | | { |
| | | img = document.getElementById(button.id); |
| | | if (img && button.act) |
| | | img.src = button.act; |
| | | { |
| | | elm = document.getElementById(button.id); |
| | | if (elm && button.act) { |
| | | if (button.type == 'image') |
| | | elm.src = button.act; |
| | | else |
| | | elm.className = button.act; |
| | | } |
| | | } |
| | | }; |
| | | } |
| | | }; |
| | | |
| | | // write to the document/window title |
| | | this.set_pagetitle = function(title) |
| | |
| | | if ((current_li = this.get_folder_li(old))) { |
| | | $(current_li).removeClass('selected').removeClass('unfocused'); |
| | | } |
| | | |
| | | if ((target_li = this.get_folder_li(name))) { |
| | | $(target_li).removeClass('unfocused').addClass('selected'); |
| | | } |
| | |
| | | { |
| | | if (this.gui_objects.folderlist) |
| | | { |
| | | name = String(name).replace(this.identifier_expr, ''); |
| | | name = String(name).replace(this.identifier_expr, '_'); |
| | | return document.getElementById('rcmli'+name); |
| | | } |
| | | |
| | |
| | | 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') |
| | | if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a') |
| | | { |
| | | cell.firstChild.innerHTML = this.get_label(this.coltypes[n]); |
| | | cell.firstChild.onclick = function(){ return rcmail.command('sort', this.__col, this); }; |
| | |
| | | + (this.message_list.in_selection(uid) ? ' selected' : ''); |
| | | |
| | | // for performance use DOM instead of jQuery here |
| | | var row = document.createElement('TR'); |
| | | var row = document.createElement('tr'); |
| | | row.id = 'rcmrow'+uid; |
| | | row.className = css_class; |
| | | |
| | |
| | | icon = this.env.unreadicon; |
| | | |
| | | // add icon col |
| | | var col = document.createElement('TD'); |
| | | var col = document.createElement('td'); |
| | | col.className = 'icon'; |
| | | col.innerHTML = icon ? '<img src="'+icon+'" alt="" />' : ''; |
| | | row.appendChild(col); |
| | |
| | | // add each submitted col |
| | | for (var n = 0; n < this.coltypes.length; n++) { |
| | | var c = this.coltypes[n]; |
| | | col = document.createElement('TD'); |
| | | col = document.createElement('td'); |
| | | col.className = String(c).toLowerCase(); |
| | | |
| | | if (c=='flag') { |
| | |
| | | } |
| | | |
| | | this.message_list.insert_row(row, attop); |
| | | this.triggerEvent('insertrow', { uid:uid, row:row }); |
| | | |
| | | // remove 'old' row |
| | | if (attop && this.env.pagesize && this.message_list.rowcount > this.env.pagesize) { |
| | |
| | | var rowcount = tbody.rows.length; |
| | | var even = rowcount%2; |
| | | |
| | | var row = document.createElement('TR'); |
| | | var row = document.createElement('tr'); |
| | | row.id = 'rcmrow'+cid; |
| | | row.className = 'contact '+(even ? 'even' : 'odd'); |
| | | |
| | |
| | | |
| | | // add each submitted col |
| | | for (var c in cols) { |
| | | col = document.createElement('TD'); |
| | | col = document.createElement('td'); |
| | | col.className = String(c).toLowerCase(); |
| | | col.innerHTML = cols[c]; |
| | | row.appendChild(col); |
| | | } |
| | | |
| | | this.contact_list.insert_row(row); |
| | | this.triggerEvent('insertrow', { cid:cid, row:row }); |
| | | |
| | | this.enable_command('export', (this.contact_list.rowcount > 0)); |
| | | }; |
| | |
| | | console.log(response.exec); |
| | | eval(response.exec); |
| | | } |
| | | |
| | | // execute callback functions of plugins |
| | | if (response.callbacks && response.callbacks.length) { |
| | | for (var i=0; i < response.callbacks.length; i++) |
| | | this.triggerEvent(response.callbacks[i][0], response.callbacks[i][1]); |
| | | } |
| | | |
| | | // process the response data according to the sent action |
| | | switch (response.action) { |
| | |
| | | } |
| | | |
| | | case 'moveto': |
| | | if (this.env.action == 'show') |
| | | this.command('list'); |
| | | else if (this.message_list) |
| | | if (this.env.action == 'show') { |
| | | // re-enable commands on move/delete error |
| | | this.enable_command('reply', 'reply-all', 'forward', 'delete', 'mark', 'print', 'open', 'edit', 'viewsource', 'download', true); |
| | | } else if (this.message_list) |
| | | this.message_list.init(); |
| | | break; |
| | | |
| | |
| | | if (this.env.contentframe) |
| | | this.show_contentframe(false); |
| | | // disable commands useless when mailbox is empty |
| | | this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 'mark', 'viewsource', |
| | | 'print', 'load-attachment', 'purge', 'expunge', 'select-all', 'select-none', 'sort', false); |
| | | this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', |
| | | 'mark', 'viewsource', 'open', 'edit', 'download', 'print', 'load-attachment', |
| | | 'purge', 'expunge', 'select-all', 'select-none', 'sort', false); |
| | | } |
| | | break; |
| | | |
| | |
| | | this.set_busy(false); |
| | | request.abort(); |
| | | |
| | | this.display_message('Unknown Server Error!' + (errmsg ? ' ('+errmsg+')' : ''), 'error'); |
| | | if (errmsg) |
| | | this.display_message(this.get_label('servererror') + ' (' + errmsg + ')', 'error'); |
| | | }; |
| | | |
| | | // use an image to send a keep-alive siganl to the server |
| | |
| | | return obj.value.length; |
| | | }; |
| | | |
| | | this.set_caret2start = function(obj) |
| | | this.set_caret_pos = function(obj, pos) |
| | | { |
| | | if (obj.createTextRange) |
| | | if (obj.setSelectionRange) |
| | | obj.setSelectionRange(pos, pos); |
| | | else if (obj.createTextRange) |
| | | { |
| | | var range = obj.createTextRange(); |
| | | range.collapse(true); |
| | | range.moveEnd('character', pos); |
| | | range.moveStart('character', pos); |
| | | range.select(); |
| | | } |
| | | else if (obj.setSelectionRange) |
| | | obj.setSelectionRange(0,0); |
| | | |
| | | obj.focus(); |
| | | }; |
| | | } |
| | | |
| | | // set all fields of a form disabled |
| | | this.lock_form = function(form, lock) |