From fa80002ae1bb5ab46a81405f9b8422fa3bb2228d Mon Sep 17 00:00:00 2001 From: Michael M Slusarz Date: Thu, 25 Feb 2010 09:30:45 -0700 Subject: [PATCH] Consolidate some duplicate compose code between imp and dimp views. --- imp/compose-dimp.php | 1 + imp/compose.php | 64 +++------------- imp/js/compose-base.js | 117 ++++++++++++++++++++++++++++ imp/js/compose-dimp.js | 155 ++++++++------------------------------ imp/js/compose.js | 105 +++++--------------------- imp/lib/Ui/Compose.php | 30 ++++++++ imp/lib/Views/Compose.php | 35 ++------- imp/message-dimp.php | 5 +- imp/templates/javascript_defs.php | 2 - 9 files changed, 217 insertions(+), 297 deletions(-) create mode 100644 imp/js/compose-base.js diff --git a/imp/compose-dimp.php b/imp/compose-dimp.php index d37a47f1f..ed0d9a514 100644 --- a/imp/compose-dimp.php +++ b/imp/compose-dimp.php @@ -197,6 +197,7 @@ $compose_result['js_onload'][] = 'DimpCompose.fillForm(' . Horde_Serialize::seri Horde::addInlineScript($compose_result['js_onload'], 'load'); $scripts = array( + array('compose-base.js', 'imp'), array('compose-dimp.js', 'imp'), array('md5.js', 'horde'), array('TextareaResize.js', 'horde') diff --git a/imp/compose.php b/imp/compose.php index 18a8fcc1e..83b753f4f 100644 --- a/imp/compose.php +++ b/imp/compose.php @@ -22,8 +22,8 @@ $header = array(); $msg = ''; $get_sig = true; -$showmenu = false; -$cursor_pos = $oldrtemode = $rtemode = $siglocation = null; +$showmenu = $spellcheck = false; +$oldrtemode = $rtemode = null; /* Set the current identity. */ $identity = Horde_Prefs_Identity::singleton(array('imp', 'imp')); @@ -546,7 +546,6 @@ $composeCacheID = $imp_compose->getCacheId(); $redirect = ($actionID == 'redirect_compose'); /* Attach autocompleters to the compose form elements. */ -$spellcheck = false; if ($browser->hasFeature('javascript')) { if ($redirect) { $imp_ui->attachAutoCompleter(array('to')); @@ -558,6 +557,7 @@ if ($browser->hasFeature('javascript')) { } } $imp_ui->attachAutoCompleter($auto_complete); + if (!empty($conf['spell']['driver'])) { try { Horde_SpellChecker::factory($conf['spell']['driver'], array()); @@ -623,7 +623,7 @@ if (!is_null($oldrtemode) && ($oldrtemode != $rtemode)) { $msg = preg_replace('/\s+##IMP_SIGNATURE##/', '##IMP_SIGNATURE_WS####IMP_SIGNATURE##', $msg); $msg = $imp_compose->text2html($msg); $msg = str_replace(array('##IMP_SIGNATURE_WS##', '##IMP_SIGNATURE##'), - array('

 

', '

' . $imp_compose->text2html($sig) . '

'), + array('

 

', '

' . $imp_compose->text2html($sig) . '

'), $msg); } else { $msg = Horde_Text_Filter::filter($msg, 'html2text', array('charset' => Horde_Nls::getCharset(), 'wrap' => false)); @@ -644,19 +644,12 @@ foreach (array('to', 'cc', 'bcc', 'subject') as $val) { if ($get_sig && isset($msg) && !empty($sig)) { if ($rtemode) { - $sig = '

 

' . $imp_compose->text2html(trim($sig)) . '

'; + $sig = '

 

' . $imp_compose->text2html(trim($sig)) . '

'; } if ($identity->getValue('sig_first')) { - $siglocation = 0; $msg = "\n" . $sig . $msg; } else { - $siglocation = Horde_String::length($msg); - /* We always add a line break at the beginning, so if length is 1, - ignore that line break (i.e. the message is empty). */ - if ($siglocation == 1) { - $siglocation = 0; - } $msg .= "\n" . $sig; } } @@ -686,65 +679,25 @@ if ($prefs->getValue('use_pgp') && !$prefs->isLocked('default_encrypt')) { } } -/* Determine the default cursor position in the compose text area. */ -if (!$rtemode) { - switch ($prefs->getValue('compose_cursor')) { - case 'top': - default: - $cursor_pos = 0; - break; - - case 'bottom': - $cursor_pos = Horde_String::length($msg); - break; - - case 'sig': - if (!is_null($siglocation)) { - $cursor_pos = $siglocation; - } elseif (!empty($sig)) { - $next_pos = $pos = 0; - $sig_length = Horde_String::length($sig); - do { - $cursor_pos = $pos; - $pos = strpos($msg, $sig, $next_pos); - $next_pos = $pos + $sig_length; - } while ($pos !== false); - } - break; - }; -} - /* Define some variables used in the javascript code. */ $js_code = array( + 'IMP_Compose_Base.editor_on = ' . intval($rtemode), 'ImpCompose.auto_save = ' . intval($prefs->getValue('auto_save_drafts')), 'ImpCompose.cancel_url = \'' . $cancel_url . '\'', - 'ImpCompose.cursor_pos = ' . (is_null($cursor_pos) ? 'null' : $cursor_pos), + 'ImpCompose.cursor_pos = ' .($rtemode ? 'null' : ('"' . $prefs->getValue('compose_cursor') . '"')), 'ImpCompose.max_attachments = ' . (($max_attach === true) ? 'null' : $max_attach), 'ImpCompose.popup = ' . intval($isPopup), 'ImpCompose.redirect = ' . intval($redirect), 'ImpCompose.reloaded = ' . intval($token), - 'ImpCompose.rtemode = ' . intval($rtemode), 'ImpCompose.smf_check = ' . intval($smf_check), 'ImpCompose.spellcheck = ' . intval($spellcheck && $prefs->getValue('compose_spellcheck')) ); /* Create javascript identities array. */ if (!$redirect) { - $js_ident = array(); - foreach ($identity->getAllSignatures() as $ident => $sig) { - $smf = $identity->getValue('sent_mail_folder', $ident); - $js_ident[] = array( - ($rtemode) ? str_replace(' target="_blank"', '', Horde_Text_Filter::filter($sig, 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO_LINKURL, 'class' => null, 'callback' => null))) : $sig, - $identity->getValue('sig_first', $ident), - ($smf_check) ? $smf : IMP::displayFolder($smf), - $identity->saveSentmail($ident), - Horde_Mime_Address::addrArray2String($identity->getBccAddresses($ident)) - ); - } - $js_code[] = 'ImpCompose.identities = ' . Horde_Serialize::serialize($js_ident, Horde_Serialize::JSON, Horde_Nls::getCharset()); + $js_code[] = $imp_ui->identityJs(); } - /* Set up the base template now. */ $t = $injector->createInstance('Horde_Template'); $t->setOption('gettext', true); @@ -1086,6 +1039,7 @@ if ($rtemode && !$redirect) { if ($showmenu) { IMP::prepareMenu(); } +Horde::addScriptFile('compose-base.js', 'imp'); Horde::addScriptFile('compose.js', 'imp'); Horde::addScriptFile('md5.js', 'horde'); require IMP_TEMPLATES . '/common-header.inc'; diff --git a/imp/js/compose-base.js b/imp/js/compose-base.js new file mode 100644 index 000000000..48177df40 --- /dev/null +++ b/imp/js/compose-base.js @@ -0,0 +1,117 @@ +/** + * compose-base.js - Provides basic compose javascript functions shared + * between standarad and dynamic displays. + * + * See the enclosed file COPYING for license information (GPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/gpl.html. + */ + +var IMP_Compose_Base = { + + // Vars defaulting to null: editor_on, identities + + getIdentity: function(id) + { + return { + id: this.identities[id], + sig: this.identities[id][(this.editor_on ? 'sig_html' : 'sig')].replace(/^\n/, '') + }; + }, + + setCursorPosition: function(input, type, sig) + { + var pos, range; + + if (!(input = $(input))) { + return; + } + + switch (type) { + case 'top': + pos = 0; + input.setValue('\n' + $F(input)); + break; + + case 'bottom': + pos = input.length; + break; + + case 'sig': + pos = input.replace(/\r\n/g, '\n').lastIndexOf(sig) - 1; + break; + + default: + return; + } + + if (input.setSelectionRange) { + /* This works in Mozilla. */ + Field.focus(input); + input.setSelectionRange(pos, pos); + if (pos) { + (function() { input.scrollTop = input.scrollHeight - input.offsetHeight; }).defer(); + } + } else if (input.createTextRange) { + /* This works in IE */ + range = input.createTextRange(); + range.collapse(true); + range.moveStart('character', pos); + range.moveEnd('character', 0); + Field.select(range); + range.scrollIntoView(true); + } + }, + + replaceSignature: function(id) + { + var lastsig, msg, nextsig, oldmsg, pos, + last = this.getIdentity($F('last_identity')), + next = this.getIdentity(id); + + // If the rich text editor is on, we'll use a regexp to find the + // signature comment and replace its contents. + if (this.editor_on) { + msg = oldmsg = CKEDITOR.instances['composeMessage'].getData().replace(/\r\n/g, '\n'); + + lastsig = '

'; + nextsig = '

' + next.sig.replace(/^ ?
\n/, '').replace(/ +/g, ' ') + '

'; + + // Dot-all functionality achieved with [\s\S], see: + // http://simonwillison.net/2004/Sep/20/newlines/ + msg = msg.replace(/

\s*[\s\S]*?\s*<\/p>/, lastsig); + if (msg == oldmsg) { + msg = nextsig; + } + } else { + msg = $F('composeMessage').replace(/\r\n/g, '\n'); + + lastsig = last.sig.replace(/^\n/, ''); + nextsig = next.sig.replace(/^\n/, ''); + } + + pos = (last.id.sig_loc) + ? msg.indexOf(lastsig) + : msg.lastIndexOf(lastsig); + + if (pos != -1) { + if (next.id.sig_loc == last.id.sig_loc) { + msg = msg.substring(0, pos) + nextsig + msg.substring(pos + lastsig.length, msg.length); + } else if (next.id.sig_loc) { + msg = nextsig + msg.substring(0, pos) + msg.substring(pos + lastsig.length, msg.length); + } else { + msg = msg.substring(0, pos) + msg.substring(pos + lastsig.length, msg.length) + nextsig; + } + + msg = msg.replace(/\r\n/g, '\n').replace(/\n/g, '\r\n'); + } + + if (this.editor_on) { + CKEDITOR.instances['composeMessage'].setData(msg); + } else { + $('composeMessage').setValue(msg); + } + + $('last_identity').setValue(id); + } + +}; diff --git a/imp/js/compose-dimp.js b/imp/js/compose-dimp.js index 34865c3ab..ea71ed64b 100644 --- a/imp/js/compose-dimp.js +++ b/imp/js/compose-dimp.js @@ -9,7 +9,7 @@ var DimpCompose = { // Variables defaulting to empty/false: - // auto_save_interval, compose_cursor, disabled, drafts_mbox, editor_on, + // auto_save_interval, compose_cursor, disabled, drafts_mbox, // is_popup, knl_p, knl_sm, last_msg, loaded, rte, skip_spellcheck, // spellcheck, sc_submit, uploading @@ -58,7 +58,7 @@ var DimpCompose = { $('composeCache').clear(); $('qreply', 'sendcc', 'sendbcc').invoke('hide'); [ $('msgData'), $('togglecc'), $('togglebcc') ].invoke('show'); - if (this.editor_on) { + if (IMP_Compose_Base.editor_on) { this.toggleHtmlEditor(); } $('compose').reset(); @@ -71,52 +71,13 @@ var DimpCompose = { changeIdentity: function() { - var lastSignature, msg, nextSignature, pos, - id = $F('identity'), - last = this.getIdentity($F('last_identity')), - msgval = $('composeMessage'), - next = this.getIdentity(id); - - this.setSentMailLabel(next.id[3], next.id[5], true); - $('bcc').setValue(next.id[6]); - this.setSaveSentMail(next.id[4]); - - // Finally try and replace the signature. - if (this.editor_on) { - msg = this.rte.getData().replace(/\r\n/g, '\n'); - lastSignature = '

'; - nextSignature = '

' + next.sig.replace(/^ ?
\n/, '').replace(/ +/g, ' ') + '

'; - - // Dot-all functionality achieved with [\s\S], see: - // http://simonwillison.net/2004/Sep/20/newlines/ - msg = msg.replace(/

\s*[\s\S]*?\s*<\/p>/, lastSignature); - } else { - msg = $F(msgval).replace(/\r\n/g, '\n'); - lastSignature = last.sig; - nextSignature = next.sig; - } - - pos = (last.id[2]) - ? msg.indexOf(lastSignature) - : msg.lastIndexOf(lastSignature); - - if (pos != -1) { - if (next.id[2] == last.id[2]) { - msg = msg.substring(0, pos) + nextSignature + msg.substring(pos + lastSignature.length, msg.length); - } else if (next.id[2]) { - msg = nextSignature + msg.substring(0, pos) + msg.substring(pos + lastSignature.length, msg.length); - } else { - msg = msg.substring(0, pos) + msg.substring(pos + lastSignature.length, msg.length) + nextSignature; - } + var identity = IMP_Compose_Base.getIdentity($F('identity')); - msg = msg.replace(/\r\n/g, '\n').replace(/\n/g, '\r\n'); - if (this.editor_on) { - this.rte.setData(msg); - } else { - msgval.setValue(msg); - } - $('last_identity').setValue(id); - } + this.setSentMailLabel(identity.id.smf_name, identity.id.smf_display, true); + $('bcc').setValue(identity.id.bcc); + this.setSaveSentMail(identity.id.smf_save); + + IMP_Compose_Base.replaceSignature($F('identity')); }, setSaveSentMail: function(set) @@ -174,15 +135,6 @@ var DimpCompose = { $('priority_label').setText(l.l); }, - getIdentity: function(id, editor_on) - { - editor_on = Object.isUndefined(editor_on) ? this.editor_on : editor_on; - return { - id: DIMP.conf_compose.identities[id], - sig: DIMP.conf_compose.identities[id][(editor_on ? 1 : 0)].replace(/^\n/, '') - }; - }, - uniqueSubmit: function(action) { var c = $('compose'); @@ -229,7 +181,7 @@ var DimpCompose = { c.submit(); } else { // Move HTML text to textarea field for submission. - if (this.editor_on) { + if (IMP_Compose_Base.editor_on) { this.rte.updateElement(); } @@ -336,7 +288,7 @@ var DimpCompose = { if (DIMP.SpellChecker) { DIMP.SpellChecker.disable(disable); } - if (this.editor_on) { + if (IMP_Compose_Base.editor_on) { this.RTELoading(disable ? 'show' : 'hide', true); } }, @@ -353,7 +305,7 @@ var DimpCompose = { var config, text; - if (this.editor_on) { + if (IMP_Compose_Base.editor_on) { text = this.rte.getData(); this.rte.destroy(); @@ -378,10 +330,10 @@ var DimpCompose = { this.rte = CKEDITOR.replace('composeMessage', config); } - this.editor_on = !this.editor_on; + IMP_Compose_Base.editor_on = !IMP_Compose_Base.editor_on; - $('htmlcheckbox').setValue(this.editor_on); - $('html').setValue(this.editor_on ? 1 : 0); + $('htmlcheckbox').setValue(IMP_Compose_Base.editor_on); + $('html').setValue(Number(IMP_Compose_Base.editor_on)); }, RTELoading: function(cmd, notxt) @@ -405,7 +357,7 @@ var DimpCompose = { _onSpellCheckAfter: function() { - if (this.editor_on) { + if (IMP_Compose_Base.editor_on) { this.rte.setData($F('composeMessage')); $('composeMessage').next().show(); } @@ -414,11 +366,11 @@ var DimpCompose = { _onSpellCheckBefore: function() { - DIMP.SpellChecker.htmlAreaParent = this.editor_on + DIMP.SpellChecker.htmlAreaParent = IMP_Compose_Base.editor_on ? 'composeMessageParent' : null; - if (this.editor_on) { + if (IMP_Compose_Base.editor_on) { this.rte.updateElement(); $('composeMessage').next().hide(); } @@ -444,7 +396,7 @@ var DimpCompose = { ta.setValue(r.response.text); } - if (!this.editor_on) { + if (!IMP_Compose_Base.editor_on) { this.resizeMsgArea(); } }, @@ -459,14 +411,14 @@ var DimpCompose = { } var bcc_add, - identity = this.getIdentity($F('last_identity')); + identity = IMP_Compose_Base.getIdentity($F('last_identity')); opts = opts || {}; // Set auto-save-drafts now if not already active. if (DIMP.conf_compose.auto_save_interval_val && !this.auto_save_interval) { this.auto_save_interval = new PeriodicalExecuter(function() { - var curr_hash = MD5.hash($('to', 'cc', 'bcc', 'subject').invoke('getValue').join('\0') + (this.editor_on ? this.rte.getData() : $F('composeMessage'))); + var curr_hash = MD5.hash($('to', 'cc', 'bcc', 'subject').invoke('getValue').join('\0') + (IMP_Compose_Base.editor_on ? this.rte.getData() : $F('composeMessage'))); if (this.last_msg && curr_hash != this.last_msg) { this.uniqueSubmit('AutoSaveDraft'); } @@ -485,17 +437,17 @@ var DimpCompose = { if (DIMP.conf_compose.cc) { this.toggleCC('cc', true); } - this.setSentMailLabel(identity.id[3], identity.id[5], true); - this.setSaveSentMail(identity.id[4]); + this.setSentMailLabel(identity.id.smf_name, identity.id.smf_display, true); + this.setSaveSentMail(identity.id.smf_save); if (header.bcc) { $('bcc').setValue(header.bcc); } - if (identity.id[6]) { + if (identity.id.bcc) { bcc_add = $F('bcc'); if (bcc_add) { bcc_add += ', '; } - $('bcc').setValue(bcc_add + identity.id[6]); + $('bcc').setValue(bcc_add + identity.id.bcc); } if (DIMP.conf_compose.bcc) { this.toggleCC('bcc', true); @@ -525,7 +477,7 @@ var DimpCompose = { } if (DIMP.conf_compose.show_editor) { - if (!this.editor_on) { + if (!IMP_Compose_Base.editor_on) { this.toggleHtmlEditor(opts.noupdate); } if (opts.focus && (opts.focus == 'composeMessage')) { @@ -536,14 +488,11 @@ var DimpCompose = { setBodyText: function(msg) { - var msgval; - - if (this.editor_on) { + if (IMP_Compose_Base.editor_on) { this.rte.setData(msg); } else { - msgval = $('composeMessage'); - msgval.setValue(msg); - this.setCursorPosition(msgval); + $('composeMessage').setValue(msg); + IMP_Compose_Base.setCursorPosition('composeMessage', DIMP.conf_compose.compose_cursor, IMP_Compose_Base.getIdentity($F('last_identity')).sig); } }, @@ -638,7 +587,7 @@ var DimpCompose = { mah = document.viewport.getHeight() - cmp.offsetTop; - if (this.editor_on) { + if (IMP_Compose_Base.editor_on) { [ 'margin', 'padding', 'border' ].each(function(s) { [ 'Top', 'Bottom' ].each(function(h) { var a = parseInt(cmp.getStyle(s + h), 10); @@ -692,47 +641,6 @@ var DimpCompose = { } }, - /* Sets the cursor to the given position. */ - setCursorPosition: function(input) - { - var pos, range; - - switch (DIMP.conf_compose.compose_cursor) { - case 'top': - pos = 0; - $('composeMessage').setValue('\n' + $F('composeMessage')); - break; - - case 'bottom': - pos = $F('composeMessage').length; - break; - - case 'sig': - pos = $F('composeMessage').replace(/\r\n/g, '\n').lastIndexOf(this.getIdentity($F('last_identity')).sig) - 1; - break; - - default: - return; - } - - if (input.setSelectionRange) { - /* This works in Mozilla */ - Field.focus(input); - input.setSelectionRange(pos, pos); - if (pos) { - (function() { input.scrollTop = input.scrollHeight - input.offsetHeight; }).defer(); - } - } else if (input.createTextRange) { - /* This works in IE */ - range = input.createTextRange(); - range.collapse(true); - range.moveStart('character', pos); - range.moveEnd('character', 0); - Field.select(range); - range.scrollIntoView(true); - } - }, - /* Open the addressbook window. */ openAddressbook: function() { @@ -771,7 +679,8 @@ var DimpCompose = { break; case 'htmlcheckbox': - if (!this.editor_on || window.confirm(DIMP.text_compose.toggle_html)) { + if (!IMP_Compose_Base.editor_on || + window.confirm(DIMP.text_compose.toggle_html)) { this.toggleHtmlEditor(); } else { $('htmlcheckbox').setValue(true); @@ -881,7 +790,7 @@ var DimpCompose = { list: DIMP.conf_compose.flist, onChoose: this.setSentMailLabel.bind(this) }); - this.knl_sm.setSelected(this.getIdentity($F('identity'))[3]); + this.knl_sm.setSelected(IMP_Compose_Base.getIdentity($F('identity')).id.smf_name); $('sent_mail_folder_label').insert({ after: new Element('SPAN', { className: 'popdownImg' }).observe('click', function(e) { if (!this.disabled) { this.knl_sm.show(); this.knl_sm.ignoreClick(e); e.stop(); } }.bindAsEventListener(this)) }); } diff --git a/imp/js/compose.js b/imp/js/compose.js index 53257548c..f131313b8 100644 --- a/imp/js/compose.js +++ b/imp/js/compose.js @@ -7,9 +7,8 @@ var ImpCompose = { // Variables defined in compose.php: - // cancel_url, spellcheck, cursor_pos, identities, last_msg, - // max_attachments, popup, redirect, reloaded, rtemode, sc_submit, - // smf_check, skip_spellcheck + // cancel_url, spellcheck, cursor_pos, last_msg, max_attachments, + // popup, redirect, reloaded, sc_submit, smf_check, skip_spellcheck display_unload_warning: true, confirmCancel: function(e) @@ -30,86 +29,22 @@ var ImpCompose = { } }, - /** - * Sets the cursor to the given position. - */ - setCursorPosition: function(input, position) - { - if (input.setSelectionRange) { - /* This works in Mozilla */ - Field.focus(input); - input.setSelectionRange(position, position); - if (position) { - (function() { input.scrollTop = input.scrollHeight - input.offsetHeight; }).defer(); - } - } else if (input.createTextRange) { - /* This works in IE */ - var range = input.createTextRange(); - range.collapse(true); - range.moveStart('character', position); - range.moveEnd('character', 0); - Field.select(range); - range.scrollIntoView(true); - } - }, - changeIdentity: function(elt) { var id = $F(elt), - last = this.identities[$F('last_identity')], - next = this.identities[id], + last = IMP_Compose_Base.getIdentity($F('last_identity')), + next = IMP_Compose_Base.getIdentity(id), i = 0, bcc = $('bcc'), save = $('ssm'), smf = $('sent_mail_folder'), - lastSignature, msg, nextSignature, pos, re; - - // If the rich text editor is on, we'll use a regexp to find the - // signature comment and replace its contents. - if (this.rtemode) { - msg = CKEDITOR.instances.composeMessage.getData().replace(/\r\n/g, '\n'); - - lastSignature = '

'; - nextSignature = '

' + next[0].replace(/^ ?
\n/, '').replace(/ +/g, ' ') + '

'; - - // Dot-all functionality achieved with [\s\S], see: - // http://simonwillison.net/2004/Sep/20/newlines/ - msg = msg.replace(/

\s*[\s\S]*?\s*<\/p>/, lastSignature); - } else { - msg = $F('composeMessage').replace(/\r\n/g, '\n'); - - lastSignature = last[0].replace(/^\n/, ''); - nextSignature = next[0].replace(/^\n/, ''); - } - - pos = (last[1]) ? msg.indexOf(lastSignature) : msg.lastIndexOf(lastSignature); - if (pos != -1) { - if (next[1] == last[1]) { - msg = msg.substring(0, pos) + nextSignature + msg.substring(pos + lastSignature.length, msg.length); - } else if (next[1]) { - msg = nextSignature + msg.substring(0, pos) + msg.substring(pos + lastSignature.length, msg.length); - } else { - msg = msg.substring(0, pos) + msg.substring(pos + lastSignature.length, msg.length) + nextSignature; - } - - msg = msg.replace(/\r\n/g, '\n').replace(/\n/g, '\r\n'); - - $('last_identity').setValue(id); - window.status = IMP.text.compose_sigreplace; - } else { - window.status = IMP.text.compose_signotreplace; - } - - if (this.rtemode) { - CKEDITOR.instances.composeMessage.setData(msg); - } else { - $('composeMessage').setValue(msg); - } + re; + IMP_Compose_Base.replaceSignature(id); if (this.smf_check) { $A(smf.options).detect(function(f) { - if (f.value == next[2]) { + if (f.value == next.id.smf_name) { smf.selectedIndex = i; return true; } @@ -117,31 +52,31 @@ var ImpCompose = { }); } else { if (smf.firstChild) { - smf.replaceChild(document.createTextNode(next[2]), smf.firstChild); + smf.replaceChild(document.createTextNode(next.id.smf_name), smf.firstChild); } else { - smf.appendChild(document.createTextNode(next[2])); + smf.appendChild(document.createTextNode(next.id.smf_name)); } } if (save) { - save.checked = next[3]; + save.checked = next.id.smf_save; } if (bcc) { bccval = bcc.value; - if (last[4]) { - re = new RegExp(last[4] + ",? ?", 'gi'); + if (last.id.bcc) { + re = new RegExp(last.id.bcc + ",? ?", 'gi'); bccval = bccval.replace(re, ""); if (bccval) { bccval = bccval.replace(/, ?$/, ""); } } - if (next[4]) { + if (next.id.bcc) { if (bccval) { bccval += ', '; } - bccval += next[4]; + bccval += next.id.bcc; } bcc.setValue(bccval); @@ -198,7 +133,7 @@ var ImpCompose = { case 'auto_save_draft': // Move HTML text to textarea field for submission. - if (this.rtemode) { + if (IMP_Compose_Base.editor_on) { CKEDITOR.instances.composeMessage.updateElement(); } @@ -347,9 +282,7 @@ var ImpCompose = { } }); - if (this.cursor_pos !== null && $('composeMessage')) { - this.setCursorPosition($('composeMessage'), this.cursor_pos); - } + IMP_Compose_Base.setCursorPosition('composeMessage', this.cursor_pos, IMP_Compose_Base.getIdentity($F('last_identity')).sig); if (this.redirect) { $('to').focus(); @@ -363,7 +296,7 @@ var ImpCompose = { }); } - if (this.rtemode) { + if (IMP_Compose_Base.editor_on) { document.observe('SpellChecker:after', this._onAfterSpellCheck.bind(this)); document.observe('SpellChecker:before', this._onBeforeSpellCheck.bind(this)); } @@ -371,7 +304,7 @@ var ImpCompose = { if ($('to') && !$F('to')) { $('to').focus(); } else if (!$F('subject')) { - if (this.rtemode) { + if (IMP_Compose_Base.editor_on) { $('subject').focus(); } else { $('composeMessage').focus(); @@ -410,7 +343,7 @@ var ImpCompose = { if (this.sc_submit) { this.skip_spellcheck = true; this.uniqSubmit(this.sc_submit.a, this.sc_submit.e); - } else if (this.rtemode) { + } else if (IMP_Compose_Base.editor_on) { this._onAfterSpellCheck(); } else { this.sc_submit = null; diff --git a/imp/lib/Ui/Compose.php b/imp/lib/Ui/Compose.php index 974268682..a02c8418d 100644 --- a/imp/lib/Ui/Compose.php +++ b/imp/lib/Ui/Compose.php @@ -320,4 +320,34 @@ class IMP_Ui_Compose Horde::addInlineScript(array($js), 'dom'); } + /** + */ + public function identityJs() + { + $identities = array(); + $identity = Horde_Prefs_Identity::singleton(array('imp', 'imp')); + + foreach ($identity->getAllSignatures() as $ident => $sig) { + $identities[] = array( + // Plain text signature + 'sig' => $sig, + // HTML signature + 'sig_html' => str_replace(' target="_blank"', '', Horde_Text_Filter::filter($sig, 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO_LINKURL, 'class' => null, 'callback' => null))), + // Signature location + 'sig_loc' => (bool)$identity->getValue('sig_first', $ident), + // Sent mail folder name + 'smf_name' => $identity->getValue('sent_mail_folder', $ident), + // Save in sent mail folder by default? + 'smf_save' => (bool)$identity->saveSentmail($ident), + // Sent mail display name + 'smf_display' => IMP::displayFolder($identity->getValue('sent_mail_folder', $ident)), + // Bcc addresses to add + 'bcc' => Horde_Mime_Address::addrArray2String($identity->getBccAddresses($ident)) + ); + } + + return 'IMP_Compose_Base.identities = ' . Horde_Serialize::serialize($identities, Horde_Serialize::JSON); + } + + } diff --git a/imp/lib/Views/Compose.php b/imp/lib/Views/Compose.php index 91fa395bd..e9eb39187 100644 --- a/imp/lib/Views/Compose.php +++ b/imp/lib/Views/Compose.php @@ -40,26 +40,9 @@ class IMP_Views_Compose $identity = Horde_Prefs_Identity::singleton(array('imp', 'imp')); $selected_identity = $identity->getDefault(); - /* Get user identities. */ - $all_sigs = $identity->getAllSignatures(); - foreach ($all_sigs as $ident => $sig) { - $identities[] = array( - // 0 = Plain text signature - $sig, - // 1 = HTML signature - str_replace(' target="_blank"', '', Horde_Text_Filter::filter($sig, 'text2html', array('parselevel' => Horde_Text_Filter_Text2html::MICRO_LINKURL, 'class' => null, 'callback' => null))), - // 2 = Signature location - (bool)$identity->getValue('sig_first', $ident), - // 3 = Sent mail folder name - $identity->getValue('sent_mail_folder', $ident), - // 4 = Save in sent mail folder by default? - (bool)$identity->saveSentmail($ident), - // 5 = Sent mail display name - IMP::displayFolder($identity->getValue('sent_mail_folder', $ident)), - // 6 = Bcc addresses to add - Horde_Mime_Address::addrArray2String($identity->getBccAddresses($ident)) - ); - } + /* Generate identities list. */ + $imp_ui = new IMP_Ui_Compose(); + $result['js'] = array($imp_ui->identityJs()); $composeCache = null; if (!empty($args['composeCache'])) { @@ -74,10 +57,6 @@ class IMP_Views_Compose } } - $result['js'] = array( - 'DIMP.conf_compose.identities = ' . Horde_Serialize::serialize($identities, Horde_Serialize::JSON) - ); - if (!empty($args['qreply'])) { $result['js'][] = 'DIMP.conf_compose.qreply = 1'; } @@ -87,7 +66,6 @@ class IMP_Views_Compose $compose_html = $GLOBALS['prefs']->getValue('compose_html'); $rte = true; - $imp_ui = new IMP_Ui_Compose(); $imp_ui->initRTE(!$compose_html); } @@ -98,9 +76,10 @@ class IMP_Views_Compose /* Check to make sure the sent-mail folders are created - they * need to exist to show up in drop-down list. */ - foreach ($identities as $val) { - if (!$imp_folder->exists($val[3])) { - $imp_folder->create($val[3], true); + foreach (array_keys($identity->getAllSignatures()) as $ident) { + $val = $identity->getValue('sent_mail_folder', $ident); + if (!$imp_folder->exists($val)) { + $imp_folder->create($val, true); } } diff --git a/imp/message-dimp.php b/imp/message-dimp.php index 06c6b41ab..489884d44 100644 --- a/imp/message-dimp.php +++ b/imp/message-dimp.php @@ -67,14 +67,13 @@ if (!$disable_compose) { ); $compose_result = IMP_Views_Compose::showCompose($compose_args); - /* Init IMP_Ui_Compose:: object. */ - $imp_ui = new IMP_Ui_Compose(); - /* Attach spellchecker & auto completer. */ + $imp_ui = new IMP_Ui_Compose(); $imp_ui->attachAutoCompleter(array('to', 'cc', 'bcc')); $imp_ui->attachSpellChecker(); $js_out = array_merge($js_out, $compose_result['js']); + $scripts[] = array('compose-base.js', 'imp'); $scripts[] = array('compose-dimp.js', 'imp'); $js_onload = $compose_result['jsonload']; diff --git a/imp/templates/javascript_defs.php b/imp/templates/javascript_defs.php index e628a9417..300e1cce7 100644 --- a/imp/templates/javascript_defs.php +++ b/imp/templates/javascript_defs.php @@ -23,8 +23,6 @@ $code = array( 'compose_cancel' => _("Cancelling this message will permanently discard its contents.") . "\n" . _("Are you sure you want to do this?"), 'compose_discard' => _("Doing so will discard this message permanently."), 'compose_recipient' => _("You must specify a recipient."), - 'compose_sigreplace' => _("The signature was successfully replaced."), - 'compose_signotreplace' => _("The signature could not be replaced."), 'compose_nosubject' => _("The message does not have a Subject entered.") . "\n" . _("Send message without a Subject?"), 'compose_file' => _("File"), 'compose_attachment' => _("Attachment"), -- 2.11.0