| | |
| | | } |
| | | |
| | | // enable general commands |
| | | this.enable_command('logout', 'mail', 'addressbook', 'settings', 'save-pref', true); |
| | | this.enable_command('logout', 'mail', 'addressbook', 'settings', 'save-pref', 'undo', true); |
| | | |
| | | if (this.env.permaurl) |
| | | this.enable_command('permaurl', true); |
| | |
| | | $(this.gui_objects.qsearchbox).focusin(function() { rcmail.contact_list.blur(); }); |
| | | } |
| | | |
| | | this.enable_command('group-create', this.env.address_sources[this.env.source].groups); |
| | | this.update_group_commands(); |
| | | } |
| | | |
| | | this.set_page_buttons(); |
| | |
| | | |
| | | // show message |
| | | if (this.pending_message) |
| | | this.display_message(this.pending_message[0], this.pending_message[1]); |
| | | this.display_message(this.pending_message[0], this.pending_message[1], this.pending_message[2]); |
| | | |
| | | // map implicit containers |
| | | if (this.gui_objects.folderlist) |
| | |
| | | } |
| | | // contacts/identities |
| | | else { |
| | | if ((input = $("input[name='_name']", form)) &&input.length && input.val() == '') { |
| | | // 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()) |
| | | (input = $("input[name='_email']", form)) && input.length && !rcube_check_email(input.val()) |
| | | ) { |
| | | alert(this.get_label('noemailwarning')); |
| | | input.focus(); |
| | |
| | | // clear empty input fields |
| | | $('input.placeholder').each(function(){ if (this.value == this._placeholder) this.value = ''; }); |
| | | } |
| | | |
| | | // add selected source (on the list) |
| | | if (parent.rcmail && parent.rcmail.env.source) |
| | | form.action = this.add_url(form.action, '_orig_source', parent.rcmail.env.source); |
| | | |
| | | form.submit(); |
| | | } |
| | |
| | | this.goto_url('settings/' + command); |
| | | break; |
| | | |
| | | case 'undo': |
| | | this.http_request('undo', '', this.display_message('', 'loading')); |
| | | break; |
| | | |
| | | // unified command call (command name == function name) |
| | | default: |
| | | var func = command.replace(/-/g, '_'); |
| | |
| | | var toffset = -moffset-boffset; |
| | | var li, div, pos, mouse, check, oldclass, |
| | | layerclass = 'draglayernormal'; |
| | | |
| | | |
| | | if (this.contact_list && this.contact_list.draglayer) |
| | | oldclass = this.contact_list.draglayer.attr('class'); |
| | | |
| | |
| | | this.set_caret_pos(input_message, this.env.top_posting ? 0 : $(input_message).val().length); |
| | | // add signature according to selected identity |
| | | // if we have HTML editor, signature is added in callback |
| | | if (input_from.attr('type') == 'select-one' && $("input[name='_draft_saveid']").val() == '') { |
| | | if (input_from.prop('type') == 'select-one' && $("input[name='_draft_saveid']").val() == '') { |
| | | this.change_identity(input_from[0]); |
| | | } |
| | | } |
| | |
| | | input_message = $("[name='_message']"); |
| | | |
| | | // check sender (if have no identities) |
| | | if (input_from.attr('type') == 'text' && !rcube_check_email(input_from.val(), true)) { |
| | | if (input_from.prop('type') == 'text' && !rcube_check_email(input_from.val(), true)) { |
| | | alert(this.get_label('nosenderwarning')); |
| | | input_from.focus(); |
| | | return false; |
| | |
| | | }); |
| | | |
| | | // display upload indicator and cancel button |
| | | var content = this.get_label('uploading' + (files > 1 ? 'many' : '')), |
| | | var content = '<span>' + this.get_label('uploading' + (files > 1 ? 'many' : '')) + '</span>', |
| | | ts = frame_name.replace(/^rcmupload/, ''); |
| | | |
| | | if (this.env.loadingicon) |
| | |
| | | if (this.env.cancelicon) |
| | | content = '<a title="'+this.get_label('cancel')+'" onclick="return rcmail.cancel_attachment_upload(\''+ts+'\', \''+frame_name+'\');" href="#cancelupload"><img src="'+this.env.cancelicon+'" alt="" /></a>'+content; |
| | | this.add2attachment_list(ts, { name:'', html:content, complete:false }); |
| | | |
| | | // upload progress support |
| | | if (this.env.upload_progress_time) { |
| | | this.upload_progress_start('upload', ts); |
| | | } |
| | | } |
| | | |
| | | // set reference to the form object |
| | |
| | | this.remove_from_attachment_list(name); |
| | | $("iframe[name='"+frame_name+"']").remove(); |
| | | return false; |
| | | }; |
| | | |
| | | this.upload_progress_start = function(action, name) |
| | | { |
| | | window.setTimeout(function() { rcmail.http_request(action, {_progress: name}); }, |
| | | this.env.upload_progress_time * 1000); |
| | | }; |
| | | |
| | | this.upload_progress_update = function(param) |
| | | { |
| | | var elem = $('#'+param.name + '> span'); |
| | | |
| | | if (!elem.length || !param.text) |
| | | return; |
| | | |
| | | elem.text(param.text); |
| | | |
| | | if (!param.done) |
| | | this.upload_progress_start(param.action, param.name); |
| | | }; |
| | | |
| | | // send remote request to add a new contact |
| | |
| | | var inp_value = this.ksearch_input.value, |
| | | cpos = this.get_caret_pos(this.ksearch_input), |
| | | p = inp_value.lastIndexOf(this.ksearch_value, cpos), |
| | | trigger = false, |
| | | insert = '', |
| | | |
| | | // replace search string with full address |
| | |
| | | insert += this.env.contacts[id].name + ', '; |
| | | this.group2expand = $.extend({}, this.env.contacts[id]); |
| | | this.group2expand.input = this.ksearch_input; |
| | | this.http_request('group-expand', '_source='+urlencode(this.env.contacts[id].source)+'&_gid='+urlencode(this.env.contacts[id].id), false); |
| | | this.http_request('mail/group-expand', '_source='+urlencode(this.env.contacts[id].source)+'&_gid='+urlencode(this.env.contacts[id].id), false); |
| | | } |
| | | else if (typeof this.env.contacts[id] === 'string') |
| | | else if (typeof this.env.contacts[id] === 'string') { |
| | | insert = this.env.contacts[id] + ', '; |
| | | trigger = true; |
| | | } |
| | | |
| | | this.ksearch_input.value = pre + insert + end; |
| | | |
| | |
| | | cpos = p+insert.length; |
| | | if (this.ksearch_input.setSelectionRange) |
| | | this.ksearch_input.setSelectionRange(cpos, cpos); |
| | | |
| | | if (trigger) |
| | | this.triggerEvent('autocomplete_insert', { field:this.ksearch_input, insert:insert }); |
| | | }; |
| | | |
| | | this.replace_group_recipients = function(id, recipients) |
| | | { |
| | | if (this.group2expand && this.group2expand.id == id) { |
| | | this.group2expand.input.value = this.group2expand.input.value.replace(this.group2expand.name, recipients); |
| | | this.triggerEvent('autocomplete_insert', { field:this.group2expand.input, insert:recipients }); |
| | | this.group2expand = null; |
| | | } |
| | | }; |
| | |
| | | return; |
| | | |
| | | var lock = this.display_message(this.get_label('searching'), 'loading'); |
| | | this.http_post('autocomplete', '_search='+urlencode(q), lock); |
| | | this.http_post('mail/autocomplete', '_search='+urlencode(q), lock); |
| | | }; |
| | | |
| | | this.ksearch_query_results = function(results, search) |
| | |
| | | add_url = '&_framed=1'; |
| | | target = window.frames[this.env.contentframe]; |
| | | this.show_contentframe(true); |
| | | |
| | | // load dummy content |
| | | if (!cid) { |
| | | // unselect selected row(s) |
| | | this.contact_list.clear_selection(); |
| | | this.enable_command('delete', 'compose', false); |
| | | } |
| | | } |
| | | else if (framed) |
| | | return false; |
| | |
| | | |
| | | this.group_create = function() |
| | | { |
| | | if (!this.gui_objects.folderlist || !this.env.address_sources[this.env.source].groups) |
| | | if (!this.gui_objects.folderlist) |
| | | return; |
| | | |
| | | if (!this.name_input) { |
| | |
| | | this.reset_add_input(); |
| | | |
| | | prop.type = 'group'; |
| | | var key = 'G'+prop.source+prop.id; |
| | | this.env.contactfolders[key] = this.env.contactgroups[key] = prop; |
| | | var key = 'G'+prop.source+prop.id, |
| | | link = $('<a>').attr('href', '#') |
| | | .attr('rel', prop.source+':'+prop.id) |
| | | .click(function() { return rcmail.command('listgroup', prop, this); }) |
| | | .html(prop.name), |
| | | li = $('<li>').attr({id: 'rcmli'+key.replace(this.identifier_expr, '_'), 'class': 'contactgroup'}) |
| | | .append(link); |
| | | |
| | | var link = $('<a>').attr('href', '#') |
| | | .attr('rel', prop.source+':'+prop.id) |
| | | .bind('click', function() { return rcmail.command('listgroup', prop, this);}) |
| | | .html(prop.name); |
| | | var li = $('<li>').attr('id', 'rcmli'+key.replace(this.identifier_expr, '_')) |
| | | .addClass('contactgroup') |
| | | .append(link) |
| | | .insertAfter(this.get_folder_li(prop.source)); |
| | | this.env.contactfolders[key] = this.env.contactgroups[key] = prop; |
| | | this.add_contact_group_row(prop, li); |
| | | |
| | | this.triggerEvent('group_insert', { id:prop.id, source:prop.source, name:prop.name, li:li[0] }); |
| | | }; |
| | |
| | | |
| | | // group ID has changed, replace link node and identifiers |
| | | if (li && prop.newid) { |
| | | var newkey = 'G'+prop.source+prop.newid; |
| | | var newkey = 'G'+prop.source+prop.newid, |
| | | newprop = $.extend({}, prop);; |
| | | |
| | | li.id = String('rcmli'+newkey).replace(this.identifier_expr, '_'); |
| | | this.env.contactfolders[newkey] = this.env.contactfolders[key]; |
| | | this.env.contactfolders[newkey].id = prop.newid; |
| | | this.env.group = prop.newid; |
| | | |
| | | var newprop = $.extend({}, prop); |
| | | delete this.env.contactfolders[key]; |
| | | delete this.env.contactgroups[key]; |
| | | |
| | | newprop.id = prop.newid; |
| | | newprop.type = 'group'; |
| | | |
| | | link = $('<a>').attr('href', '#') |
| | | .attr('rel', prop.source+':'+prop.newid) |
| | | .bind('click', function() { return rcmail.command('listgroup', newprop, this);}) |
| | | .click(function() { return rcmail.command('listgroup', newprop, this); }) |
| | | .html(prop.name); |
| | | $(li).children().replaceWith(link); |
| | | } |
| | |
| | | link.innerHTML = prop.name; |
| | | |
| | | this.env.contactfolders[key].name = this.env.contactgroups[key].name = prop.name; |
| | | this.add_contact_group_row(prop, $(li), true); |
| | | |
| | | this.triggerEvent('group_update', { id:prop.id, source:prop.source, name:prop.name, li:li[0], newid:prop.newid }); |
| | | }; |
| | | |
| | | // add contact group row to the list, with sorting |
| | | this.add_contact_group_row = function(prop, li, reloc) |
| | | { |
| | | var row, name = prop.name.toUpperCase(), |
| | | sibling = this.get_folder_li(prop.source), |
| | | prefix = 'rcmliG'+(prop.source).replace(this.identifier_expr, '_'); |
| | | |
| | | // When renaming groups, we need to remove it from DOM and insert it in the proper place |
| | | if (reloc) { |
| | | row = li.clone(true); |
| | | li.remove(); |
| | | } |
| | | else |
| | | row = li; |
| | | |
| | | $('li[id^="'+prefix+'"]', this.gui_objects.folderlist).each(function(i, elem) { |
| | | if (name >= $(this).text().toUpperCase()) |
| | | sibling = elem; |
| | | else |
| | | return false; |
| | | }); |
| | | |
| | | row.insertAfter(sibling); |
| | | }; |
| | | |
| | | this.update_group_commands = function() |
| | | { |
| | | var source = this.env.source != '' ? this.env.address_sources[this.env.source] : null; |
| | | this.enable_command('group-create', (source && source.groups && !source.readonly)); |
| | | this.enable_command('group-rename', 'group-delete', (source && source.groups && this.env.group && !source.readonly)); |
| | | }; |
| | | |
| | | this.init_edit_field = function(col, elem) |
| | |
| | | }; |
| | | |
| | | // Add folder row to the table and initialize it |
| | | this.add_folder_row = function (name, display_name, protected, subscribed, skip_init) |
| | | this.add_folder_row = function (name, display_name, is_protected, subscribed, skip_init, class_name) |
| | | { |
| | | if (!this.gui_objects.subscriptionlist) |
| | | return false; |
| | |
| | | } |
| | | |
| | | // clone a table row if there are existing rows |
| | | row = $(refrow).clone(true); |
| | | row = $(refrow).clone(true); |
| | | |
| | | // set ID, reset css class |
| | | row.attr('id', id); |
| | | row.attr('class', class_name); |
| | | |
| | | // set folder name |
| | | row.find('td:first').html(display_name); |
| | | |
| | | // update subscription checkbox |
| | | $('input[name="_subscribed[]"]', row).val(name) |
| | | .prop({checked: subscribed ? true : false, disabled: protected ? true : false}); |
| | | .prop({checked: subscribed ? true : false, disabled: is_protected ? true : false}); |
| | | |
| | | // add to folder/row-ID map |
| | | this.env.subscriptionrows[id] = [name, display_name, 0]; |
| | |
| | | }; |
| | | |
| | | // replace an existing table row with a new folder line (with subfolders) |
| | | this.replace_folder_row = function(oldfolder, newfolder, display_name, protected) |
| | | this.replace_folder_row = function(oldfolder, newfolder, display_name, is_protected, class_name) |
| | | { |
| | | if (!this.gui_objects.subscriptionlist) |
| | | return false; |
| | |
| | | |
| | | // replace an existing table row |
| | | this._remove_folder_row(id); |
| | | row = $(this.add_folder_row(newfolder, display_name, protected, subscribed, true)); |
| | | row = $(this.add_folder_row(newfolder, display_name, is_protected, subscribed, true, class_name)); |
| | | |
| | | // detect tree depth change |
| | | if (len = list.length) { |
| | |
| | | if (elem._placeholder && (!$elem.val() || $elem.val() == elem._placeholder)) |
| | | $elem.addClass('placeholder').attr('spellcheck', false).val(elem._placeholder); |
| | | }; |
| | | |
| | | |
| | | // write to the document/window title |
| | | this.set_pagetitle = function(title) |
| | | { |
| | |
| | | }; |
| | | |
| | | // display a system message, list of types in common.css (below #message definition) |
| | | this.display_message = function(msg, type) |
| | | this.display_message = function(msg, type, timeout) |
| | | { |
| | | // pass command to parent window |
| | | if (this.is_framed()) |
| | | return parent.rcmail.display_message(msg, type); |
| | | return parent.rcmail.display_message(msg, type, timeout); |
| | | |
| | | if (!this.gui_objects.message) { |
| | | // save message in order to display after page loaded |
| | | if (type != 'loading') |
| | | this.pending_message = new Array(msg, type); |
| | | this.pending_message = new Array(msg, type, timeout); |
| | | return false; |
| | | } |
| | | |
| | | type = type ? type : 'notice'; |
| | | |
| | | var ref = this, |
| | | key = msg, |
| | | key = String(msg).replace(this.identifier_expr, '_'), |
| | | date = new Date(), |
| | | id = type + date.getTime(), |
| | | id = type + date.getTime(); |
| | | |
| | | if (!timeout) |
| | | timeout = this.message_time * (type == 'error' || type == 'warning' ? 2 : 1); |
| | | |
| | | |
| | | if (type == 'loading') { |
| | | key = 'loading'; |
| | | timeout = this.env.request_timeout * 1000; |
| | |
| | | this.enable_command('export', (this.contact_list && this.contact_list.rowcount > 0)); |
| | | |
| | | if (response.action == 'list' || response.action == 'search') { |
| | | var source = this.env.source != '' ? this.env.address_sources[this.env.source] : null; |
| | | this.enable_command('group-create', (source && source.groups && !source.readonly)); |
| | | this.enable_command('group-rename', 'group-delete', (source && source.groups && this.env.group && !source.readonly)); |
| | | this.update_group_commands(); |
| | | this.triggerEvent('listupdate', { folder:this.env.source, rowcount:this.contact_list.rowcount }); |
| | | } |
| | | } |
| | |
| | | var ts = new Date().getTime(), |
| | | frame_name = 'rcmupload'+ts; |
| | | |
| | | // upload progress support |
| | | if (this.env.upload_progress_name) { |
| | | var fname = this.env.upload_progress_name, |
| | | field = $('input[name='+fname+']', form); |
| | | |
| | | if (!field.length) { |
| | | field = $('<input>').attr({type: 'hidden', name: fname}); |
| | | field.prependTo(form); |
| | | } |
| | | |
| | | field.val(ts); |
| | | } |
| | | |
| | | // have to do it this way for IE |
| | | // otherwise the form will be posted to a new window |
| | | if (document.all) { |
| | |
| | | |
| | | form.target = frame_name; |
| | | form.action = this.url(action, { _id:this.env.compose_id||'', _uploadid:ts }); |
| | | form.setAttribute('method', 'POST'); |
| | | form.setAttribute('enctype', 'multipart/form-data'); |
| | | form.submit(); |
| | | |
| | |
| | | if (this.env.keep_alive && !this.env.framed && this.task == 'mail' && this.gui_objects.mailboxlist) |
| | | this._int = setInterval(function(){ ref.check_for_recent(false); }, this.env.keep_alive * 1000); |
| | | else if (this.env.keep_alive && !this.env.framed && this.task != 'login' && this.env.action != 'print') |
| | | this._int = setInterval(function(){ ref.http_request('keep-alive'); }, this.env.keep_alive * 1000); |
| | | this._int = setInterval(function(){ ref.keep_alive(); }, this.env.keep_alive * 1000); |
| | | }; |
| | | |
| | | // sends keep-alive signal |
| | | this.keep_alive = function() |
| | | { |
| | | if (!this.busy) |
| | | this.http_request('keep-alive'); |
| | | }; |
| | | |
| | | // sends request to check for recent messages |