1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
13:
14: 15: 16: 17: 18: 19: 20: 21: 22:
23: class IMP_Dynamic_Compose_Common
24: {
25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
39: public function compose(IMP_Dynamic_Base $base, array $args = array())
40: {
41: global $injector, $page_output, $prefs, $registry;
42:
43: $page_output->addScriptPackage('Horde_Core_Script_Package_Keynavlist');
44: $page_output->addScriptPackage('IMP_Script_Package_ComposeBase');
45: if ($registry->hasMethod('contacts/search')) {
46: $page_output->addScriptPackage('IMP_Script_Package_Autocomplete');
47: }
48:
49: $page_output->addScriptFile('compose-dimp.js');
50: $page_output->addScriptFile('draghandler.js');
51: $page_output->addScriptFile('editor.js');
52: $page_output->addScriptFile('imp.js');
53:
54: if (!$prefs->isLocked('default_encrypt') &&
55: ($prefs->getValue('use_pgp') || $prefs->getValue('use_smime'))) {
56: $page_output->addScriptPackage('Horde_Core_Script_Package_Dialog');
57: $page_output->addScriptFile('passphrase.js');
58: }
59:
60: $this->_addComposeVars($base);
61:
62: $view = $base->getEmptyView();
63: $view->addHelper('Tag');
64: $view->addHelper('FormTag');
65:
66: $view->compose_enable = IMP_Compose::canCompose();
67:
68: if (!empty($args['redirect'])) {
69: $base->js_conf['redirect'] = 1;
70: return $view->render('redirect');
71: }
72:
73: $view->spellcheck = $injector->getInstance('IMP_Compose_Ui')->attachSpellChecker();
74:
75: $this->_compose($base, $view, $args);
76: return $view->render('compose') . (isset($args['redirect']) ? '' : $view->render('redirect'));
77: }
78:
79: 80:
81: protected function _compose($base, $view, $args)
82: {
83: global $injector, $registry, $page_output, $prefs, $session;
84:
85: $view->title = $args['title'];
86:
87:
88: $identity = $injector->getInstance('IMP_Identity');
89: $selected_identity = intval($identity->getDefault());
90:
91:
92: $injector->getInstance('IMP_Compose_Ui')->addIdentityJs();
93:
94: if ($session->get('imp', 'rteavail')) {
95: $view->compose_html = !empty($args['show_editor']);
96: $view->rte = true;
97:
98: $page_output->addScriptPackage('IMP_Script_Package_Editor');
99: $page_output->addScriptFile('external/base64.js');
100: }
101:
102:
103: $imp_imap = $injector->getInstance('IMP_Factory_Imap')->create();
104: if ($imp_imap->access(IMP_Imap::ACCESS_FOLDERS) &&
105: !$prefs->isLocked('save_sent_mail')) {
106: $view->save_sent_mail = true;
107: $view->save_sent_mail_select = !$prefs->isLocked(IMP_Mailbox::MBOX_SENT);
108: }
109:
110: $view->drafts = ($imp_imap->access(IMP_Imap::ACCESS_DRAFTS) &&
111: ($draft = IMP_Mailbox::getPref(IMP_Mailbox::MBOX_DRAFTS)) &&
112: !$draft->readonly);
113:
114: $view->compose_link = $registry->getServiceLink('ajax', 'imp')->url . 'addAttachment';
115: $view->resume = !empty($args['resume']);
116: $view->is_template = !empty($args['template']);
117: $view->read_receipt_set = (strcasecmp($prefs->getValue('request_mdn'), 'always') === 0);
118: $view->user = $registry->getAuth();
119:
120: if (IMP_Compose::canUploadAttachment()) {
121: $view->attach = true;
122: $view->max_size = $session->get('imp', 'file_upload');
123: $view->save_attach_set = (strcasecmp($prefs->getValue('save_attachments'), 'always') === 0);
124: } else {
125: $view->attach = false;
126: }
127:
128: if ($prefs->getValue('use_pgp') &&
129: $prefs->getValue('pgp_public_key')) {
130: $view->pgp_pubkey = $prefs->getValue('pgp_attach_pubkey');
131: }
132:
133: if ($registry->hasMethod('contacts/ownVCard')) {
134: $view->vcard_attach = true;
135: }
136:
137: $view->priority = $prefs->getValue('set_priority');
138: if (!$prefs->isLocked('default_encrypt') &&
139: ($prefs->getValue('use_pgp') || $prefs->getValue('use_smime'))) {
140: $view->encrypt = $prefs->getValue('default_encrypt');
141: }
142:
143: $from_list = array();
144: foreach ($identity->getSelectList() as $id => $from) {
145: $from_list[] = array(
146: 'label' => $from,
147: 'sel' => ($id == $selected_identity),
148: 'val' => $id
149: );
150: }
151: $view->from_list = $from_list;
152:
153: $view->signature = $identity->hasSignature(true);
154: $view->sigExpanded = $prefs->getValue('signature_expanded');
155: }
156:
157: 158: 159:
160: protected function _addComposeVars($base)
161: {
162: global $browser, $conf, $injector, $prefs, $registry;
163:
164:
165: $base->js_context['ctx_other'] = new stdClass;
166: if (!$prefs->isLocked('request_mdn')) {
167: $base->js_context['ctx_other']->rr = _("Read Receipt");
168: }
169:
170: $base->js_context['ctx_atc'] = new stdClass;
171:
172: if (IMP_Compose::canUploadAttachment()) {
173: if (!$prefs->isLocked('save_attachments') &&
174: (!$prefs->isLocked('save_sent_mail') ||
175: $prefs->getValue('save_sent_mail'))) {
176: $base->js_context['ctx_atc']->save = _("Save Attachments in Sent Mailbox");
177: }
178:
179: $atcfile = new stdClass;
180: $atcfile->delete = _("Delete");
181: $base->js_context['ctx_atcfile'] = $atcfile;
182: }
183:
184: if ($prefs->getValue('use_pgp') &&
185: $prefs->getValue('pgp_public_key')) {
186: $base->js_context['ctx_atc']->pgppubkey = _("Attach Personal PGP Public Key");
187: }
188:
189: if ($registry->hasMethod('contacts/ownVCard')) {
190: $base->js_context['ctx_atc']->vcard = _("Attach contact information");
191: }
192:
193:
194: $compose_cursor = $prefs->getValue('compose_cursor');
195: $templates_mbox = IMP_Mailbox::getPref(IMP_Mailbox::MBOX_TEMPLATES);
196:
197: $base->js_conf += array_filter(array(
198: 'compose_cursor' => ($compose_cursor ? $compose_cursor : 'top'),
199: 'rte_avail' => intval($browser->hasFeature('rte')),
200: 'spellcheck' => intval($prefs->getValue('compose_spellcheck')),
201: 'templates_mbox' => $templates_mbox ? $templates_mbox->form_to : null
202: ));
203:
204: if ($injector->getInstance('IMP_Factory_Imap')->create()->access(IMP_Imap::ACCESS_DRAFTS) &&
205: ($drafts_mbox = IMP_Mailbox::getPref(IMP_Mailbox::MBOX_DRAFTS)) &&
206: !$drafts_mbox->readonly) {
207: $base->js_conf += array_filter(array(
208: 'auto_save_interval_val' => intval($prefs->getValue('auto_save_drafts')),
209: 'close_draft' => intval($prefs->getValue('close_draft')),
210: 'drafts_mbox' => $drafts_mbox->form_to
211: ));
212: }
213:
214: if ($registry->hasMethod('contacts/search')) {
215: $base->js_conf['URI_ABOOK'] = strval(IMP_Basic_Contacts::url()->setRaw(true));
216: $base->js_conf['ac_delete'] = strval(Horde_Themes::img('delete-small.png'));
217: $base->js_conf['ac_minchars'] = intval($conf['compose']['ac_threshold']) ?: 1;
218: }
219:
220: if ($prefs->getValue('set_priority')) {
221: $base->js_conf['priority'] = array(
222: array(
223: 'l' => _("High"),
224: 'v' => 'high'
225: ),
226: array(
227: 'l' => _("Normal"),
228: 's' => true,
229: 'v' => 'normal'
230: ),
231: array(
232: 'l' => _("Low"),
233: 'v' => 'low'
234: )
235: );
236: }
237:
238: if (!$prefs->isLocked('default_encrypt')) {
239: $encrypt = array();
240: foreach ($injector->getInstance('IMP_Compose_Ui')->encryptList(null, true) as $key => $val) {
241: $encrypt[] = array(
242: 'l' => htmlspecialchars($val),
243: 'v' => $key
244: );
245: }
246:
247: if (!empty($encrypt)) {
248: $base->js_conf['encrypt'] = $encrypt;
249: }
250: }
251:
252:
253: $base->js_text += array(
254: 'change_identity' => _("You have edited your signature. Change the identity and lose your changes?"),
255: 'compose_cancel' => _("Cancelling this message will permanently discard its contents and will delete auto-saved drafts.\nAre you sure you want to do this?"),
256: 'compose_close' => _("Compose action completed. You may now safely close this window."),
257: 'dragdropimg_error' => _("Could not add %d file(s) to message: only images are supported."),
258: 'group_expand' => _("Expand Group"),
259: 'max_atc_size' => _("Your attachment(s) are too large and cannot be uploaded."),
260: 'max_atc_num' => _("You have reached the limit for the number of attachments in this message."),
261: 'nosubject' => _("The message does not have a subject entered.") . "\n" . _("Send message without a subject?"),
262: 'paste_error' => _("Could not paste image as the clipboard data is invalid."),
263: 'replyall' => _("%d recipients"),
264: 'spell_noerror' => _("No spelling errors found."),
265: 'toggle_html' => _("Discard all text formatting information (by converting from HTML to plain text)? This conversion cannot be reversed."),
266: 'uploading' => _("Uploading...")
267: );
268: }
269:
270: }
271: