⚝
One Hat Cyber Team
⚝
Your IP:
216.73.216.82
Server IP:
41.128.143.86
Server:
Linux host.raqmix.cloud 6.8.0-1025-azure #30~22.04.1-Ubuntu SMP Wed Mar 12 15:28:20 UTC 2025 x86_64
Server Software:
Apache
PHP Version:
8.3.23
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
usr
/
share
/
psa-horde
/
imp
/
js
/
View File Name :
compose-dimp.js
/** * Dynamic compose view. * * @author Michael Slusarz
* @copyright 2005-2015 Horde LLC * @license GPL-2 (http://www.horde.org/licenses/gpl) */ var DimpCompose = { // Variables defaulting to empty/false: // atc_context, auto_save_interval, compose_cursor, disabled, // drafts_mbox, fwdattach, hash_hdrs, hash_msg, // hash_msgOrig, hash_sig, hash_sigOrig, knl, last_identity, // onload_show, old_action, old_identity, sc_submit, // skip_spellcheck, spellcheck, tasks, upload_limit ajax_atc_id: 0, checkbox_context: $H({ ctx_atc: $H({ pgppubkey: 'pgp_attach_pubkey', save: 'save_attachments_select', vcard: 'vcard_attach' }), ctx_other: $H({ rr: 'request_read_receipt' }) }), knl: {}, getCacheElt: function() { var r = $('redirect'); return (r && r.visible()) ? $('composeCacheRedirect') : $('composeCache'); }, actionParams: function(p) { p.imp_compose = $F(this.getCacheElt()); return p; }, confirmCancel: function(discard) { var base; if (window.confirm(DimpCore.text.compose_cancel)) { if (!DimpCore.conf.qreply && (base = DimpCore.baseAvailable())) { base.focus(); } DimpCore.doAction('cancelCompose', this.actionParams({ discard: ~~(!!discard) })); this.updateDraftsMailbox(); return this.closeCompose(); } }, updateDraftsMailbox: function() { var base; if ((base = DimpCore.baseAvailable()) && base.DimpBase.view == DimpCore.conf.drafts_mbox) { base.DimpBase.poll(); } }, closeCompose: function() { if (DimpCore.conf.qreply) { this.closeQReply(); } else if (HordeCore.baseWindow() != window) { // We are only checking whether window.close can be done, not the // current status of the opening window. window.close(); } else { // Sanity checking: if popup cannot be manually closed, output // information message without allowing further actions on the // page. $$('body')[0].update(DimpCore.text.compose_close); } }, closeQReply: function() { this.hash_hdrs = this.hash_msg = this.hash_msgOrig = this.hash_sig = this.hash_sigOrig = ''; this.upload_limit = false; $('attach_list').hide().childElements().each(this.removeAttachRow.bind(this)); this.getCacheElt().clear(); $('qreply', 'sendcc', 'sendbcc').compact().invoke('hide'); $('noticerow').down('UL.notices').childElements().invoke('hide'); $('msgData', 'togglecc', 'togglebcc').compact().invoke('show'); if (ImpComposeBase.editor_on) { this.toggleHtmlEditor(); } $('compose').reset(); this.setDisabled(false); // Disable auto-save-drafts now. if (this.auto_save_interval) { this.auto_save_interval.stop(); } }, changeIdentity: function() { if (!Object.isUndefined(this.hash_sigOrig) && this.hash_sigOrig != this.sigHash() && !window.confirm(DimpCore.text.change_identity)) { return false; } var identity = ImpComposeBase.identities[$F('identity')]; this.setPopdownLabel( 'sm', identity.sm_name, identity.sm_display, identity.sm_title, { opts: { input: 'save_sent_mail_mbox', label: 'sent_mail_label' } } ); if (identity.bcc) { $('bcc').setValue(($F('bcc') ? $F('bcc') + ', ' : '') + identity.bcc) .fire('AutoComplete:reset'); this.toggleCC('bcc'); } this.setSaveSentMail(identity.sm_save); this.setSignature(ImpComposeBase.editor_on, identity); this.last_identity = $F('identity'); return true; }, setSignature: function(rte, identity) { ImpComposeBase.setSignature(rte, identity); this.setSignatureHash(); }, setSignatureHash: function() { if (ImpComposeBase.rte_sig && ImpComposeBase.rte_sig.busy()) { this.setSignatureHash.bind(this).delay(0.1); } else { this.hash_sigOrig = this.sigHash(); } }, setSaveSentMail: function(set) { var ssm = $('save_sent_mail'); if (ssm) { ssm.setValue(set); } }, createPopdown: function(id, opts) { this.knl[id] = { knl: new KeyNavList(opts.base, { esc: true, list: opts.data, onChoose: this.setPopdownLabel.bind(this, id) }), opts: opts }; $(opts.label).insert({ after: new Element('SPAN', { className: 'iconImg horde-popdown' }).store('popdown_id', id) }); }, setPopdownLabel: function(id, s, l, t, k) { var input; if (!k) { k = this.knl[id]; if (!k) { return; } } input = $(k.opts.input); if (!input) { return; } if (!l) { l = (k.opts.data || []).find(function(f) { return f.v == s; }); if (!l) { return; } l = (id == 'sm') ? (l.f || l.v) : l.l; } input.setValue(s); $(k.opts.label).writeAttribute('title', t).setText(l.truncate(15)).up(1).show(); if (k.knl) { k.knl.setSelected(s); } }, retrySubmit: function(action) { if (this.old_action) { this.uniqueSubmit(this.old_action); delete this.old_action; } }, uniqueSubmit: function(action) { var c = (action == 'redirectMessage') ? $('redirect') : $('compose'), sc = ImpComposeBase.getSpellChecker(); if (sc && sc.isActive()) { sc.resume(); this.skip_spellcheck = true; } if (this.rte && this.rte.busy()) { return this.uniqueSubmit.bind(this, action).delay(0.1); } switch (action) { case 'sendMessage': if (!this.skip_spellcheck && DimpCore.conf.spellcheck && sc && !sc.isActive()) { this.sc_submit = action; sc.spellCheck(); return; } if ($F('subject').empty() && !window.confirm(DimpCore.text.nosubject)) { return; } // Fall-through case 'saveDraft': case 'saveTemplate': // Don't send/save until uploading is completed. if ($('upload_wait') && $('upload_wait').visible()) { (function() { if (this.disabled) { this.uniqueSubmit(action); } }).bind(this).delay(0.25); return; } // Fall-through case 'redirectMessage': $(document).fire('AutoComplete:update'); break; } this.skip_spellcheck = false; if (action == 'addAttachment') { // We need a submit action here because browser security models // won't let us access files on user's filesystem otherwise. HordeCore.submit(c); } else { // Move HTML text to textarea field for submission. if (ImpComposeBase.editor_on) { this.rte.updateElement(); if (ImpComposeBase.rte_sig) { ImpComposeBase.rte_sig.updateElement(); } } DimpCore.doAction( action, ImpComposeBase.sendParams(c.serialize(true), action == 'sendMessage'), { callback: this.uniqueSubmitCallback.bind(this) } ); // Can't disable until we send the message - or else nothing // will get POST'ed. if (action != 'autoSaveDraft') { this.setDisabled(true); } } }, uniqueSubmitCallback: function(d) { var base; if (d.success || d.action == 'addAttachment') { switch (d.action) { case 'autoSaveDraft': case 'saveDraft': this.updateDraftsMailbox(); if (d.action == 'saveDraft') { if (!DimpCore.conf.qreply && (base = DimpCore.baseAvailable())) { HordeCore.notify_handler = base.HordeCore.showNotifications.bind(base.HordeCore); } if (DimpCore.conf.close_draft) { $('attach_list').childElements().invoke('remove'); return this.closeCompose(); } } break; case 'saveTemplate': if ((base = DimpCore.baseAvailable()) && base.DimpBase.view == DimpCore.conf.templates_mbox) { base.DimpBase.poll(); } return this.closeCompose(); case 'sendMessage': if ((base = DimpCore.baseAvailable())) { if (d.draft_delete) { base.DimpBase.poll(); } if (!DimpCore.conf.qreply) { HordeCore.notify_handler = base.HordeCore.showNotifications.bind(base.HordeCore); } } $('attach_list').childElements().invoke('remove'); return this.closeCompose(); case 'redirectMessage': if (!DimpCore.conf.qreply && (base = DimpCore.baseAvailable())) { HordeCore.notify_handler = base.HordeCore.showNotifications.bind(base.HordeCore); } return this.closeCompose(); case 'addAttachment': this.addAttachmentEnd(); break; } } else { if (!Object.isUndefined(d.identity)) { this.old_identity = $F('identity'); $('identity').setValue(d.identity); this.changeIdentity(); $('noticerow', 'identitychecknotice').invoke('show'); this.resizeMsgArea(); } if (!Object.isUndefined(d.encryptjs)) { this.old_action = d.action; eval(d.encryptjs.join(';')); } } this.setDisabled(false); }, setDisabled: function(disable) { var redirect = $('redirect'), sc; this.disabled = disable; if (redirect && redirect.visible()) { HordeCore.loadingImg('sendingImg', 'redirect', disable); DimpCore.toggleButtons(redirect.select('DIV.dimpActions A'), disable); redirect.setStyle({ cursor: disable ? 'wait': null }); } else { HordeCore.loadingImg('sendingImg', 'composeMessageParent', disable); DimpCore.toggleButtons($('compose').select('DIV.dimpActions A'), disable); [ $('compose') ].invoke(disable ? 'disable' : 'enable'); if ((sc = ImpComposeBase.getSpellChecker())) { sc.disable(disable); } if (ImpComposeBase.editor_on) { this.RTELoading(disable, true); } $('compose').setStyle({ cursor: disable ? 'wait' : null }); } }, toggleHtmlEditor: function(noupdate) { var action, changed, sc, tmp, active = ImpComposeBase.editor_on, params = $H(); if (!DimpCore.conf.rte_avail) { return; } noupdate = noupdate || false; if ((sc = ImpComposeBase.getSpellChecker()) && sc.isActive()) { sc.resume(); } this.RTELoading(true); if (this.rte && this.rte.busy()) { return this.toggleHtmlEditor.bind(this, noupdate).delay(0.1); } if (active) { action = 'html2Text', changed = ~~(this.msgHash() != this.hash_msgOrig); params.set('body', { changed: changed, text: this.rte.getData() }); if ($('signature') && (this.sigHash() != this.hash_sigOrig)) { params.set('sig', { changed: 1, text: ImpComposeBase.rte_sig.getData() }); } } else if (!noupdate) { action = 'text2Html'; tmp = $F('composeMessage'); if (!tmp.blank()) { changed = ~~(this.msgHash() != this.hash_msgOrig); params.set('body', { changed: changed, text: tmp }); } if ($('signature')) { tmp = $F('signature'); if (!tmp.blank() && (this.sigHash() != this.hash_sigOrig)) { params.set('sig', { changed: 1, text: tmp }); } } } if (params.size()) { DimpCore.doAction(action, this.actionParams({ data: Object.toJSON(params) }), { ajaxopts: { asynchronous: false }, callback: this.setMessageText.bind(this, { changed: changed, rte: !active }) }); } else { this.rteInit(!active); this.setSignature(!active, ImpComposeBase.identities[$F('identity')]); } }, RTELoading: function(show, notxt) { var o; if (!$('rteloading')) { $(document.body).insert( new Element('DIV', { id: 'rteloading' }).hide() ).insert( new Element('SPAN', { id: 'rteloadingtxt' }).hide().insert(DimpCore.text.loading) ); } if (show) { $('rteloading').clonePosition('composeMessageParent').show(); if (!notxt) { o = $('rteloading').viewportOffset(); $('rteloadingtxt').setStyle({ top: (o.top + 15) + 'px', left: (o.left + 15) + 'px' }).show(); } } else { $('rteloading', 'rteloadingtxt').invoke('hide'); } }, _onSpellCheckAfter: function() { if (ImpComposeBase.editor_on) { this.setBodyText({ body: $F('composeMessage') }); $('composeMessage').next().show(); this.RTELoading(false); } this.sc_submit = false; }, _onSpellCheckBefore: function() { ImpComposeBase.getSpellChecker().htmlAreaParent = ImpComposeBase.editor_on ? 'composeMessageParent' : null; if (ImpComposeBase.editor_on) { this.rte.updateElement(); this.RTELoading(true, true); $('composeMessage').next().hide(); } }, _onSpellCheckError: function() { if (ImpComposeBase.editor_on) { this.RTELoading(false); } }, _onSpellCheckNoError: function() { if (this.sc_submit) { this.skip_spellcheck = true; this.uniqueSubmit(this.sc_submit); } else { HordeCore.notify(DimpCore.text.spell_noerror, 'horde.message'); this._onSpellCheckAfter(); } }, setMessageText: function(opts, r) { var ta = $('composeMessage'); if (!ta) { $('composeMessageParent').insert( new Element('TEXTAREA', { id: 'composeMessage', name: 'message', style: 'width:100%' }) ); } this.rteInit(opts.rte); if (this.rte && opts.rte) { if (this.rte.busy()) { this.setMessageText.bind(this, opts, r).delay(0.1); return; } this.rte.setData(r.text.body); } else { ta.setValue(r.text.body); } this.RTELoading(false); this.setSignature(opts.rte, r.text.sig ? r.text.sig : ImpComposeBase.identities[$F('identity')]); this.resizeMsgArea(); if (!opts.changed) { delete this.hash_msgOrig; } this.fillFormHash(); }, rteInit: function(rte) { var config; if (rte && !this.rte) { config = Object.clone(IMP.ckeditor_config); config.extraPlugins = 'pasteattachment'; this.rte = new IMP_Editor('composeMessage', config); this.rte.editor.on('getData', function(evt) { var elt = new Element('SPAN'), elts; /* Don't use prototype's insert() since we don't want any * scripts that may exist in the text data to be eval'd. */ elt.innerHTML = evt.data.dataValue; elts = elt.select('IMG[dropatc_id]'); if (elts.size()) { elts.invoke('writeAttribute', 'dropatc_id', null); elts.invoke('writeAttribute', 'src', null); evt.data.dataValue = elt.innerHTML; } }); } else if (!rte && this.rte) { this.rte.destroy(); delete this.rte; } ImpComposeBase.editor_on = rte; $('htmlcheckbox').setValue(rte); $('html').setValue(~~rte); }, // ob = addr, body, format, identity, opts, subject, type // ob.opts = auto, focus, fwd_list, noupdate, priority, readreceipt, // reply_lang, reply_recip, reply_list_id, show_editor fillForm: function(ob) { if (!document.loaded || $('dimpLoading').visible()) { this.fillForm.bind(this, ob).delay(0.1); return; } switch (ob.type) { case 'forward_redirect': return; } ob.opts = ob.opts || {}; if (ob.addr) { $('to').setValue(ob.addr.to.join(', ')) .fire('AutoComplete:reset'); if (ob.addr.cc.size()) { this.toggleCC('cc'); $('cc').setValue(ob.addr.cc.join(', ')) .fire('AutoComplete:reset'); } if (ob.addr.bcc.size()) { this.toggleCC('bcc'); $('bcc').setValue(ob.addr.bcc.join(', ')) .fire('AutoComplete:reset'); } } $('identity').setValue(ob.identity); this.changeIdentity(); $('subject').setValue(ob.subject); if (DimpCore.conf.priority && ob.opts.priority) { this.setPopdownLabel('p', ob.opts.priority); } if (ob.opts.readreceipt && $('request_read_receipt')) { $('request_read_receipt').setValue(true); } switch (ob.opts.auto) { case 'forward_attach': $('noticerow', 'fwdattachnotice').invoke('show'); this.fwdattach = true; break; case 'forward_body': $('noticerow', 'fwdbodynotice').invoke('show'); break; case 'reply_all': $('replyallnotice').down('SPAN.replyAllNoticeCount').setText(DimpCore.text.replyall.sub('%d', ob.opts.reply_recip)); $('noticerow', 'replyallnotice').invoke('show'); break; case 'reply_list': $('replylistnotice').down('SPAN.replyListNoticeId').setText(ob.opts.reply_list_id ? (' (' + ob.opts.reply_list_id + ')') : ''); $('noticerow', 'replylistnotice').invoke('show'); break; } if (ob.opts.reply_lang) { $('langnotice').down('SPAN.langNoticeList').setText(ob.opts.reply_lang.join(', ')); $('noticerow', 'langnotice').invoke('show'); } this.setBodyText(ob); this.resizeMsgArea(); ImpComposeBase.focus(ob.opts.focus || 'to'); this.fillFormHash(); }, fillFormHash: function() { if (this.rte && this.rte.busy()) { this.fillFormHash.bind(this).delay(0.1); return; } // This value is used to determine if the text has changed when // swapping compose modes. if (!this.hash_msgOrig) { this.hash_msgOrig = this.msgHash(); } // Set auto-save-drafts now if not already active. Only need if // compose template is output on current page (redirect doesn't // need autosave). if (DimpCore.conf.auto_save_interval_val && !this.auto_save_interval && $('compose')) { this.auto_save_interval = new PeriodicalExecuter( this.autoSaveDraft.bind(this), DimpCore.conf.auto_save_interval_val * 60 ); /* Immediately execute to get hash of headers. */ this.auto_save_interval.execute(); } }, autoSaveDraft: function() { var hdrs, msg, sig; if (!$('compose').visible()) { return; } hdrs = IMP_JS.fnv_1a( [$('to', 'cc', 'bcc', 'subject').compact().invoke('getValue'), $('attach_list').select('SPAN.attachName').pluck('textContent') ].flatten().join('\0') ); if (Object.isUndefined(this.hash_hdrs)) { msg = this.hash_msgOrig; sig = this.hash_sigOrig; } else { msg = this.msgHash(); sig = this.sigHash(); if (this.hash_hdrs != hdrs || this.hash_msg != msg || this.hash_sig != sig) { this.uniqueSubmit('autoSaveDraft'); } } this.hash_hdrs = hdrs; this.hash_msg = msg; this.hash_sig = sig; }, msgHash: function() { return IMP_JS.fnv_1a( ImpComposeBase.editor_on ? this.rte.getData() : $F('composeMessage') ); }, sigHash: function() { return $('signature') ? IMP_JS.fnv_1a(ImpComposeBase.rte_sig ? ImpComposeBase.rte_sig.getData() : $F('signature')) : 0; }, fadeNotice: function(elt) { elt = $(elt); elt.fade({ afterFinish: function() { if (!elt.siblings().any(Element.visible)) { elt.up('TR').hide(); this.resizeMsgArea(); } }.bind(this), duration: 0.4 }); }, setBodyText: function(ob) { if (this.rte) { this.rte.setData(ob.body); } else { $('composeMessage').setValue(ob.body); ImpComposeBase.setCursorPosition('composeMessage', DimpCore.conf.compose_cursor); } if (ob.format == 'html') { if (!ImpComposeBase.editor_on) { this.toggleHtmlEditor(true); } if (ob.opts && ob.opts.focus && (ob.opts.focus == 'composeMessage')) { this.rte.focus(); } } }, swapToAddressCallback: function(r) { if (r.addr) { $('to').setValue(r.addr.to.join(', ')) .fire('AutoComplete:reset'); [ 'cc', 'bcc' ].each(function(t) { if (r.addr[t].size() || $('send' + t).visible()) { if (!$('send' + t).visible()) { this.toggleCC(t); } $(t).setValue(r.addr[t].join(', ')) .fire('AutoComplete:reset'); } }, this); } $('to_loading_img').hide(); }, // opts = (Object) // icon: (string) Data url of icon data // name: (string) Attachment name // num: (integer) Attachment number // size: (string) Size. // type: (string) MIME type // url: (string) Data view URL // view: (boolean) Link to attachment preview page addAttach: function(opts) { var canvas, img, li = new Element('LI') .store('atc_id', opts.num) .store('atc_url', opts.url), span = new Element('SPAN') .addClassName(opts.view ? 'attachName' : 'attachNameNoview') .insert(opts.name.escapeHTML()); if (opts.icon) { canvas = new Element('CANVAS', { height: '16px', width: '16px' }); // IE8 doesn't support canvas if (canvas.getContext) { li.insert(canvas); img = new Image(); img.onload = function() { canvas.getContext('2d').drawImage(img, 0, 0, 16, 16); }; img.src = opts.icon; } } li.insert(span); canvas.writeAttribute('title', opts.type); li.insert( new Element('SPAN') .addClassName('attachSize') .insert('(' + opts.size + ')') ); $('attach_list').insert(li).show(); DimpCore.addPopdown(li.down(':last'), 'atcfile', { no_offset: true }); this.resizeMsgArea(); }, getAttach: function(id) { return $('attach_list').childElements().detect(function(e) { return e.retrieve('atc_id') == id; }); }, removeAttach: function(elt) { DimpCore.doAction('deleteAttach', this.actionParams({ atc_indices: Object.toJSON([ elt.retrieve('atc_id') ]) }), { callback: this.removeAttachCallback.bind(this) }); }, removeAttachCallback: function(r) { r.collect(this.getAttach.bind(this)).compact().each(function(elt) { elt.fade({ afterFinish: function() { this.removeAttachRow(elt); this.initAttachList(); $('upload').value = ''; $('upload').removeAttribute('value'); $('upload').replace($('upload').cloneNode(true)); }.bind(this), duration: 0.4 }); }, this); }, removeAttachRow: function(elt) { DimpCore.DMenu.removeElement(elt.down('.horde-popdown').identify()); elt.remove(); }, initAttachList: function() { var al = $('attach_list'), u = $('upload'); if (this.upload_limit) { $('upload_limit').show(); u.up().hide(); } else { $('upload_limit').hide(); u.up().show(); } if (!al.childElements().size()) { al.hide(); } this.resizeMsgArea(); }, addAttachmentEnd: function() { var u = $('upload_wait'); if (u && u.visible()) { u.hide(); this.initAttachList(); } }, resizeMsgArea: function(e) { if (!document.loaded || $('dimpLoading').visible()) { return; } // IE 7/8 Bug - can't resize TEXTAREA in the resize event (Bug #10075) if (e && Prototype.Browser.IE && !document.addEventListener) { this.resizeMsgArea.bind(this).delay(0.1); return; } var mah, cmp = $('composeMessageParent'), sp = $('signatureParent'), qreply = $('qreply'); if (!cmp || (qreply && !qreply.visible())) { return; } cmp = cmp.getLayout(); try { mah = document.viewport.getHeight() - cmp.get('top') - cmp.get('margin-box-height') + cmp.get('height'); } catch (ex) { return; } if (sp) { mah -= sp.getHeight(); } if (this.rte) { this.rte.resize('99%', mah - 1); } $('composeMessage').setStyle({ height: mah + 'px' }); if ($('rteloading') && $('rteloading').visible()) { this.RTELoading(true); } }, uploadAttachmentWait: function(f) { var t; $('upload').up().hide(); if (Object.isElement(f)) { if (f.files) { f = f.files; } else { t = $F(f).escapeHTML(); f = null; } } if (f) { t = (f.length > 1) ? DimpCore.text.multiple_atc.sub('%d', f.length) : f[0].name.escapeHTML(); } $('upload_wait').update(DimpCore.text.uploading + ' (' + t + ')') .show(); }, uploadAttachmentAjax: function(data, params, callback) { var out = $H(); params = $H(params).update({ composeCache: $F(this.getCacheElt()), json_return: 1 }); HordeCore.addRequestParams(params); this.uploadAttachmentWait(data); $A($R(0, data.length - 1)).each(function(i) { var fd = new FormData(); params.merge({ file_id: ++this.ajax_atc_id, file_upload: data[i] }).each(function(p) { fd.append(p.key, p.value); }); HordeCore.doAction('addAttachment', {}, { ajaxopts: { postBody: fd, requestHeaders: { "Content-type": null } }, callback: function(r) { if (callback) { callback(r); } this.addAttachmentEnd(); }.bind(this) }); out.set(this.ajax_atc_id, data[i]); }, this); return out; }, toggleCC: function(type) { var t = $('toggle' + type), s = t.siblings().first(); $('send' + type).show(); if (s && s.visible()) { t.hide(); } else { t.up('TR').hide(); } this.resizeMsgArea(); ImpComposeBase.focus(type); }, sentMailListCallback: function(r) { $('save_sent_mail_load').remove(); this.createPopdown('sm', { base: 'save_sent_mail', data: r.flist, input: 'save_sent_mail_mbox', label: 'sent_mail_label' }); this.knl.sm.knl.setSelected($F('save_sent_mail_mbox')); this.knl.sm.knl.show(); }, /* Open the addressbook window. */ openAddressbook: function(params) { var uri = DimpCore.conf.URI_ABOOK; if (params) { uri = HordeCore.addURLParam(uri, params); } window.open(uri, 'contacts', 'toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes,width=800,height=350,left=100,top=100'); }, /* Click observe handler. */ clickHandler: function(e) { var elt = e.memo.element(), tmp; /* Needed because reply/forward buttons need to be of type="submit" * for FF to correctly size. */ if ((elt.readAttribute('type') == 'submit') && (elt.descendantOf('compose') || elt.descendantOf('redirect'))) { e.memo.hordecore_stop = true; return; } switch (e.element().readAttribute('id')) { case 'togglebcc': this.toggleCC('bcc'); this.resizeMsgArea(); break; case 'togglecc': this.toggleCC('cc'); this.resizeMsgArea(); break; case 'signatureToggle': if ($('signatureBorder').visible()) { $('signatureToggle').removeClassName('signatureExpanded'); $('signatureBorder').hide(); HordeCore.doAction('setPrefValue', { pref: 'signature_expanded', value: 0 }); } else { $('signatureToggle').addClassName('signatureExpanded'); $('signatureBorder').show(); HordeCore.doAction('setPrefValue', { pref: 'signature_expanded', value: 1 }); } this.resizeMsgArea(); break; case 'compose_close': case 'redirect_close': this.confirmCancel(); break; case 'discard_button': this.confirmCancel(true); break; case 'draft_button': if (!this.disabled) { this.uniqueSubmit('saveDraft'); } break; case 'template_button': if (!this.disabled) { this.uniqueSubmit('saveTemplate'); } break; case 'send_button': if (!this.disabled) { this.uniqueSubmit('sendMessage'); } break; case 'send_button_redirect': if (!this.disabled) { this.uniqueSubmit('redirectMessage'); } break; case 'htmlcheckbox': e.memo.stop(); break; case 'redirect_sendto': if (elt.match('TD.label SPAN')) { this.openAddressbook({ to_only: 1 }); } break; case 'sendcc': case 'sendbcc': case 'sendto': if (DimpCore.conf.URI_ABOOK && elt.match('TD.label SPAN')) { this.openAddressbook(); } break; case 'attach_list': if (elt.match('SPAN.attachName')) { HordeCore.popupWindow(elt.up('LI').retrieve('atc_url')); } break; case 'save_sent_mail': this.setSaveSentMail($F(e.element())); break; case 'compose_upload_add': // This is no longer needed as of Firefox 22. if (Prototype.Browser.Gecko && Object.isUndefined(Object.is)) { $('upload').click(); } break; case 'fwdattachnotice': this.fadeNotice(e.element()); DimpCore.doAction('getForwardData', this.actionParams({ dataonly: 1, type: 'forward_body' }), { callback: this.setBodyText.bind(this) }); this.fwdattach = false; e.memo.stop(); break; case 'fwdbodynotice': this.fadeNotice(e.element()); DimpCore.doAction('getForwardData', this.actionParams({ dataonly: 1, type: 'forward_attach' })); this.fwdattach = false; e.memo.stop(); break; case 'identitychecknotice': this.fadeNotice(e.element()); $('identity').setValue(this.old_identity); this.changeIdentity(); e.memo.stop(); break; case 'replyall_revert': case 'replylist_revert': this.fadeNotice(e.element().up('LI')); $('to_loading_img').show(); DimpCore.doAction('getReplyData', this.actionParams({ headeronly: 1, type: 'reply' }), { callback: this.swapToAddressCallback.bind(this) }); e.memo.stop(); break; case 'writemsg': if (!this.disabled && elt.hasClassName('horde-popdown')) { tmp = elt.retrieve('popdown_id'); if (tmp && this.knl[tmp]) { this.knl[tmp].knl.show(); this.knl[tmp].knl.ignoreClick(e.memo); e.memo.stop(); } } break; case 'save_sent_mail_load': DimpCore.doAction('sentMailList', {}, { callback: this.sentMailListCallback.bind(this) }); break; } }, keydownHandler: function(e, fade) { switch (e.keyCode || e.charCode) { case Event.KEY_ESC: this.confirmCancel(); break; case Event.KEY_RETURN: if (!this.disabled && e.ctrlKey) { this.uniqueSubmit('sendMessage'); } break; } if (this.fwdattach && (fade || e.element() == $('composeMessage'))) { this.fadeNotice('fwdattachnotice'); } }, changeHandler: function(e) { switch (e.element().readAttribute('id')) { case 'identity': if (!this.changeIdentity()) { $('identity').setValue(this.last_identity); } break; case 'upload': this.uniqueSubmit('addAttachment'); this.uploadAttachmentWait($('upload')); break; } }, contextOnClick: function(e) { var id = e.memo.elt.identify(); switch (id) { case 'ctx_atcfile_delete': this.removeAttach(this.atc_context); break; default: this.checkbox_context.each(function(pair) { if (id.startsWith(pair.key + '_')) { var t = pair.value.get(id.substring(pair.key.length + 1)); if (t) { $(t).setValue(~~(!(~~$F(t)))); } } }); break; } }, contextOnShow: function(e) { var tmp = this.checkbox_context.get(e.memo); if (tmp) { tmp.each(function(pair) { var t = $(e.memo + '_' + pair.key); if (t) { DimpCore.toggleCheck(t.down('SPAN'), ~~$F(pair.value)); } }); } if (e.element().up('#attach_list')) { this.atc_context = e.element().up('LI'); } else { delete this.atc_context; } }, onContactsUpdate: function(e) { switch (e.memo.field) { case 'bcc': case 'cc': if (!$('send' + e.memo.field).visible()) { this.toggleCC(e.memo.field); } break; case 'to': if (DimpCore.conf.redirect) { e.memo.field = 'redirect_to'; } break; } ImpComposeBase.updateAddressField(e); }, tasksHandler: function(e) { var base = DimpCore.baseAvailable(), t = e.tasks || {}; if (t['imp:compose']) { this.getCacheElt().setValue(t['imp:compose'].cacheid); if ($('composeCache')) { $('composeHmac').setValue(t['imp:compose'].hmac); } this.upload_limit = t['imp:compose'].atclimit; } if (t['imp:compose-atc']) { t['imp:compose-atc'].each(this.addAttach.bind(this)); } if (base) { if (t['imp:flag']) { base.DimpBase.flagCallback(t['imp:flag']); } if (t['imp:mailbox']) { base.DimpBase.mailboxCallback(t['imp:mailbox']); } if (t['imp:maillog']) { base.DimpBase.maillogCallback(t['imp:maillog']); } } }, onDomLoad: function() { var tmp; /* Initialize redirect elements. */ if (DimpCore.conf.redirect) { $('redirect').observe('submit', Event.stop); if (DimpCore.conf.URI_ABOOK) { $('redirect_sendto').down('TD.label SPAN').addClassName('composeAddrbook'); } $('dimpLoading').hide(); $('composeContainer', 'redirect').invoke('show'); this.tasksHandler({ tasks: this.tasks }); if (this.onload_show) { this.fillForm(this.onload_show); delete this.onload_show; } ImpComposeBase.focus('redirect_to'); return; } /* Attach event handlers. */ if (Prototype.Browser.IE) { // IE doesn't bubble change events. $('identity', 'upload').compact().invoke( 'observe', 'change', this.changeHandler.bindAsEventListener(this) ); } else { document.observe('change', this.changeHandler.bindAsEventListener(this)); } $('compose').observe('submit', Event.stop); $('htmlcheckbox').up('LABEL').observe('mouseup', function() { if (!ImpComposeBase.editor_on || window.confirm(DimpCore.text.toggle_html)) { this.toggleHtmlEditor(); } }.bind(this)); HordeCore.initHandler('click'); HordeCore.handleSubmit($('compose'), { callback: this.uniqueSubmitCallback.bind(this) }); if ((tmp = $('atcdrop'))) { tmp.observe('DragHandler:drop', function(e) { this.uploadAttachmentAjax(e.memo); }.bindAsEventListener(this)); DragHandler.dropelt = tmp; DragHandler.droptarget = $('atcdiv'); DragHandler.hoverclass = 'atcdrop_over'; DimpCore.addPopdown($('upload'), 'atc', { no_offset: true }); } if ($H(DimpCore.context.ctx_other).size()) { DimpCore.addPopdown($('other_options').down('A'), 'other', { trigger: true }); } else { $('other_options').hide(); } /* Create sent-mail list. */ if ($('save_sent_mail_mbox')) { this.changeIdentity(); } /* Create priority list. */ if (DimpCore.conf.priority) { this.createPopdown('p', { base: 'priority_label', data: DimpCore.conf.priority, input: 'priority', label: 'priority_label' }); this.setPopdownLabel('p', $F('priority')); } /* Create encryption list. */ if (DimpCore.conf.encrypt) { this.createPopdown('e', { base: $('encrypt_label').up(), data: DimpCore.conf.encrypt, input: 'encrypt', label: 'encrypt_label' }); this.setPopdownLabel('e', $F('encrypt')); } /* Add addressbook link formatting. */ if (DimpCore.conf.URI_ABOOK) { $('sendto', 'sendcc', 'sendbcc', 'redirect_sendto').compact().each(function(a) { a.down('TD.label SPAN').addClassName('composeAddrbook'); }); } $('dimpLoading').hide(); $('composeContainer', 'compose').compact().invoke('show'); this.tasksHandler({ tasks: this.tasks }); if (this.onload_show) { this.fillForm(this.onload_show); delete this.onload_show; } else { this.resizeMsgArea(); } }, onAjaxFailure: function(e) { switch (e.memo[0].request.action) { case 'redirectMessage': case 'saveDraft': case 'saveTemplate': case 'sendMessage': if (this.disabled) { this.setDisabled(false); } break; } this.addAttachmentEnd(); this.RTELoading(false); } }; /* Attach event handlers. */ document.observe('dom:loaded', DimpCompose.onDomLoad.bind(DimpCompose)); document.observe('HordeCore:click', DimpCompose.clickHandler.bindAsEventListener(DimpCompose)); document.observe('keydown', DimpCompose.keydownHandler.bindAsEventListener(DimpCompose)); Event.observe(window, 'resize', DimpCompose.resizeMsgArea.bindAsEventListener(DimpCompose)); /* Other UI event handlers. */ document.observe('AutoComplete:resize', DimpCompose.resizeMsgArea.bind(DimpCompose)); document.observe('ImpContacts:update', DimpCompose.onContactsUpdate.bindAsEventListener(DimpCompose)); /* ContextSensitive functions. */ document.observe('ContextSensitive:click', DimpCompose.contextOnClick.bindAsEventListener(DimpCompose)); document.observe('ContextSensitive:show', DimpCompose.contextOnShow.bindAsEventListener(DimpCompose)); /* Initialize spellchecker. */ document.observe('SpellChecker:after', DimpCompose._onSpellCheckAfter.bind(DimpCompose)); document.observe('SpellChecker:before', DimpCompose._onSpellCheckBefore.bind(DimpCompose)); document.observe('SpellChecker:error', DimpCompose._onSpellCheckError.bind(DimpCompose)); document.observe('SpellChecker:noerror', DimpCompose._onSpellCheckNoError.bind(DimpCompose)); /* Catch dialog actions. */ document.observe('ImpPassphraseDialog:success', DimpCompose.retrySubmit.bind(DimpCompose)); /* Catch tasks. */ document.observe('HordeCore:runTasks', function(e) { DimpCompose.tasksHandler(e.memo); }); /* AJAX related events. */ document.observe('HordeCore:ajaxFailure', DimpCompose.onAjaxFailure.bindAsEventListener(DimpCompose)); /* IMP Editor events. */ document.observe('IMP_Editor:ready', function(e) { if (e.memo.name == 'composeMessage') { new CKEDITOR.dom.document( e.memo.getThemeSpace('contents').$.down('IFRAME').contentWindow.document) .on('keydown', function(evt) { this.keydownHandler(Event.extend(evt.data.$), true); }.bind(this)); } }.bindAsEventListener(DimpCompose)); document.observe('IMP_Editor:dataReady', function(e) { if (e.memo.name == 'composeMessage') { this.RTELoading(false); this.resizeMsgArea(); } }.bindAsEventListener(DimpCompose));