1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
13:
14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
25: class IMP_Basic_Folders extends IMP_Basic_Base
26: {
27: 28:
29: protected function _init()
30: {
31: global $injector, $notification, $page_output, $prefs, $registry, $session;
32:
33:
34: $imp_imap = $injector->getInstance('IMP_Factory_Imap')->create();
35: if (!$imp_imap->access(IMP_Imap::ACCESS_FOLDERS)) {
36: $notification->push(_("The folder view is not enabled."), 'horde.error');
37: Horde::url('mailbox', true)->redirect();
38: }
39:
40:
41: $subscribe = $prefs->getValue('subscribe');
42: $showAll = (!$subscribe || $session->get('imp', 'showunsub'));
43:
44: $page_output->addScriptFile('hordecore.js', 'horde');
45: $page_output->addScriptFile('folders.js');
46:
47:
48: $folders_url = self::url()->setRaw(true);
49:
50:
51: $page_output->addInlineJsVars(array(
52: 'ImpFolders.folders_url' => strval($folders_url),
53: 'ImpFolders.text' => array(
54: 'download1' => _("All messages in the following mailbox(es) will be downloaded into one MBOX file:"),
55: 'download2' => _("This may take some time. Are you sure you want to continue?"),
56: 'oneselect' => _("Only one mailbox should be selected for this action."),
57: 'rename1' => _("You are renaming the mailbox:"),
58: 'rename2' => _("Please enter the new name:"),
59: 'select' => _("Please select a mailbox before you perform this action."),
60: 'subfolder1' => _("You are creating a subfolder to"),
61: 'subfolder2' => _("Please enter the name of the new mailbox:"),
62: 'toplevel' => _("You are creating a top-level mailbox.") . "\n" . _("Please enter the name of the new mailbox:")
63: )
64: ));
65:
66:
67: $ftree = $injector->getInstance('IMP_Ftree');
68:
69:
70: $mbox_list = isset($this->vars->mbox_list)
71: ? IMP_Mailbox::formFrom($this->vars->mbox_list)
72: : array();
73:
74:
75: $refresh_time = $prefs->getValue('refresh_time');
76:
77:
78: $view = new Horde_View(array(
79: 'templatePath' => IMP_TEMPLATES . '/basic/folders'
80: ));
81: $view->addHelper('FormTag');
82: $view->addHelper('Tag');
83:
84: $token = $session->getToken();
85: $view->token = $token;
86:
87:
88: if ($this->vars->actionID) {
89: try {
90: $session->checkToken($this->vars->token);
91: } catch (Horde_Exception $e) {
92: $notification->push($e);
93: $this->vars->actionID = null;
94: }
95: }
96:
97: switch ($this->vars->actionID) {
98: case 'expand_all_folders':
99: $ftree->expandAll();
100: break;
101:
102: case 'collapse_all_folders':
103: $ftree->collapseAll();
104: break;
105:
106: case 'rebuild_tree':
107: $ftree->init();
108: break;
109:
110: case 'expunge_mbox':
111: if (!empty($mbox_list)) {
112: $injector->getInstance('IMP_Message')->expungeMailbox(array_fill_keys($mbox_list, null));
113: }
114: break;
115:
116: case 'delete_mbox':
117: foreach ($mbox_list as $val) {
118: $val->delete();
119: }
120: break;
121:
122: case 'download_mbox':
123: case 'download_mbox_zip':
124: IMP_Contents_View::downloadUrl('mbox', array(
125: 'actionID' => 'download_mbox',
126: 'mbox_list' => $this->vars->mbox_list,
127: 'type' => ($this->vars->actionID == 'download_mbox') ? 'mbox' : 'mboxzip'
128: ))->redirect();
129: exit;
130:
131: case 'import_mbox':
132: if ($this->vars->import_mbox) {
133: try {
134: $notification->push($injector->getInstance('IMP_Mbox_Import')->import($this->vars->import_mbox, 'mbox_upload'), 'horde.success');
135: } catch (Horde_Exception $e) {
136: $notification->push($e);
137: }
138: $this->vars->actionID = null;
139: } else {
140: $refresh_time = null;
141: }
142: break;
143:
144: case 'create_mbox':
145: if (isset($this->vars->new_mailbox)) {
146: try {
147: $parent = empty($mbox_list)
148: ? IMP_Mailbox::get(IMP_Ftree::BASE_ELT)
149: : $mbox_list[0];
150: $new_mbox = $parent->createMailboxName($this->vars->new_mailbox);
151: if ($new_mbox->exists) {
152: $notification->push(sprintf(_("Mailbox \"%s\" already exists."), $new_mbox->display), 'horde.warning');
153: } else {
154: $new_mbox->create();
155: }
156: } catch (Horde_Exception $e) {
157: $notification->push($e);
158: }
159: }
160: break;
161:
162: case 'rename_mbox':
163:
164: $old_names = array_map('trim', explode("\n", $this->vars->old_names));
165: $new_names = array_map('trim', explode("\n", $this->vars->new_names));
166:
167: $iMax = count($new_names);
168: if (!empty($new_names) &&
169: !empty($old_names) &&
170: ($iMax == count($old_names))) {
171: for ($i = 0; $i < $iMax; ++$i) {
172: $old_name = IMP_Mailbox::formFrom($old_names[$i]);
173: $old_ns = $old_name->namespace_info;
174: $new = trim($new_names[$i], $old_ns->delimiter);
175:
176: 177: 178:
179: if (($old_ns->type === $old_ns::NS_PERSONAL) ||
180: (strlen($old_ns->name) &&
181: (stripos($new_names[$i], $old_ns->name) !== 0))) {
182: $new = $old_ns->name . $new;
183: }
184:
185: $old_name->rename($new);
186: }
187: }
188: break;
189:
190: case 'subscribe_mbox':
191: case 'unsubscribe_mbox':
192: if (empty($mbox_list)) {
193: $notification->push(_("No mailboxes were specified"), 'horde.message');
194: } else {
195: foreach ($mbox_list as $val) {
196: $val->subscribe($this->vars->actionID == 'subscribe_mbox');
197: }
198: }
199: break;
200:
201: case 'toggle_subscribed_view':
202: if ($subscribe) {
203: $showAll = !$showAll;
204: $session->set('imp', 'showunsub', $showAll);
205: }
206: break;
207:
208: case 'poll_mbox':
209: if (!empty($mbox_list)) {
210: $ftree->poll->addPollList($mbox_list);
211: }
212: break;
213:
214: case 'nopoll_mbox':
215: if (!empty($mbox_list)) {
216: $ftree->poll->removePollList($mbox_list);
217: }
218: break;
219:
220: case 'empty_mbox':
221: if (!empty($mbox_list)) {
222: $injector->getInstance('IMP_Message')->emptyMailbox($mbox_list);
223: }
224: break;
225:
226: case 'mark_mbox_seen':
227: case 'mark_mbox_unseen':
228: if (!empty($mbox_list)) {
229: $injector->getInstance('IMP_Message')->flagAllInMailbox(array('\\seen'), $mbox_list, ($this->vars->actionID == 'mark_mbox_seen'));
230: }
231: break;
232:
233: case 'delete_mbox_confirm':
234: case 'empty_mbox_confirm':
235: if (!empty($mbox_list)) {
236: $loop = array();
237: foreach ($mbox_list as $val) {
238: switch ($this->vars->actionID) {
239: case 'delete_mbox_confirm':
240: if (!$val->access_deletembox) {
241: $notification->push(sprintf(_("The mailbox \"%s\" may not be deleted."), $val->display), 'horde.error');
242: continue 2;
243: }
244: break;
245:
246: case 'empty_mbox_confirm':
247: if (!$val->access_empty) {
248: $notification->push(sprintf(_("The mailbox \"%s\" may not be emptied."), $val->display), 'horde.error');
249: continue 2;
250: }
251: break;
252: }
253:
254: try {
255: $elt_info = $imp_imap->status($val, Horde_Imap_Client::STATUS_MESSAGES);
256: } catch (IMP_Imap_Exception $e) {
257: $elt_info = null;
258: }
259:
260: $data = array(
261: 'name' => $val->display,
262: 'msgs' => $elt_info ? $elt_info['messages'] : 0,
263: 'val' => $val->form_to
264: );
265: $loop[] = $data;
266: }
267:
268: if (!count($loop)) {
269: break;
270: }
271:
272: $page_output->addScriptFile('stripe.js', 'horde');
273:
274: $this->title = _("Folder Actions - Confirmation");
275:
276: $v = clone $view;
277:
278: if ($this->vars->actionID == 'delete_mbox_confirm') {
279: $v->actionID = 'delete_mbox';
280: $v->delete = true;
281: } elseif ($this->vars->actionID == 'empty_mbox_confirm') {
282: $v->actionID = 'empty_mbox';
283: $v->empty = true;
284: }
285: $v->mboxes = $loop;
286: $v->folders_url = $folders_url;
287:
288: $this->output = $v->render('folders_confirm');
289: return;
290: }
291: break;
292:
293: case 'mbox_size':
294: if (!empty($mbox_list)) {
295: $loop = array();
296: $sum = 0;
297:
298: foreach ($mbox_list as $val) {
299: $size = $val->size;
300: $data = array(
301: 'name' => $val->display,
302: 'size' => sprintf(_("%.2fMB"), $size / (1024 * 1024)),
303: 'sort' => $size
304: );
305: $sum += $size;
306: $loop[] = $data;
307: }
308:
309:
310: $injector->getInstance('Horde_View_Topbar')->subinfo =
311: $injector->getInstance('IMP_View_Subinfo')->render();
312:
313: $v = clone $view;
314:
315: $v->folders_url = $folders_url;
316: $v->mboxes = $loop;
317: $v->mboxes_sum = sprintf(_("%.2fMB"), $sum / (1024 * 1024));
318:
319: $page_output->addScriptFile('stripe.js', 'horde');
320: $page_output->addScriptFile('tables.js', 'horde');
321:
322: $this->title = _("Mailbox Sizes");
323: $this->output = $v->render('folders_size');
324: return;
325: }
326: break;
327:
328: case 'search':
329: if (!empty($mbox_list)) {
330: IMP_Basic_Search::url()->add(array(
331: 'mailbox_list' => IMP_Mailbox::formTo($mbox_list),
332: 'subfolder' => 1
333: ))->redirect();
334: }
335: break;
336: }
337:
338: $this->title = _("Folder Navigator");
339:
340: $folders_url->add('token', $token);
341:
342:
343: $injector->getInstance('Horde_View_Topbar')->subinfo =
344: $injector->getInstance('IMP_View_Subinfo')->render();
345:
346: if ($session->get('imp', 'file_upload') &&
347: ($this->vars->actionID == 'import_mbox')) {
348:
349: $v = clone $view;
350:
351: $v->folders_url = $folders_url;
352: $v->import_mbox = $mbox_list[0];
353:
354: $this->output = $v->render('import');
355: return;
356: }
357:
358:
359: $head_view = clone $view;
360: $head_view->folders_url = $folders_url;
361:
362:
363: $actions = clone $view;
364: $actions->addHelper('Horde_Core_View_Helper_Accesskey');
365: $actions->addHelper('Horde_Core_View_Helper_Help');
366:
367: $actions->id = 0;
368:
369: $actions->refresh = Horde::widget(array(
370: 'title' => _("_Refresh"),
371: 'url' => $folders_url->copy()
372: ));
373: $actions->create_mbox = ($imp_imap->access(IMP_Imap::ACCESS_CREATEMBOX) && $imp_imap->access(IMP_Imap::ACCESS_CREATEMBOX_MAX));
374: if ($prefs->getValue('subscribe')) {
375: $actions->subscribe = true;
376: $subToggleText = $showAll
377: ? _("Hide Unsubscribed")
378: : _("Show All");
379: $actions->toggle_subscribe = Horde::widget(array(
380: 'url' => $folders_url->copy()->add(array(
381: 'actionID' => 'toggle_subscribed_view',
382: 'token' => $token
383: )),
384: 'title' => $subToggleText,
385: 'nocheck' => true
386: ));
387: }
388: $actions->nav_poll = (!$prefs->isLocked('nav_poll') && !$prefs->getValue('nav_poll_all'));
389: $actions->notrash = !$prefs->getValue('use_trash');
390: $actions->file_upload = $session->get('imp', 'file_upload');
391: $actions->expand_all = Horde::widget(array(
392: 'url' => $folders_url->copy()->add(array(
393: 'actionID' => 'expand_all_folders',
394: 'token' => $token
395: )),
396: 'title' => _("Expand All"),
397: 'nocheck' => true
398: ));
399: $actions->collapse_all = Horde::widget(array(
400: 'url' => $folders_url->copy()->add(array(
401: 'actionID' => 'collapse_all_folders',
402: 'token' => $token
403: )),
404: 'title' => _("Collapse All"),
405: 'nocheck' => true
406: ));
407:
408:
409: $iterator = new IMP_Ftree_IteratorFilter($ftree);
410: $iterator->add(array($iterator::REMOTE, $iterator::VFOLDER));
411: if ($showAll) {
412: $ftree->loadUnsubscribed();
413: $iterator->remove($iterator::UNSUB);
414: }
415: $tree = $ftree->createTree('imp_folders', array(
416: 'checkbox' => true,
417: 'editvfolder' => true,
418: 'iterator' => $iterator,
419: 'poll_info' => true
420: ));
421:
422: $displayNames = $fullNames = array();
423:
424: foreach ($ftree as $val) {
425: $mbox_ob = $val->mbox_ob;
426: $tmp = $displayNames[] = $mbox_ob->display;
427:
428: $tmp2 = $mbox_ob->display_notranslate;
429: if ($tmp != $tmp2) {
430: $fullNames[strval($val)] = $tmp2;
431: }
432: }
433:
434: $page_output->addInlineJsVars(array(
435: 'ImpFolders.ajax' => $registry->getServiceLink('ajax', 'imp')->url,
436: 'ImpFolders.displayNames' => $displayNames,
437: 'ImpFolders.fullNames' => $fullNames,
438: '-ImpFolders.mbox_expand' => intval($prefs->getValue('nav_expanded') == 2)
439: ));
440:
441: $page_output->metaRefresh($refresh_time, $this->url());
442:
443: Horde::startBuffer();
444: $tree->renderTree();
445: $this->output = $head_view->render('head') .
446: $actions->render('actions') .
447: Horde::endBuffer();
448:
449: if (count($tree) > 10) {
450: $actions->id = 1;
451: $this->output .= $actions->render('actions');
452: }
453:
454:
455: $this->output .= '</form>';
456: }
457:
458: 459:
460: public static function url(array $opts = array())
461: {
462: return Horde::url('basic.php')->add('page', 'folders');
463: }
464:
465: }
466: