| | |
| | | this.set_page_buttons(); |
| | | |
| | | if (this.env.address_sources && this.env.address_sources[this.env.source] && !this.env.address_sources[this.env.source].readonly) |
| | | this.enable_command('add', true); |
| | | this.enable_command('add', 'import', true); |
| | | |
| | | if (this.env.cid) |
| | | this.enable_command('show', 'edit', true); |
| | |
| | | if ((this.env.action=='add' || this.env.action=='edit') && this.gui_objects.editform) |
| | | this.enable_command('save', true); |
| | | else |
| | | this.enable_command('search', 'reset-search', 'moveto', 'import', true); |
| | | this.enable_command('search', 'reset-search', 'moveto', true); |
| | | |
| | | if (this.contact_list && this.contact_list.rowcount > 0) |
| | | this.enable_command('export', true); |
| | |
| | | this.init_address_input_events(input_to); |
| | | this.init_address_input_events($("[name='_cc']")); |
| | | this.init_address_input_events($("[name='_bcc']")); |
| | | |
| | | if (!html_mode) |
| | | this.set_caret_pos(input_message, this.env.top_posting ? 0 : $(input_message).val().length); |
| | | |
| | | // add signature according to selected identity |
| | | if (input_from.attr('type') == 'select-one' && $("input[name='_draft_saveid']").val() == '' |
| | | && !html_mode) { // if we have HTML editor, signature is added in callback |
| | | this.change_identity(input_from[0]); |
| | | } |
| | | else if (!html_mode) |
| | | this.set_caret_pos(input_message, this.env.top_posting ? 0 : $(input_message).val().length); |
| | | |
| | | if (input_to.val() == '') |
| | | input_to.focus(); |
| | |
| | | this.reset_qsearch(); |
| | | |
| | | this.list_contacts(props); |
| | | this.enable_command('add', (this.env.address_sources && !this.env.address_sources[props].readonly)); |
| | | this.enable_command('add', 'import', (this.env.address_sources && !this.env.address_sources[props].readonly)); |
| | | } |
| | | break; |
| | | |
| | |
| | | if (this.env.sort_col==sort_col) |
| | | sort_order = this.env.sort_order=='ASC' ? 'DESC' : 'ASC'; |
| | | else |
| | | sort_order = 'ASC'; |
| | | |
| | | sort_order = 'ASC'; |
| | | |
| | | // set table header class |
| | | $('#rcm'+this.env.sort_col).removeClass('sorted'+(this.env.sort_order.toUpperCase())); |
| | | $('#rcm'+sort_col).addClass('sorted'+sort_order); |
| | |
| | | this.remove_attachment(props); |
| | | break; |
| | | |
| | | case 'insert-sig': |
| | | this.change_identity($("[name='_from']")[0], true); |
| | | break; |
| | | |
| | | case 'reply-all': |
| | | case 'reply': |
| | | var uid; |
| | |
| | | this.lock_form(this.gui_objects.importform, true); |
| | | } |
| | | else |
| | | this.goto_url('import'); |
| | | this.goto_url('import', (this.env.source ? '_target='+urlencode(this.env.source)+'&' : '')); |
| | | break; |
| | | |
| | | case 'export': |
| | |
| | | this.env.current_page = 1; |
| | | this.set_busy(true, 'searching'); |
| | | this.http_request('search', '_filter='+filter |
| | | + (search ? '&_q='+urlencode(search) : '') |
| | | + (this.env.mailbox ? '&_mbox='+urlencode(this.env.mailbox) : ''), true); |
| | | + (search ? '&_q='+urlencode(search) : '') |
| | | + (this.env.mailbox ? '&_mbox='+urlencode(this.env.mailbox) : ''), true); |
| | | } |
| | | |
| | | |
| | |
| | | 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()) |
| | | else if (!this.env.trash_mailbox || this.env.mailbox == this.env.trash_mailbox) |
| | | this.permanently_remove_messages(); |
| | | // if there is a trash mailbox defined and we're not currently in it |
| | | else { |
| | |
| | | return str; |
| | | }; |
| | | |
| | | this.change_identity = function(obj) |
| | | { |
| | | this.change_identity = function(obj, show_sig) |
| | | { |
| | | if (!obj || !obj.options) |
| | | return false; |
| | | |
| | | if (!show_sig) |
| | | show_sig = this.env.show_sig; |
| | | |
| | | var id = obj.options[obj.selectedIndex].value; |
| | | var input_message = $("[name='_message']"); |
| | | var message = input_message.val(); |
| | | var is_html = ($("input[name='_is_html']").val() == '1'); |
| | | var sig, p, len; |
| | | var sig, cursor_pos, p = -1; |
| | | |
| | | if (!this.env.identity) |
| | | this.env.identity = id |
| | | |
| | | if (!is_html) |
| | | { |
| | | // enable manual signature insert |
| | | if (this.env.signatures && this.env.signatures[id]) |
| | | this.enable_command('insert-sig', true); |
| | | else |
| | | this.enable_command('insert-sig', false); |
| | | |
| | | if (!is_html) { |
| | | // remove the 'old' signature |
| | | if (this.env.identity && this.env.signatures && this.env.signatures[this.env.identity]) |
| | | { |
| | | if (this.env.signatures[this.env.identity]['is_html']) |
| | | sig = this.env.signatures[this.env.identity]['plain_text']; |
| | | else |
| | | sig = this.env.signatures[this.env.identity]['text']; |
| | | if (show_sig && this.env.identity && this.env.signatures && this.env.signatures[this.env.identity]) { |
| | | sig = this.env.signatures[this.env.identity].is_html ? this.env.signatures[this.env.identity].plain_text : this.env.signatures[this.env.identity].text; |
| | | |
| | | if (sig.indexOf('-- ')!=0) |
| | | if (sig.indexOf('-- ') != 0) |
| | | sig = '-- \n'+sig; |
| | | |
| | | p = message.lastIndexOf(sig); |
| | | if (p>=0) |
| | | message = message.substring(0, p-1) + message.substring(p+sig.length, message.length); |
| | | } |
| | | |
| | | message = message.replace(/[\r\n]+$/, ''); |
| | | len = message.length; |
| | | p = this.env.sig_above ? message.indexOf(sig) : message.lastIndexOf(sig); |
| | | if (p >= 0) |
| | | message = message.substring(0, p) + message.substring(p+sig.length, message.length); |
| | | } |
| | | |
| | | // add the new signature string |
| | | if (this.env.signatures && this.env.signatures[id]) |
| | | { |
| | | sig = this.env.signatures[id]['text']; |
| | | if (this.env.signatures[id]['is_html']) |
| | | { |
| | | sig = this.env.signatures[id]['plain_text']; |
| | | } |
| | | if (sig.indexOf('-- ')!=0) |
| | | if (show_sig && this.env.signatures && this.env.signatures[id]) { |
| | | sig = this.env.signatures[id]['is_html'] ? this.env.signatures[id]['plain_text'] : this.env.signatures[id]['text']; |
| | | if (sig.indexOf('-- ') != 0) |
| | | sig = '-- \n'+sig; |
| | | message += '\n\n'+sig; |
| | | if (len) len += 1; |
| | | |
| | | if (this.env.sig_above) { |
| | | if (p >= 0) { // in place of removed signature |
| | | message = message.substring(0, p) + sig + message.substring(p, message.length); |
| | | cursor_pos = p - 1; |
| | | } |
| | | else if (pos = this.get_caret_pos(input_message.get(0))) { // at cursor position |
| | | message = message.substring(0, pos) + '\n' + sig + '\n\n' + message.substring(pos, message.length); |
| | | cursor_pos = pos; |
| | | } |
| | | else { // on top |
| | | cursor_pos = 0; |
| | | message = '\n\n' + sig + '\n\n' + message.replace(/^[\r\n]+/, ''); |
| | | } |
| | | } |
| | | else { |
| | | message = message.replace(/[\r\n]+$/, ''); |
| | | cursor_pos = !this.env.top_posting && message.length ? message.length+1 : 0; |
| | | message += '\n\n' + sig; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | else |
| | | cursor_pos = this.env.top_posting ? 0 : message.length; |
| | | |
| | | input_message.val(message); |
| | | |
| | | // move cursor before the signature |
| | | this.set_caret_pos(input_message.get(0), cursor_pos); |
| | | } |
| | | else if (is_html && show_sig && this.env.signatures) { // html |
| | | var editor = tinyMCE.get(this.env.composebody); |
| | | var sigElem = editor.dom.get('_rc_sig'); |
| | | |
| | | if (this.env.signatures) |
| | | { |
| | | // Append the signature as a div within the body |
| | | var sigElem = editor.dom.get('_rc_sig'); |
| | | var newsig = ''; |
| | | var htmlsig = true; |
| | | |
| | | if (!sigElem) |
| | | { |
| | | // add empty line before signature on IE |
| | | if (bw.ie) |
| | | editor.getBody().appendChild(editor.getDoc().createElement('br')); |
| | | |
| | | sigElem = editor.getDoc().createElement('div'); |
| | | sigElem.setAttribute('id', '_rc_sig'); |
| | | editor.getBody().appendChild(sigElem); |
| | | // Append the signature as a div within the body |
| | | if (!sigElem) { |
| | | var body = editor.getBody(); |
| | | var doc = editor.getDoc(); |
| | | |
| | | sigElem = doc.createElement('div'); |
| | | sigElem.setAttribute('id', '_rc_sig'); |
| | | |
| | | if (this.env.sig_above) { |
| | | // if no existing sig and top posting then insert at caret pos |
| | | editor.getWin().focus(); // correct focus in IE |
| | | |
| | | var node = editor.selection.getNode(); |
| | | if (node.nodeName == 'BODY') { |
| | | // no real focus, insert at start |
| | | body.insertBefore(sigElem, body.firstChild); |
| | | body.insertBefore(doc.createElement('br'), body.firstChild); |
| | | } |
| | | |
| | | if (this.env.signatures[id]) |
| | | { |
| | | newsig = this.env.signatures[id]['text']; |
| | | htmlsig = this.env.signatures[id]['is_html']; |
| | | |
| | | if (newsig) { |
| | | if (htmlsig && this.env.signatures[id]['plain_text'].indexOf('-- ')!=0) |
| | | newsig = '<p>-- </p>' + newsig; |
| | | else if (!htmlsig && newsig.indexOf('-- ')!=0) |
| | | newsig = '-- \n' + newsig; |
| | | else { |
| | | body.insertBefore(sigElem, node.nextSibling); |
| | | body.insertBefore(doc.createElement('br'), node.nextSibling); |
| | | } |
| | | } |
| | | else { |
| | | if (bw.ie) // add empty line before signature on IE |
| | | body.appendChild(doc.createElement('br')); |
| | | |
| | | if (htmlsig) |
| | | sigElem.innerHTML = newsig; |
| | | else |
| | | sigElem.innerHTML = '<pre>' + newsig + '</pre>'; |
| | | body.appendChild(sigElem); |
| | | } |
| | | } |
| | | |
| | | input_message.val(message); |
| | | if (this.env.signatures[id]) { |
| | | if (this.env.signatures[id].is_html) { |
| | | sig = this.env.signatures[id].text; |
| | | if (this.env.signatures[id].plain_text.indexOf('-- ') != 0) |
| | | sig = '-- <br />' + sig; |
| | | } |
| | | else { |
| | | sig = this.env.signatures[id].text; |
| | | if (sig.indexOf('-- ') != 0) |
| | | sig = '-- \n' + sig; |
| | | sig = '<pre>' + sig + '</pre>'; |
| | | } |
| | | |
| | | // move cursor before the signature |
| | | if (!is_html) |
| | | this.set_caret_pos(input_message.get(0), len); |
| | | sigElem.innerHTML = sig; |
| | | } |
| | | } |
| | | |
| | | this.env.identity = id; |
| | | return true; |
| | | }; |
| | | }; |
| | | |
| | | this.show_attachment_form = function(a) |
| | | { |
| | |
| | | this.ksearch_display_results = function (a_results) |
| | | { |
| | | // display search results |
| | | if (a_results.length && this.ksearch_input) { |
| | | var p, ul, li; |
| | | if (a_results.length && this.ksearch_input && this.ksearch_value) { |
| | | var p, ul, li, s_val = this.ksearch_value; |
| | | |
| | | // create results pane if not present |
| | | if (!this.ksearch_pane) { |
| | |
| | | // remove all search results |
| | | ul = this.ksearch_pane.__ul; |
| | | ul.innerHTML = ''; |
| | | |
| | | |
| | | // add each result line to list |
| | | for (i=0; i<a_results.length; i++) { |
| | | li = document.createElement('LI'); |
| | | li.innerHTML = a_results[i].replace(new RegExp('('+this.ksearch_value+')', 'ig'), '##$1%%').replace(/</g, '<').replace(/>/g, '>').replace(/##([^%]+)%%/g, '<b>$1</b>'); |
| | | li.innerHTML = a_results[i].replace(new RegExp('('+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; |
| | |
| | | if (!this.gui_objects.subscriptionlist) |
| | | return false; |
| | | |
| | | // find not protected folder |
| | | for (var refid in this.env.subscriptionrows) |
| | | if (this.env.subscriptionrows[refid]!=null && !this.env.subscriptionrows[refid][2]) |
| | | // find not protected folder |
| | | var refid; |
| | | for (var rid in this.env.subscriptionrows) |
| | | if (this.env.subscriptionrows[rid]!=null && !this.env.subscriptionrows[rid][2]) { |
| | | refid = rid; |
| | | break; |
| | | } |
| | | |
| | | var refrow, form; |
| | | var tbody = this.gui_objects.subscriptionlist.tBodies[0]; |
| | |
| | | refid = replace.id; |
| | | } |
| | | |
| | | if (!id || !(refrow = document.getElementById(refid))) |
| | | if (!id || !refid || !(refrow = document.getElementById(refid))) |
| | | { |
| | | // Refresh page if we don't have a table row to clone |
| | | this.goto_url('folders'); |
| | | return false; |
| | | } |
| | | else |
| | | { |
| | |
| | | // set messages count to zero |
| | | if (!replace) |
| | | row.cells[1].innerHTML = '*'; |
| | | |
| | | |
| | | if (!replace && row.cells[2] && row.cells[2].firstChild.tagName.toLowerCase()=='input') |
| | | { |
| | | row.cells[2].firstChild.value = name; |
| | |
| | | // replace content of quota display |
| | | this.set_quota = function(content) |
| | | { |
| | | if (content && this.gui_objects.quotadisplay) |
| | | $(this.gui_objects.quotadisplay).html(content); |
| | | if (content && this.gui_objects.quotadisplay) { |
| | | if (typeof(content) == 'object') |
| | | this.percent_indicator(this.gui_objects.quotadisplay, content); |
| | | else |
| | | $(this.gui_objects.quotadisplay).html(content); |
| | | } |
| | | }; |
| | | |
| | | // update the mailboxlist |
| | |
| | | elem.onclick = function() { rcmail.load_headers(elem); } |
| | | } |
| | | |
| | | // percent (quota) indicator |
| | | this.percent_indicator = function(obj, data) |
| | | { |
| | | if (!data || !obj) |
| | | return false; |
| | | |
| | | var limit_high = 80; |
| | | var limit_mid = 55; |
| | | var width = data.width ? data.width : this.env.indicator_width ? this.env.indicator_width : 100; |
| | | var height = data.height ? data.height : this.env.indicator_height ? this.env.indicator_height : 14; |
| | | var quota = data.percent ? Math.abs(parseInt(data.percent)) : 0; |
| | | var quota_width = parseInt(quota / 100 * width); |
| | | var pos = $(obj).position(); |
| | | |
| | | this.env.indicator_width = width; |
| | | this.env.indicator_height = height; |
| | | |
| | | // overlimit |
| | | if (quota_width > width) { |
| | | quota_width = width; |
| | | quota = 100; |
| | | } |
| | | |
| | | // main div |
| | | var main = $('<div>'); |
| | | main.css({position: 'absolute', top: pos.top, left: pos.left, |
| | | width: width + 'px', height: height + 'px', zIndex: 100, lineHeight: height + 'px'}) |
| | | .attr('title', data.title).addClass('quota_text').html(quota + '%'); |
| | | // used bar |
| | | var bar1 = $('<div>'); |
| | | bar1.css({position: 'absolute', top: pos.top + 1, left: pos.left + 1, |
| | | width: quota_width + 'px', height: height + 'px', zIndex: 99}); |
| | | // background |
| | | var bar2 = $('<div>'); |
| | | bar2.css({position: 'absolute', top: pos.top + 1, left: pos.left + 1, |
| | | width: width + 'px', height: height + 'px', zIndex: 98}) |
| | | .addClass('quota_bg'); |
| | | |
| | | if (quota >= limit_high) { |
| | | main.addClass(' quota_text_high'); |
| | | bar1.addClass('quota_high'); |
| | | } |
| | | else if(quota >= limit_mid) { |
| | | main.addClass(' quota_text_mid'); |
| | | bar1.addClass('quota_mid'); |
| | | } |
| | | else { |
| | | main.addClass(' quota_text_normal'); |
| | | bar1.addClass('quota_low'); |
| | | } |
| | | |
| | | // replace quota image |
| | | obj.innerHTML = ''; |
| | | $(obj).append(bar1).append(bar2).append(main); |
| | | } |
| | | |
| | | /********************************************************/ |
| | | /********* html to text conversion functions *********/ |
| | |
| | | |
| | | if (this.env.framed && window.parent) |
| | | parent.location.href = url; |
| | | else |
| | | else |
| | | location.href = url; |
| | | }; |
| | | |
| | |
| | | var url = this.env.comm_path + '&_action=' + action + '&' + querystring |
| | | |
| | | // send request |
| | | console.log('HTTP POST: ' + url); |
| | | console.log('HTTP GET: ' + url); |
| | | jQuery.get(url, { _unlock:(lock?1:0) }, function(data){ ref.http_response(data); }, 'json'); |
| | | }; |
| | | |
| | |
| | | |
| | | case 'moveto': |
| | | 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); |
| | | // 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; |
| | |
| | | this.show_contentframe(false); |
| | | // disable commands useless when mailbox is empty |
| | | 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); |
| | | 'mark', 'viewsource', 'open', 'edit', 'download', 'print', 'load-attachment', |
| | | 'purge', 'expunge', 'select-all', 'select-none', 'sort', false); |
| | | } |
| | | break; |
| | | |
| | |
| | | }; |
| | | |
| | | // send periodic request to check for recent messages |
| | | this.check_for_recent = function(setbusy) |
| | | this.check_for_recent = function(refresh) |
| | | { |
| | | if (this.busy) |
| | | return; |
| | | |
| | | if (setbusy) |
| | | this.set_busy(true, 'checkingmail'); |
| | | |
| | | var addurl = '_t=' + (new Date().getTime()); |
| | | |
| | | if (refresh) { |
| | | this.set_busy(true, 'checkingmail'); |
| | | addurl += '&_refresh=1'; |
| | | } |
| | | |
| | | if (this.gui_objects.messagelist) |
| | | addurl += '&_list=1'; |
| | |
| | | rcube_webmail.prototype.addEventListener = rcube_event_engine.prototype.addEventListener; |
| | | rcube_webmail.prototype.removeEventListener = rcube_event_engine.prototype.removeEventListener; |
| | | rcube_webmail.prototype.triggerEvent = rcube_event_engine.prototype.triggerEvent; |
| | | |