| | |
| | | } |
| | | // show printing dialog |
| | | else if (this.env.action == 'print' && this.env.uid) |
| | | window.print(); |
| | | if (bw.safari) |
| | | window.setTimeout('window.print()', 10); |
| | | else |
| | | window.print(); |
| | | |
| | | // get unread count for each mailbox |
| | | if (this.gui_objects.mailboxlist) { |
| | |
| | | this.enable_command('show', 'edit', true); |
| | | // register handlers for group assignment via checkboxes |
| | | if (this.gui_objects.editform) { |
| | | $('input.groupmember').change(function(){ |
| | | var cmd = this.checked ? 'group-addmembers' : 'group-delmembers'; |
| | | ref.http_post(cmd, '_cid='+urlencode(ref.env.cid) |
| | | + '&_source='+urlencode(ref.env.source) |
| | | + '&_gid='+urlencode(this.value)); |
| | | $('input.groupmember').change(function() { |
| | | ref.group_member_change(this.checked ? 'add' : 'del', ref.env.cid, ref.env.source, this.value); |
| | | }); |
| | | } |
| | | } |
| | |
| | | |
| | | this.enable_command('add', 'import', this.env.writable_source); |
| | | this.enable_command('list', 'listgroup', 'advanced-search', true); |
| | | |
| | | |
| | | // load contacts of selected source |
| | | if (!this.env.action) |
| | | this.command('list', this.env.source); |
| | |
| | | this.start_keepalive(); |
| | | }; |
| | | |
| | | this.log = function(msg) |
| | | { |
| | | if (window.console && console.log) |
| | | console.log(msg); |
| | | }; |
| | | |
| | | /*********************************************************/ |
| | | /********* client command interface *********/ |
| | |
| | | // reload form |
| | | if (props == 'reload') { |
| | | form.action += '?_reload=1'; |
| | | } |
| | | else if ((input = $("input[name='_name']", form)) &&input.length && input.val() == '') { |
| | | alert(this.get_label('nonamewarning')); |
| | | input.focus(); |
| | | break; |
| | | } |
| | | else if (this.task == 'settings' && (this.env.identities_level % 2) == 0 && |
| | | (input = $("input[name='_email']", form)) && input.length && !rcube_check_email(input.val()) |
| | |
| | | |
| | | // reset quicksearch |
| | | case 'reset-search': |
| | | var s = this.env.search_request; |
| | | var n, s = this.env.search_request || this.env.qsearch; |
| | | this.reset_qsearch(); |
| | | |
| | | if (s && this.env.mailbox) |
| | | this.list_mailbox(this.env.mailbox); |
| | | else if (s && this.task == 'addressbook') { |
| | | if (this.env.source == '') { |
| | | for (var n in this.env.address_sources) break; |
| | | for (n in this.env.address_sources) break; |
| | | this.env.source = n; |
| | | this.env.group = ''; |
| | | } |
| | |
| | | ul.show(); |
| | | div.removeClass('collapsed').addClass('expanded'); |
| | | var reg = new RegExp('&'+urlencode(id)+'&'); |
| | | this.set_env('collapsed_folders', this.env.collapsed_folders.replace(reg, '')); |
| | | this.env.collapsed_folders = this.env.collapsed_folders.replace(reg, ''); |
| | | } |
| | | else { |
| | | ul.hide(); |
| | | div.removeClass('expanded').addClass('collapsed'); |
| | | this.set_env('collapsed_folders', this.env.collapsed_folders+'&'+urlencode(id)+'&'); |
| | | this.env.collapsed_folders = this.env.collapsed_folders+'&'+urlencode(id)+'&'; |
| | | |
| | | // select parent folder if one of its childs is currently selected |
| | | if (this.env.mailbox.indexOf(id + this.env.delimiter) == 0) |
| | |
| | | } |
| | | |
| | | if ((found = $.inArray('flag', this.env.coltypes)) >= 0) |
| | | this.set_env('flagged_col', found); |
| | | this.env.flagged_col = found; |
| | | |
| | | if ((found = $.inArray('subject', this.env.coltypes)) >= 0) |
| | | this.set_env('subject_col', found); |
| | | this.env.subject_col = found; |
| | | |
| | | this.command('save-pref', { name: 'list_cols', value: this.env.coltypes, session: 'list_attrib/columns' }); |
| | | }; |
| | |
| | | if (action == 'preview' && String(target.location.href).indexOf(url) >= 0) |
| | | this.show_contentframe(true); |
| | | else { |
| | | if (!this.env.frame_lock) { |
| | | (this.is_framed() ? parent.rcmail : this).env.frame_lock = this.set_busy(true, 'loading'); |
| | | } |
| | | this.location_href(this.env.comm_path+url, target); |
| | | this.location_href(this.env.comm_path+url, target, true); |
| | | |
| | | // mark as read and change mbox unread counter |
| | | if (action == 'preview' && this.message_list && this.message_list.rows[id] && this.message_list.rows[id].unread && this.env.preview_pane_mark_read >= 0) { |
| | |
| | | |
| | | if (!show && this.busy) |
| | | this.set_busy(false, null, this.env.frame_lock); |
| | | }; |
| | | |
| | | this.lock_frame = function() |
| | | { |
| | | if (!this.env.frame_lock) |
| | | (this.is_framed() ? parent.rcmail : this).env.frame_lock = this.set_busy(true, 'loading'); |
| | | }; |
| | | |
| | | // list a specific page |
| | |
| | | if (this.env.autocomplete_threads > 0) { |
| | | ac_props = { |
| | | threads: this.env.autocomplete_threads, |
| | | sources: this.env.autocomplete_sources, |
| | | sources: this.env.autocomplete_sources |
| | | }; |
| | | } |
| | | |
| | |
| | | return false; |
| | | |
| | | // get file input field, count files on capable browser |
| | | var field = $('input[type=file]', form).get(0), |
| | | var i, size = 0, field = $('input[type=file]', form).get(0), |
| | | files = field.files ? field.files.length : field.value ? 1 : 0; |
| | | |
| | | // create hidden iframe and post upload form |
| | | if (files) { |
| | | // check file size |
| | | if (field.files && this.env.max_filesize && this.env.filesizeerror) { |
| | | for (i=0; i<files; i++) |
| | | size += field.files[i].size; |
| | | if (size && size > this.env.max_filesize) { |
| | | this.display_message(this.env.filesizeerror, 'error'); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | var frame_name = this.async_upload_form(form, 'upload', function(e) { |
| | | var d, content = ''; |
| | | try { |
| | |
| | | this.qsearch = function(value) |
| | | { |
| | | if (value != '') { |
| | | var n, addurl = '', mods_arr = [], |
| | | var n, r, addurl = '', mods_arr = [], |
| | | mods = this.env.search_mods, |
| | | mbox = this.env.mailbox, |
| | | lock = this.set_busy(true, 'searching'); |
| | |
| | | |
| | | // reset vars |
| | | this.env.current_page = 1; |
| | | this.http_request('search', '_q='+urlencode(value) |
| | | r = this.http_request('search', '_q='+urlencode(value) |
| | | + (mbox ? '&_mbox='+urlencode(mbox) : '') |
| | | + (this.env.source ? '&_source='+urlencode(this.env.source) : '') |
| | | + (this.env.group ? '&_gid='+urlencode(this.env.group) : '') |
| | | + (addurl ? addurl : ''), lock); |
| | | |
| | | this.env.qsearch = {lock: lock, request: r}; |
| | | } |
| | | return true; |
| | | }; |
| | | |
| | | // reset quick-search form |
| | |
| | | if (this.gui_objects.qsearchbox) |
| | | this.gui_objects.qsearchbox.value = ''; |
| | | |
| | | if (this.env.qsearch) |
| | | this.abort_request(this.env.qsearch); |
| | | |
| | | this.env.qsearch = null; |
| | | this.env.search_request = null; |
| | | return true; |
| | | }; |
| | | |
| | | this.sent_successfully = function(type, msg) |
| | |
| | | var old_value = this.ksearch_value; |
| | | this.ksearch_value = q; |
| | | |
| | | this.ksearch_destroy(); |
| | | |
| | | // ...string is empty |
| | | if (!q.length) |
| | | return; |
| | |
| | | // ...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.ksearch_destroy(); |
| | | |
| | | var i, lock, source, xhr, reqid = new Date().getTime(), |
| | | threads = props && props.threads ? props.threads : 1, |
| | |
| | | |
| | | this.ksearch_query_results = function(results, search, reqid) |
| | | { |
| | | // search stopped in meantime? |
| | | if (!this.ksearch_value) |
| | | return; |
| | | |
| | | // ignore this outdated search response |
| | | if (this.ksearch_input && this.ksearch_value && search != this.ksearch_value) |
| | | if (this.ksearch_input && search != this.ksearch_value) |
| | | return; |
| | | |
| | | // display search results |
| | |
| | | li.innerHTML = text.replace(new RegExp('('+RegExp.escape(s_val)+')', 'ig'), '##$1%%').replace(/</g, '<').replace(/>/g, '>').replace(/##([^%]+)%%/g, '<b>$1</b>'); |
| | | li.onmouseover = function(){ ref.ksearch_select(this); }; |
| | | li.onmouseup = function(){ ref.ksearch_click(this) }; |
| | | li._rcm_id = i; |
| | | li._rcm_id = this.env.contacts.length + i; |
| | | ul.appendChild(li); |
| | | maxlen -= 1; |
| | | } |
| | |
| | | |
| | | if (this.ksearch_pane) |
| | | this.ksearch_pane.hide(); |
| | | }; |
| | | |
| | | this.ksearch_destroy(); |
| | | }; |
| | | |
| | | // Aborts pending autocomplete requests |
| | | this.ksearch_destroy = function() |
| | |
| | | if (!ac) |
| | | return; |
| | | |
| | | for (i=0, len=ac.locks.length; i<len; i++) { |
| | | this.hide_message(ac.locks[i]); // hide loading message |
| | | ac.requests[i].abort(); // abort ajax request |
| | | } |
| | | for (i=0, len=ac.locks.length; i<len; i++) |
| | | this.abort_request({request: ac.requests[i], lock: ac.locks[i]}); |
| | | |
| | | this.ksearch_data = null; |
| | | } |
| | |
| | | if (this.env.group) |
| | | add_url += '&_gid='+urlencode(this.env.group); |
| | | |
| | | this.set_busy(true); |
| | | this.location_href(this.env.comm_path+'&_action='+action+'&_source='+urlencode(this.env.source)+'&_cid='+urlencode(cid) + add_url, target); |
| | | this.location_href(this.env.comm_path+'&_action='+action |
| | | +'&_source='+urlencode(this.env.source) |
| | | +'&_cid='+urlencode(cid) + add_url, target, true); |
| | | } |
| | | return true; |
| | | }; |
| | | |
| | | // add/delete member to/from the group |
| | | this.group_member_change = function(what, cid, source, gid) |
| | | { |
| | | what = what == 'add' ? 'add' : 'del'; |
| | | var lock = this.display_message(this.get_label(what == 'add' ? 'addingmember' : 'removingmember'), 'loading'); |
| | | |
| | | this.http_post('group-'+what+'members', '_cid='+urlencode(cid) |
| | | + '&_source='+urlencode(source) |
| | | + '&_gid='+urlencode(gid), lock); |
| | | }; |
| | | |
| | | // copy a contact to the specified target (group or directory) |
| | |
| | | if (!cid) |
| | | cid = this.contact_list.get_selection().join(','); |
| | | |
| | | if (to.type == 'group' && to.source == this.env.source) { |
| | | this.http_post('group-addmembers', '_cid='+urlencode(cid) |
| | | + '&_source='+urlencode(this.env.source) |
| | | + '&_gid='+urlencode(to.id)); |
| | | } |
| | | if (to.type == 'group' && to.source == this.env.source) |
| | | this.group_member_change('add', cid, to.source, to.id); |
| | | else if (to.type == 'group' && !this.env.address_sources[to.source].readonly) { |
| | | var lock = this.display_message(this.get_label('copyingcontact'), 'loading'); |
| | | this.http_post('copy', '_cid='+urlencode(cid) |
| | | + '&_source='+urlencode(this.env.source) |
| | | + '&_to='+urlencode(to.source) |
| | | + '&_togid='+urlencode(to.id) |
| | | + (this.env.group ? '&_gid='+urlencode(this.env.group) : '')); |
| | | + (this.env.group ? '&_gid='+urlencode(this.env.group) : ''), lock); |
| | | } |
| | | else if (to.id != this.env.source && cid && this.env.address_sources[to.id] && !this.env.address_sources[to.id].readonly) { |
| | | var lock = this.display_message(this.get_label('copyingcontact'), 'loading'); |
| | | this.http_post('copy', '_cid='+urlencode(cid) |
| | | + '&_source='+urlencode(this.env.source) |
| | | + '&_to='+urlencode(to.id) |
| | | + (this.env.group ? '&_gid='+urlencode(this.env.group) : '')); |
| | | + (this.env.group ? '&_gid='+urlencode(this.env.group) : ''), lock); |
| | | } |
| | | }; |
| | | |
| | |
| | | |
| | | this.group_delete = function() |
| | | { |
| | | if (this.env.group) |
| | | this.http_post('group-delete', '_source='+urlencode(this.env.source)+'&_gid='+urlencode(this.env.group), true); |
| | | if (this.env.group && confirm(this.get_label('deletegroupconfirm'))) { |
| | | var lock = this.set_busy(true, 'groupdeleting'); |
| | | this.http_post('group-delete', '_source='+urlencode(this.env.source)+'&_gid='+urlencode(this.env.group), lock); |
| | | } |
| | | }; |
| | | |
| | | // callback from server upon group-delete command |
| | |
| | | this.set_photo_actions = function(id) |
| | | { |
| | | var n, buttons = this.buttons['upload-photo']; |
| | | for (n=0; n < buttons.length; n++) |
| | | for (n=0; buttons && n < buttons.length; n++) |
| | | $('#'+buttons[n].id).html(this.get_label(id == '-del-' ? 'addphoto' : 'replacephoto')); |
| | | |
| | | $('#ff_photo').val(id); |
| | |
| | | this.contact_list.clear_selection(); |
| | | } |
| | | |
| | | this.location_href(this.env.comm_path+'&_action=search'+add_url, target); |
| | | this.location_href(this.env.comm_path+'&_action=search'+add_url, target, true); |
| | | |
| | | return true; |
| | | }; |
| | |
| | | // preferences section select and load options frame |
| | | this.section_select = function(list) |
| | | { |
| | | var id = list.get_single_selection(); |
| | | var id = list.get_single_selection(), add_url = '', target = window; |
| | | |
| | | if (id) { |
| | | var add_url = '', 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]; |
| | | } |
| | | this.location_href(this.env.comm_path+'&_action=edit-prefs&_section='+id+add_url, target); |
| | | this.location_href(this.env.comm_path+'&_action=edit-prefs&_section='+id+add_url, target, true); |
| | | } |
| | | |
| | | return true; |
| | |
| | | $('#mailboxroot') |
| | | .mouseover(function(){ p.focus_subscription(this.id); }) |
| | | .mouseout(function(){ p.unfocus_subscription(this.id); }) |
| | | .mouseup(function(){ if (p.drag_active) p.subscription_move_folder(); }); |
| | | }; |
| | | |
| | | this.focus_subscription = function(id) |
| | |
| | | |
| | | if (this.drag_active && this.env.mailbox && (row = document.getElementById(id))) |
| | | if (this.env.subscriptionrows[id] && |
| | | (folder = this.env.subscriptionrows[id][0])) { |
| | | (folder = this.env.subscriptionrows[id][0]) !== null |
| | | ) { |
| | | if (this.check_droptarget(folder) && |
| | | !this.env.subscriptionrows[this.get_folder_row_id(this.env.mailbox)][2] && |
| | | (folder != this.env.mailbox.replace(reg, '')) && |
| | | (!folder.match(new RegExp('^'+RegExp.escape(this.env.mailbox+this.env.delimiter))))) { |
| | | this.set_env('dstfolder', folder); |
| | | (!folder.match(new RegExp('^'+RegExp.escape(this.env.mailbox+this.env.delimiter)))) |
| | | ) { |
| | | this.env.dstfolder = folder; |
| | | $(row).addClass('droptarget'); |
| | | } |
| | | } |
| | | else if (id == 'mailboxroot') { |
| | | this.set_env('dstfolder', ''); |
| | | $(row).addClass('droptarget'); |
| | | } |
| | | else if (this.env.mailbox.match(new RegExp(delim))) { |
| | | this.set_env('dstfolder', this.env.delimiter); |
| | | $(this.subscription_list.frame).addClass('droptarget'); |
| | | } |
| | | }; |
| | | |
| | |
| | | { |
| | | var row = $('#'+id); |
| | | |
| | | this.set_env('dstfolder', null); |
| | | this.env.dstfolder = null; |
| | | if (this.env.subscriptionrows[id] && row[0]) |
| | | row.removeClass('droptarget'); |
| | | else |
| | |
| | | if (list && (id = list.get_single_selection()) && |
| | | (folder = this.env.subscriptionrows['rcmrow'+id]) |
| | | ) { |
| | | this.set_env('mailbox', folder[0]); |
| | | this.env.mailbox = folder[0]; |
| | | this.show_folder(folder[0]); |
| | | this.enable_command('delete-folder', !folder[2]); |
| | | } |
| | |
| | | var delim = RegExp.escape(this.env.delimiter), |
| | | reg = RegExp('['+delim+']?[^'+delim+']+$'); |
| | | |
| | | if (this.env.mailbox && this.env.dstfolder && (this.env.dstfolder != this.env.mailbox) && |
| | | if (this.env.mailbox && this.env.dstfolder !== null && (this.env.dstfolder != this.env.mailbox) && |
| | | (this.env.dstfolder != this.env.mailbox.replace(reg, '')) |
| | | ) { |
| | | reg = new RegExp('[^'+delim+']*['+delim+']', 'g'); |
| | | var basename = this.env.mailbox.replace(reg, ''), |
| | | newname = this.env.dstfolder==this.env.delimiter ? basename : this.env.dstfolder+this.env.delimiter+basename; |
| | | newname = this.env.dstfolder === '' ? basename : this.env.dstfolder+this.env.delimiter+basename; |
| | | |
| | | if (newname != this.env.mailbox) { |
| | | this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.mailbox)+'&_folder_newname='+urlencode(newname), this.set_busy(true, 'foldermoving')); |
| | |
| | | this.show_contentframe(true); |
| | | } |
| | | else { |
| | | if (!this.env.frame_lock) { |
| | | (parent.rcmail ? parent.rcmail : this).env.frame_lock = this.set_busy(true, 'loading'); |
| | | } |
| | | this.location_href(this.env.comm_path+url, target); |
| | | this.location_href(this.env.comm_path+url, target, true); |
| | | } |
| | | }; |
| | | |
| | |
| | | obj.click(function() { return ref.hide_message(obj); }); |
| | | } |
| | | |
| | | window.setTimeout(function() { ref.hide_message(id, type == 'loading'); }, timeout); |
| | | if (timeout > 0) |
| | | window.setTimeout(function() { ref.hide_message(id, type == 'loading'); }, timeout); |
| | | return id; |
| | | }; |
| | | |
| | |
| | | this.env.status_col = null; |
| | | |
| | | if ((n = $.inArray('subject', this.env.coltypes)) >= 0) { |
| | | this.set_env('subject_col', n); |
| | | this.env.subject_col = n; |
| | | if (list) |
| | | list.subject_col = n; |
| | | } |
| | | if ((n = $.inArray('flag', this.env.coltypes)) >= 0) |
| | | this.set_env('flagged_col', n); |
| | | this.env.flagged_col = n; |
| | | if ((n = $.inArray('status', this.env.coltypes)) >= 0) |
| | | this.set_env('status_col', n); |
| | | this.env.status_col = n; |
| | | |
| | | if (list) |
| | | list.init_header(); |
| | |
| | | url = '?_task=utils&_action=html2text', |
| | | lock = this.set_busy(true, 'converting'); |
| | | |
| | | console.log('HTTP POST: ' + url); |
| | | this.log('HTTP POST: ' + url); |
| | | |
| | | $.ajax({ type: 'POST', url: url, data: htmlText, contentType: 'application/octet-stream', |
| | | error: function(o, status, err) { rcmail.http_error(o, status, err, lock); }, |
| | | success: function(data) { rcmail.set_busy(false, null, lock); $(document.getElementById(id)).val(data); console.log(data); } |
| | | success: function(data) { rcmail.set_busy(false, null, lock); $(document.getElementById(id)).val(data); rcmail.log(data); } |
| | | }); |
| | | }; |
| | | |
| | |
| | | this.redirect(this.url(action, query)); |
| | | }; |
| | | |
| | | this.location_href = function(url, target) |
| | | this.location_href = function(url, target, frame) |
| | | { |
| | | if (frame) |
| | | this.lock_frame(); |
| | | |
| | | // simulate real link click to force IE to send referer header |
| | | if (bw.ie && target == window) |
| | | $('<a>').attr('href', url).appendTo(document.body).get(0).click(); |
| | |
| | | url += '&_remote=1'; |
| | | |
| | | // send request |
| | | console.log('HTTP GET: ' + url); |
| | | this.log('HTTP GET: ' + url); |
| | | |
| | | return $.ajax({ |
| | | type: 'GET', url: url, data: { _unlock:(lock?lock:0) }, dataType: 'json', |
| | |
| | | } |
| | | |
| | | // send request |
| | | console.log('HTTP POST: ' + url); |
| | | this.log('HTTP POST: ' + url); |
| | | |
| | | return $.ajax({ |
| | | type: 'POST', url: url, data: postdata, dataType: 'json', |
| | | success: function(data){ ref.http_response(data); }, |
| | | error: function(o, status, err) { rcmail.http_error(o, status, err, lock); } |
| | | }); |
| | | }; |
| | | |
| | | // aborts ajax request |
| | | this.abort_request = function(r) |
| | | { |
| | | if (r.request) |
| | | r.request.abort(); |
| | | if (r.lock) |
| | | this.set_busy(false, null, r.lock); |
| | | }; |
| | | |
| | | // handle HTTP response |
| | |
| | | |
| | | // if we get javascript code from server -> execute it |
| | | if (response.exec) { |
| | | console.log(response.exec); |
| | | this.log(response.exec); |
| | | eval(response.exec); |
| | | } |
| | | |
| | |
| | | case 'check-recent': |
| | | case 'getunread': |
| | | case 'search': |
| | | this.env.qsearch = null; |
| | | case 'list': |
| | | if (this.task == 'mail') { |
| | | this.enable_command('show', 'expunge', 'select-all', 'select-none', 'sort', (this.env.messagecount > 0)); |