8 * Subfolder search idea from Patch #806075 by Thomas Pohl xraven at users.sourceforge.net. Thanks Thomas!
10 * @author Alex Lemaresquier - Brainstorm <alex at brainstorm.fr>
11 * @copyright © 1999-2006 The SquirrelMail Project Team
12 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
14 * @package squirrelmail
16 * @link http://www.ietf.org/rfc/rfc3501.txt
17 * @todo explain why references are used in function calls
21 * Include the SquirrelMail initialization file.
23 require('../include/init.php');
25 /** SquirrelMail required files.
27 require_once(SM_PATH
. 'functions/imap_asearch.php');
28 require_once(SM_PATH
. 'functions/imap_messages.php');
29 require_once(SM_PATH
. 'functions/imap_general.php');
30 require_once(SM_PATH
. 'functions/mime.php');
31 require_once(SM_PATH
. 'functions/mailbox_display.php'); //getButton()
32 require_once(SM_PATH
. 'functions/forms.php');
33 require_once(SM_PATH
. 'functions/date.php');
35 /** Prefs array ordinals. Must match $recent_prefkeys and $saved_prefkeys
37 define('ASEARCH_WHERE', 0);
38 define('ASEARCH_MAILBOX', 1);
39 define('ASEARCH_WHAT', 2);
40 define('ASEARCH_UNOP', 3);
41 define('ASEARCH_BIOP', 4);
42 define('ASEARCH_EXCLUDE', 5);
43 define('ASEARCH_SUB', 6);
44 define('ASEARCH_MAX', 7);
46 /** Name of session var
48 define('ASEARCH_CRITERIA', 'criteria');
52 * Array sort callback used to sort $imap_asearch_options
55 * @return bool strcoll()-like result
59 function asearch_unhtml_strcoll($a, $b)
61 // FIXME: Translation policy says "no html entities in translations"
62 return strcoll(asearch_unhtmlentities($a), asearch_unhtmlentities($b));
66 * @param string $mailbox mailbox name or special case 'All Folders'
67 * @return string mailbox name ready to display (utf7 decoded or localized 'All Folders')
71 function asearch_get_mailbox_display($mailbox)
73 if ($mailbox == 'All Folders') {
74 return _("All Folders");
75 } elseif (strtoupper($mailbox) == 'INBOX') {
78 return imap_utf7_decode_local($mailbox);
82 * @param array $input_array array to serialize
83 * @return string a string containing a byte-stream representation of value that can be stored anywhere
87 function asearch_serialize(&$input_array)
89 global $search_advanced;
91 return serialize($input_array);
92 return $input_array[0];
96 * @param string $input_string string to unserialize
101 function asearch_unserialize($input_string)
103 global $search_advanced;
104 if ($search_advanced)
105 return unserialize($input_string);
106 return array($input_string);
110 * Gets user's advanced search preferences
112 * Arguments are different in 1.5.0.
113 * @param string $key the pref key
114 * @param integer $index the pref key index
115 * @param string $default default value
116 * @return string pref value
120 function asearch_getPref(&$key, $index, $default = '')
122 global $data_dir, $username, $search_advanced;
123 return getPref($data_dir, $username, $key . ($index +
!$search_advanced), $default);
127 * Sets user's advanced search preferences
129 * Arguments are different in 1.5.0.
130 * @param string $key the pref key
131 * @param integer $index the pref key index
132 * @param string $value pref value to set
133 * @return bool status
137 function asearch_setPref(&$key, $index, $value)
139 global $data_dir, $username, $search_advanced;
140 return setPref($data_dir, $username, $key . ($index +
!$search_advanced), $value);
144 * Deletes user's advanced search preferences
146 * Arguments are different in 1.5.0.
147 * @param string $key the pref key
148 * @param integer $index the pref key index
149 * @return bool status
153 function asearch_removePref(&$key, $index)
155 global $data_dir, $username, $search_advanced;
156 return removePref($data_dir, $username, $key . ($index +
!$search_advanced));
160 * Sanity checks, done before running the imap command and before calling push_recent
161 * @param array $where_array search location data
162 * @param array $what_array search criteria data
163 * @param array $exclude_array excluded criteria data
164 * @return string error message or empty string
168 function asearch_check_query(&$where_array, &$what_array, &$exclude_array)
170 global $imap_asearch_opcodes;
172 if (empty($where_array))
173 return _("Please enter something to search for");
174 if (count($exclude_array) == count($where_array))
175 return _("There must be at least one criteria to search for");
176 for ($crit_num = 0; $crit_num < count($where_array); $crit_num++
) {
177 $where = $where_array[$crit_num];
178 $what = $what_array[$crit_num];
179 if (!(($what == '') ^
($imap_asearch_opcodes[$where] != '')))
180 return _("Error in criteria argument");
186 * Read the recent searches from the prefs
188 * Function arguments are different in 1.5.0
189 * @return array recent searches
193 function asearch_read_recent()
195 global $recent_prefkeys, $search_memory;
197 $recent_array = array();
199 for ($pref_num = 0; $pref_num < $search_memory; $pref_num++
) {
200 foreach ($recent_prefkeys as $prefkey) {
201 $pref = asearch_getPref($prefkey, $pref_num);
202 /* if (!empty($pref))*/
203 $recent_array[$prefkey][$recent_num] = $pref;
205 if (empty($recent_array[$recent_prefkeys[0]][$recent_num])) {
206 foreach ($recent_prefkeys as $key) {
207 array_pop($recent_array[$key]);
209 // break; //Disabled to support old search code broken prefs
214 return $recent_array;
218 * Read the saved searches from the prefs
220 * Function arguments are different in 1.5.0
221 * @return array saved searches
225 function asearch_read_saved()
227 global $saved_prefkeys;
229 $saved_array = array();
230 $saved_key = $saved_prefkeys[0];
231 for ($saved_count = 0; ; $saved_count++
) {
232 $pref = asearch_getPref($saved_key, $saved_count);
236 for ($saved_num = 0; $saved_num < $saved_count; $saved_num++
) {
237 foreach ($saved_prefkeys as $key) {
238 $saved_array[$key][$saved_num] = asearch_getPref($key, $saved_num);
245 * Save a recent search to the prefs
247 * Function arguments are different in 1.5.0
248 * @param integer $recent_index
252 function asearch_save_recent($recent_index)
254 global $recent_prefkeys, $saved_prefkeys;
256 $saved_array = asearch_read_saved();
257 if (isset($saved_array[$saved_prefkeys[0]])) {
258 $saved_index = count($saved_array[$saved_prefkeys[0]]);
262 $recent_array = asearch_read_recent();
264 foreach ($recent_prefkeys as $key) {
265 $recent_slice = array_slice($recent_array[$key], $recent_index, 1);
266 if (!empty($recent_slice[0]))
267 asearch_setPref($saved_prefkeys[$n], $saved_index, $recent_slice[0]);
269 asearch_removePref($saved_prefkeys[$n], $saved_index);
275 * Write a recent search to prefs
277 * Function arguments are different in 1.5.0
278 * @param array $recent_array
282 function asearch_write_recent(&$recent_array)
284 global $recent_prefkeys, $search_memory;
286 $recent_count = min($search_memory, count($recent_array[$recent_prefkeys[0]]));
287 for ($recent_num = 0; $recent_num < $recent_count; $recent_num++
) {
288 foreach ($recent_prefkeys as $key) {
289 asearch_setPref($key, $recent_num, $recent_array[$key][$recent_num]);
292 for (; $recent_num < $search_memory; $recent_num++
) {
293 foreach ($recent_prefkeys as $key) {
294 asearch_removePref($key, $recent_num);
300 * Remove a recent search from prefs
302 * Function arguments are different in 1.5.0
303 * @param integer $forget_index removed search number
307 function asearch_forget_recent($forget_index)
309 global $recent_prefkeys;
311 $recent_array = asearch_read_recent();
312 foreach ($recent_prefkeys as $key) {
313 array_splice($recent_array[$key], $forget_index, 1);
315 asearch_write_recent($recent_array);
319 * Find a recent search in the prefs (used to avoid saving duplicates)
320 * @param array $recent_array
321 * @param array $mailbox_array
322 * @param array $biop_array
323 * @param array $unop_array
324 * @param array $where_array
325 * @param array $what_array
326 * @param array $exclude_array
327 * @param array $sub_array
332 function asearch_find_recent(&$recent_array, &$mailbox_array, &$biop_array, &$unop_array, &$where_array, &$what_array, &$exclude_array, &$sub_array)
334 global $recent_prefkeys, $search_advanced;
336 $where_string = asearch_serialize($where_array);
337 $mailbox_string = asearch_serialize($mailbox_array);
338 $what_string = asearch_serialize($what_array);
339 $unop_string = asearch_serialize($unop_array);
340 if ($search_advanced) {
341 $biop_string = asearch_serialize($biop_array);
342 $exclude_string = asearch_serialize($exclude_array);
343 $sub_string = asearch_serialize($sub_array);
345 $recent_count = count($recent_array[$recent_prefkeys[ASEARCH_WHERE
]]);
346 for ($recent_num = 0; $recent_num < $recent_count; $recent_num++
) {
347 if (isset($recent_array[$recent_prefkeys[ASEARCH_WHERE
]][$recent_num])) {
349 $where_string == $recent_array[$recent_prefkeys[ASEARCH_WHERE
]][$recent_num] &&
350 $mailbox_string == $recent_array[$recent_prefkeys[ASEARCH_MAILBOX
]][$recent_num] &&
351 $what_string == $recent_array[$recent_prefkeys[ASEARCH_WHAT
]][$recent_num] &&
352 $unop_string == $recent_array[$recent_prefkeys[ASEARCH_UNOP
]][$recent_num] &&
353 ((!$search_advanced) ||
354 ($biop_string == $recent_array[$recent_prefkeys[ASEARCH_BIOP
]][$recent_num] &&
355 $exclude_string == $recent_array[$recent_prefkeys[ASEARCH_EXCLUDE
]][$recent_num] &&
356 $sub_string == $recent_array[$recent_prefkeys[ASEARCH_SUB
]][$recent_num]))
365 * Push a recent search into the prefs
366 * @param array $recent_array
367 * @param array $mailbox_array
368 * @param array $biop_array
369 * @param array $unop_array
370 * @param array $where_array
371 * @param array $what_array
372 * @param array $exclude_array
373 * @param array $sub_array
377 function asearch_push_recent(&$mailbox_array, &$biop_array, &$unop_array, &$where_array, &$what_array, &$exclude_array, &$sub_array)
379 global $recent_prefkeys, $search_memory;
380 //global $what; // Hack to access issued search from read_body.php
383 * Update search history and store it in the session so we can retrieve the
384 * issued search when returning from an external page like read_body.php
386 $criteria[$what] = array($mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
387 sqsession_register($criteria, ASEARCH_CRITERIA
);
388 if ($search_memory > 0) {
389 $recent_array = asearch_read_recent();
390 $recent_found = asearch_find_recent($recent_array, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
391 if ($recent_found >= 0) { // Remove identical recent
392 foreach ($recent_prefkeys as $key) {
393 array_splice($recent_array[$key], $recent_found, 1);
396 $input = array($where_array, $mailbox_array, $what_array, $unop_array, $biop_array, $exclude_array, $sub_array);
398 foreach ($recent_prefkeys as $key) {
399 array_unshift($recent_array[$key], asearch_serialize($input[$i]));
402 asearch_write_recent($recent_array);
407 * Edit a recent search
409 * Function arguments are different in 1.5.0
410 * @global array mailbox_array searched mailboxes
411 * @param mixed $index
415 function asearch_edit_recent($index)
417 global $recent_prefkeys, $search_advanced;
418 global $where_array, $mailbox_array, $what_array, $unop_array;
419 global $biop_array, $exclude_array, $sub_array;
421 $where_array = asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_WHERE
], $index));
422 $mailbox_array = asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_MAILBOX
], $index));
423 $what_array = asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_WHAT
], $index));
424 $unop_array = asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_UNOP
], $index));
425 if ($search_advanced) {
426 $biop_array = asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_BIOP
], $index));
427 $exclude_array = asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_EXCLUDE
], $index));
428 $sub_array = asearch_unserialize(asearch_getPref($recent_prefkeys[ASEARCH_SUB
], $index));
433 * Get last search criteria from session or prefs
435 * Function arguments are different in 1.5.0
436 * FIXME, try to avoid globals
437 * @param mixed $index
441 function asearch_edit_last($index) {
442 if (sqGetGlobalVar(ASEARCH_CRITERIA
, $criteria, SQ_SESSION
)) {
443 global $where_array, $mailbox_array, $what_array, $unop_array;
444 global $biop_array, $exclude_array, $sub_array;
445 $mailbox_array = $criteria[$index][0];
446 $biop_array = $criteria[$index][1];
447 $unop_array = $criteria[$index][2];
448 $where_array = $criteria[$index][3];
449 $what_array = $criteria[$index][4];
450 $exclude_array = $criteria[$index][5];
451 $sub_array = $criteria[$index][6];
452 unset($criteria[$index]);
453 //sqsession_unregister(ASEARCH_CRITERIA);
455 global $search_memory;
456 if ($search_memory > 0) {
457 asearch_edit_recent(0);
463 * Edit a saved search
465 * Function arguments are different in 1.5.0
466 * @param mixed $index
470 function asearch_edit_saved($index)
472 global $saved_prefkeys, $search_advanced;
473 global $where_array, $mailbox_array, $what_array, $unop_array;
474 global $biop_array, $exclude_array, $sub_array;
476 $where_array = asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_WHERE
], $index));
477 $mailbox_array = asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_MAILBOX
], $index));
478 $what_array = asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_WHAT
], $index));
479 $unop_array = asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_UNOP
], $index));
480 if ($search_advanced) {
481 $biop_array = asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_BIOP
], $index));
482 $exclude_array = asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_EXCLUDE
], $index));
483 $sub_array = asearch_unserialize(asearch_getPref($saved_prefkeys[ASEARCH_SUB
], $index));
488 * Write a saved search to the prefs
490 * Function arguments are different in 1.5.0
491 * @param array $saved_array
495 function asearch_write_saved(&$saved_array)
497 global $saved_prefkeys;
499 $saved_count = count($saved_array[$saved_prefkeys[0]]);
500 for ($saved_num=0; $saved_num < $saved_count; $saved_num++
) {
501 foreach ($saved_prefkeys as $key) {
502 asearch_setPref($key, $saved_num, $saved_array[$key][$saved_num]);
505 foreach ($saved_prefkeys as $key) {
506 asearch_removePref($key, $saved_count);
511 * Delete a saved search from the prefs
513 * Function arguments are different in 1.5.0
514 * @param integer $saved_index
518 function asearch_delete_saved($saved_index)
520 global $saved_prefkeys;
522 $saved_array = asearch_read_saved();
523 $asearch_keys = $saved_prefkeys;
524 foreach ($asearch_keys as $key) {
525 array_splice($saved_array[$key], $saved_index, 1);
527 asearch_write_saved($saved_array);
530 /** Translate the input date to imap date to local date display,
531 * so the user can know if the date is wrong or illegal
532 * @param string $what date string
533 * @return string locally formatted date or error text
537 function asearch_get_date_display(&$what)
539 $what_parts = sqimap_asearch_parse_date($what);
540 if (count($what_parts) == 4) {
541 if (checkdate($what_parts[2], $what_parts[1], $what_parts[3]))
542 return date_intl(_("M j, Y"), mktime(0,0,0,$what_parts[2],$what_parts[1],$what_parts[3]));
543 //return $what_parts[1] . ' ' . getMonthName($what_parts[2]) . ' ' . $what_parts[3];
544 return _("(Illegal date)");
546 return _("(Wrong date)");
550 * Translate the query to rough natural display
551 * @param array $color
552 * @param array $mailbox_array
553 * @param array $biop_array
554 * @param array $unop_array
555 * @param array $where_array
556 * @param array $what_array
557 * @param array $exclude_array
558 * @param array $sub_array
559 * @return string rough natural query ready to display
563 function asearch_get_query_display(&$color, &$mailbox_array, &$biop_array, &$unop_array, &$where_array, &$what_array, &$exclude_array, &$sub_array)
565 global $imap_asearch_biops_in, $imap_asearch_biops, $imap_asearch_unops, $imap_asearch_options;
566 global $imap_asearch_opcodes;
568 $last_mailbox = $mailbox_array[0];
569 if (empty($last_mailbox))
570 $last_mailbox = 'INBOX';
572 for ($crit_num=0; $crit_num < count($where_array); $crit_num++
) {
573 if ((!isset($exclude_array[$crit_num])) ||
(!$exclude_array[$crit_num])) {
574 $cur_mailbox = $mailbox_array[$crit_num];
575 if (empty($cur_mailbox))
576 $cur_mailbox = 'INBOX';
577 $biop = asearch_nz($biop_array[$crit_num]);
578 if (($query_display == '') ||
($cur_mailbox != $last_mailbox)) {
579 $mailbox_display = ' <span class="mailbox">' . htmlspecialchars(asearch_get_mailbox_display($cur_mailbox)) . '</span>';
580 if ($query_display == '')
581 $biop_display = _("In");
583 $biop_display = $imap_asearch_biops_in[$biop];
584 $last_mailbox = $cur_mailbox;
587 $mailbox_display = '';
588 $biop_display = $imap_asearch_biops[$biop];
590 $unop = $unop_array[$crit_num];
591 $unop_display = $imap_asearch_unops[$unop];
592 if ($unop_display != '')
593 $unop_display .= ' ';
594 $where = $where_array[$crit_num];
595 $where_display = $unop_display . asearch_nz($imap_asearch_options[$where], $where);
596 $what_type = $imap_asearch_opcodes[$where];
597 $what = $what_array[$crit_num];
598 if ($what_type) { /* Check opcode parameter */
600 $what_display = ' <span class="error">' . _("(Missing argument)") .'</span>';
602 if ($what_type == 'adate')
603 $what_display = asearch_get_date_display($what);
605 $what_display = htmlspecialchars($what);
606 $what_display = ' <span class="value">' . $what_display . '</span>';
611 $what_display = ' <span class="error">' . _("(Spurious argument)") .'</span>';
615 if ($mailbox_display != '')
616 $query_display .= ' <span class="operator">' . $biop_display . '</span>' . $mailbox_display . ' <span class="conditions">' . $where_display . '</span>' . $what_display;
618 $query_display .= ' <span class="operator">' . $biop_display . '</span> <span class="conditions">' . $where_display . '</span>' . $what_display;
621 return $query_display;
627 * @deprecated see form functions available in 1.5.1 and 1.4.3.
628 * @param string $type
629 * @param string $name
630 * @param string $value
632 * @param bool $enabled
634 function getButton($type, $name, $value, $js = '', $enabled = TRUE) {
635 $disabled = ( $enabled ?
'' : 'disabled ' );
636 $js = ( $js ?
$js.' ' : '' );
637 return '<input '.$disabled.$js.
641 '" style="padding: 0px; margin: 0px" />';
645 * Print a whole query array, recent or saved
647 * Function arguments are different in 1.5.0
648 * @param array $boxes (unused)
649 * @param array $query_array
650 * @param mixed $query_keys
651 * @param array $action_array
652 * @param mixed $title
653 * @param string $show_pref
657 function asearch_print_query_array(&$boxes, &$query_array, &$query_keys, &$action_array, $title, $show_pref)
659 global $data_dir, $username;
660 global $icon_theme_path;
663 $show_flag = getPref($data_dir, $username, $show_pref, 0) & 1;
665 $main_key = $query_keys[ASEARCH_WHERE
];
666 $query_count = count($query_array[$main_key]);
667 for ($query_num = 0, $row_num = 0; $query_num < $query_count; $query_num++
) {
668 if (!empty($query_array[$main_key][$query_num])) {
669 unset($search_array);
670 foreach ($query_keys as $query_key) {
671 $search_array[] = asearch_unserialize($query_array[$query_key][$query_num]);
674 $where_array = $search_array[ASEARCH_WHERE
];
675 $mailbox_array = $search_array[ASEARCH_MAILBOX
];
676 $what_array = $search_array[ASEARCH_WHAT
];
677 $unop_array = $search_array[ASEARCH_UNOP
];
678 $biop_array = asearch_nz($search_array[ASEARCH_BIOP
], array());
679 $exclude_array = asearch_nz($search_array[ASEARCH_EXCLUDE
], array());
680 $sub_array = asearch_nz($search_array[ASEARCH_SUB
], array());
681 $query_display = asearch_get_query_display($color, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
683 $a[$query_num] = $query_display;
687 $oTemplate->assign('list_title', $title);
688 $oTemplate->assign('show_list', $show_flag==1);
689 $oTemplate->assign('is_recent_list', $title==_("Recent Searches"));
690 $oTemplate->assign('expand_collapse_toggle', '../src/search.php?'.$show_pref.'='.($show_flag==1 ?
0 : 1));
691 $oTemplate->assign('query_list', $a);
693 $oTemplate->assign('save_recent', '../src/search.php?submit=save_recent&rownum=');
694 $oTemplate->assign('do_recent', '../src/search.php?submit=search_recent&rownum=');
695 $oTemplate->assign('forget_recent', '../src/search.php?submit=forget_recent&rownum=');
697 $oTemplate->assign('edit_saved', '../src/search.php?submit=edit_saved&rownum=');
698 $oTemplate->assign('do_saved', '../src/search.php?submit=search_saved&rownum=');
699 $oTemplate->assign('delete_saved', '../src/search.php?submit=delete_saved&rownum=');
701 $oTemplate->display('search_list.tpl');
704 /** Print the saved array
706 * Function arguments are different in 1.5.0
707 * @param array $boxes (unused, see asearch_print_query_array())
711 function asearch_print_saved(&$boxes)
713 global $saved_prefkeys;
715 $saved_array = asearch_read_saved();
716 if (isset($saved_array[$saved_prefkeys[0]])) {
717 $saved_count = count($saved_array[$saved_prefkeys[0]]);
718 if ($saved_count > 0) {
719 $saved_actions = array('edit_saved' => _("Edit"), 'search_saved' => _("Search"), 'delete_saved' => _("Delete"));
720 asearch_print_query_array($boxes, $saved_array, $saved_prefkeys, $saved_actions, _("Saved Searches"), 'search_show_saved');
726 * Print the recent array
728 * Function arguments are different in 1.5.0
729 * @param array $boxes (unused, see asearch_print_query_array())
733 function asearch_print_recent(&$boxes)
735 global $recent_prefkeys, $search_memory;
737 $recent_array = asearch_read_recent();
738 if (isset($recent_array[$recent_prefkeys[0]])) {
739 $recent_count = count($recent_array[$recent_prefkeys[0]]);
740 if (min($recent_count, $search_memory) > 0) {
741 $recent_actions = array('save_recent' => _("save"), 'search_recent' => _("search"), 'forget_recent' => _("forget"));
742 asearch_print_query_array($boxes, $recent_array, $recent_prefkeys, $recent_actions, _("Recent Searches"), 'search_show_recent');
747 /** Verify that a mailbox exists
748 * @param string $mailbox
749 * @param array $boxes
750 * @return bool mailbox exists
751 * @deprecated FIXME use standard functions
755 function asearch_mailbox_exists($mailbox, &$boxes)
757 foreach ($boxes as $box) {
758 if ($box['unformatted'] == $mailbox)
764 /** Print the advanced search form
765 * @param stream $imapConnection
766 * @param array $boxes
767 * @param array $mailbox_array
768 * @param array $biop_array
769 * @param array $unop_array
770 * @param array $where_array
771 * @param array $what_array
772 * @param array $exclude_array
773 * @param array $sub_array
777 function asearch_print_form($imapConnection, &$boxes, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array)
779 global $oTemplate, $allow_advanced_search, $search_advanced,
780 $imap_asearch_unops, $imap_asearch_biops_in, $imap_asearch_options;
782 # Build the criteria array
784 for ($row_num = 0; $row_num < count($where_array); $row_num++
) {
785 $mailbox = asearch_nz($mailbox_array[$row_num]);
787 $a['MailboxSel'] = asearch_nz($mailbox_array[$row_num]);
788 $a['LogicSel'] = strip_tags(asearch_nz($biop_array[$row_num]));
789 $a['UnarySel'] = strip_tags(asearch_nz($unop_array[$row_num]));
790 $a['WhereSel'] = strip_tags(asearch_nz($where_array[$row_num]));
791 $a['What'] = asearch_nz($what_array[$row_num]);
792 $a['Exclude'] = strip_tags(asearch_nz($exclude_array[$row_num])) == 'on';
793 $a['IncludeSubfolders'] = strip_tags(asearch_nz($sub_array[$row_num])) == 'on';
798 # Build the mailbox array
800 if (($mailbox != 'All Folders') && (!asearch_mailbox_exists($mailbox, $boxes))) {
801 $a[$mailbox] = '[' . _("Missing") . '] ' . htmlspecialchars(asearch_get_mailbox_display($mailbox));
803 $a['All Folders'] = '[' . asearch_get_mailbox_display('All Folders') . ']';
804 $a = array_merge($a, sqimap_mailbox_option_array($imapConnection, 0, $boxes, NULL));
806 if ($allow_advanced_search > 1) {
807 $link = '../src/search.php?advanced='.($search_advanced ?
0 : 1);
808 $txt = $search_advanced ?
_("Standard Search") : _("Advanced search");
814 $oTemplate->assign('allow_advanced_search', $allow_advanced_search > 1);
815 $oTemplate->assign('adv_toggle_text', $txt);
816 $oTemplate->assign('adv_toggle_link', $link);
818 $oTemplate->assign('mailbox_options', $a);
819 $oTemplate->assign('logical_options', $imap_asearch_biops_in);
820 $oTemplate->assign('unary_options', $imap_asearch_unops);
821 $oTemplate->assign('where_options', $imap_asearch_options);
823 $oTemplate->assign('criteria', $c);
825 echo '<form action="../src/search.php" name="form_asearch">' . "\n";
826 $oTemplate->display('search_advanced.tpl');
830 /** Print the basic search form
831 * @param stream $imapConnection
832 * @param array $boxes
833 * @param array $mailbox_array
834 * @param array $biop_array
835 * @param array $unop_array
836 * @param array $where_array
837 * @param array $what_array
838 * @param array $exclude_array
839 * @param array $sub_array
843 function asearch_print_form_basic($imapConnection, &$boxes, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array)
845 global $allow_advanced_search, $search_advanced, $oTemplate, $imap_asearch_unops, $imap_asearch_options;
848 $mailbox = asearch_nz($mailbox_array[$row_num]);
849 $biop = strip_tags(asearch_nz($biop_array[$row_num]));
850 $unop = strip_tags(asearch_nz($unop_array[$row_num]));
851 $where = strip_tags(asearch_nz($where_array[$row_num]));
852 $what = asearch_nz($what_array[$row_num]);
853 $exclude = strip_tags(asearch_nz($exclude_array[$row_num]));
854 $sub = strip_tags(asearch_nz($sub_array[$row_num]));
856 # Build the mailbox array
858 if (($mailbox != 'All Folders') && (!asearch_mailbox_exists($mailbox, $boxes))) {
859 $a[$mailbox] = '[' . _("Missing") . '] ' . htmlspecialchars(asearch_get_mailbox_display($mailbox));
861 $a['All Folders'] = '[' . asearch_get_mailbox_display('All Folders') . ']';
862 $a = array_merge($a, sqimap_mailbox_option_array($imapConnection, 0, $boxes, NULL));
864 if ($allow_advanced_search > 1) {
865 $link = '../src/search.php?advanced='.($search_advanced ?
0 : 1);
866 $txt = $search_advanced ?
_("Standard Search") : _("Advanced search");
872 $oTemplate->assign('allow_advanced_search', $allow_advanced_search > 1);
873 $oTemplate->assign('adv_toggle_text', $txt);
874 $oTemplate->assign('adv_toggle_link', $link);
876 $oTemplate->assign('mailbox_options', $a);
877 $oTemplate->assign('unary_options', $imap_asearch_unops);
878 $oTemplate->assign('where_options', $imap_asearch_options);
880 $oTemplate->assign('mailbox_sel', strtolower(htmlspecialchars($mailbox)));
881 $oTemplate->assign('unary_sel', $unop);
882 $oTemplate->assign('where_sel', $where);
883 $oTemplate->assign('what_val', $what);
885 echo '<form action="../src/search.php" name="form_asearch">' . "\n";
886 $oTemplate->display('search.tpl');
892 * @param array $boxes mailboxes array (reference)
893 * @return array selectable unformatted mailboxes names
897 function sqimap_asearch_get_selectable_unformatted_mailboxes(&$boxes)
899 $mboxes_array = array();
900 $boxcount = count($boxes);
901 for ($boxnum = 0; $boxnum < $boxcount; $boxnum++
) {
902 if (!in_array('noselect', $boxes[$boxnum]['flags']))
903 $mboxes_array[] = $boxes[$boxnum]['unformatted'];
905 return $mboxes_array;
908 /* ------------------------ main ------------------------ */
909 /* get globals we will need */
910 sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION
);
912 if ( sqgetGlobalVar('checkall', $temp, SQ_GET
) ) {
913 $checkall = (int) $temp;
917 * Retrieve the mailbox cache from the session.
919 sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION
);
921 $search_button_html = _("Search");
922 $search_button_text = asearch_unhtmlentities($search_button_html);
923 $add_criteria_button_html = _("Add New Criteria");
924 $add_criteria_button_text = asearch_unhtmlentities($add_criteria_button_html);
925 $del_excluded_button_html = _("Remove Excluded Criteria");
926 $del_excluded_button_text = asearch_unhtmlentities($del_excluded_button_html);
927 $del_all_button_html = _("Remove All Criteria");
928 $del_all_button_text = asearch_unhtmlentities($del_all_button_html);
930 /** Maximum number of recent searches to handle
932 * @global integer $search_memory
934 $search_memory = getPref($data_dir, $username, 'search_memory', 0);
936 /** Advanced search control
937 * - 0 => allow basic interface only
938 * - 1 => allow advanced interface only
942 $allow_advanced_search = asearch_nz($allow_advanced_search, 2);
945 * Toggle advanced/basic search
947 if (sqgetGlobalVar('advanced', $search_advanced, SQ_GET
)) {
948 setPref($data_dir, $username, 'search_advanced', $search_advanced & 1);
950 /** If 1, show advanced search interface
951 * Default from allow_advanced_search pref
952 * @global integer $search_advanced
954 if ($allow_advanced_search > 1) {
955 $search_advanced = getPref($data_dir, $username, 'search_advanced', 0);
957 $search_advanced = $allow_advanced_search;
959 if ($search_advanced) {
960 /** Set recent prefkeys according to $search_advanced
961 * @global array $recent_prefkeys
963 $recent_prefkeys = array('asearch_recent_where', 'asearch_recent_mailbox', 'asearch_recent_what', 'asearch_recent_unop', 'asearch_recent_biop', 'asearch_recent_exclude', 'asearch_recent_sub');
965 /** Set saved prefkeys according to $search_advanced
966 * @global array $saved_prefkeys
968 $saved_prefkeys = array('asearch_saved_where', 'asearch_saved_mailbox', 'asearch_saved_what', 'asearch_saved_unop', 'asearch_saved_biop', 'asearch_saved_exclude', 'asearch_saved_sub');
970 /*$asearch_prefkeys = array('where', 'mailbox', 'what', 'biop', 'unop', 'exclude', 'sub');*/
972 $recent_prefkeys = array('search_where', 'search_folder', 'search_what', 'search_unop');
973 $saved_prefkeys = array('saved_where', 'saved_folder', 'saved_what', 'saved_unop');
976 /** How we did enter the form
977 * - unset : Enter key, or called from outside (eg read_body)
978 * - $search_button_text : Search button
979 * - 'Search_no_update' : Search but don't update recent
980 * - 'Search_last' : Same as no_update but reload and search last
981 * - 'Search_silent' : Same as no_update but only display results
982 * - $add_criteria_button_text : Add New Criteria button
983 * - $del_excluded_button_text : Remove Excluded Criteria button
984 * - $del_all_button_text : Remove All Criteria button
991 * @global string $submit
993 $searchpressed = false;
994 if (isset($_GET['submit'])) {
995 $submit = strip_tags($_GET['submit']);
998 /** Searched mailboxes
999 * @global array $mailbox_array
1001 if (isset($_GET['mailbox'])) {
1002 $mailbox_array = $_GET['mailbox'];
1003 $targetmailbox = $_GET['mailbox'];
1004 if (!is_array($mailbox_array)) {
1005 $mailbox_array = array($mailbox_array);
1008 $mailbox_array = array();
1009 $targetmailbox = array();
1011 $aMailboxGlobalPref = array(
1013 MBX_PREF_LIMIT
=> (int) $show_num,
1014 MBX_PREF_AUTO_EXPUNGE
=> (bool) $auto_expunge,
1015 MBX_PREF_INTERNALDATE
=> (bool) getPref($data_dir, $username, 'internal_date_sort')
1016 // MBX_PREF_FUTURE => (var) $future
1020 * system wide admin settings and incoming vars.
1023 // 'allow_thread_sort' => $allow_thread_sort,
1024 // 'allow_server_sort' => $allow_server_sort,
1025 'user' => $username,
1029 /** Binary operators
1030 * @global array $biop_array
1032 if (isset($_GET['biop'])) {
1033 $biop_array = $_GET['biop'];
1034 if (!is_array($biop_array))
1035 $biop_array = array($biop_array);
1037 $biop_array = array();
1040 * @global array $unop_array
1042 if (isset($_GET['unop'])) {
1043 $unop_array = $_GET['unop'];
1044 if (!is_array($unop_array))
1045 $unop_array = array($unop_array);
1047 $unop_array = array();
1050 * @global array $where_array
1052 if (isset($_GET['where'])) {
1053 $where_array = $_GET['where'];
1054 if (!is_array($where_array)) {
1055 $where_array = array($where_array);
1058 $where_array = array();
1061 * @global array $what_array
1063 if (isset($_GET['what'])) {
1064 $what_array = $_GET['what'];
1065 if (!is_array($what_array)) {
1066 $what_array = array($what_array);
1069 $what_array = array();
1071 /** Whether to exclude this criteria from search
1072 * @global array $exclude_array
1074 if (isset($_GET['exclude'])) {
1075 $exclude_array = $_GET['exclude'];
1077 $exclude_array = array();
1079 /** Search within subfolders
1080 * @global array $sub_array
1082 if (isset($_GET['sub'])) {
1083 $sub_array = $_GET['sub'];
1085 $sub_array = array();
1087 /** Row number used by recent and saved stuff
1089 if (isset($_GET['rownum'])) {
1090 $submit_rownum = strip_tags($_GET['rownum']);
1092 /** Change global sort
1094 if (sqgetGlobalVar('srt', $temp, SQ_GET
)) {
1096 asearch_edit_last(1);
1097 // asearch_push_recent($mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
1099 //FIXME: the following gets the right startMessage value, but there is no indication of what form it came from (thus what mailbox folder needs to be paginated), so when using the compact paginator without javascript turned on, pagination is broken
1100 if (sqGetGlobalVarMultiple('startMessage', $temp, 'paginator_submit', SQ_FORM
)) {
1101 $startMessage = (int) $temp;
1102 asearch_edit_last(1);
1103 // asearch_push_recent($mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
1106 if ( sqgetGlobalVar('showall', $temp, SQ_GET
) ) {
1107 $showall = (int) $temp;
1108 asearch_edit_last(1);
1109 // asearch_push_recent($mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
1112 if ( sqgetGlobalVar('account', $temp, SQ_GET
) ) {
1113 $iAccount = (int) $temp;
1119 * Incoming submit buttons from the message list with search results
1121 if (sqgetGlobalVar('moveButton', $moveButton, SQ_POST
) ||
1122 sqgetGlobalVar('expungeButton', $expungeButton, SQ_POST
) ||
1123 sqgetGlobalVar('delete', $markDelete, SQ_POST
) ||
1124 sqgetGlobalVar('undeleteButton', $undeleteButton, SQ_POST
) ||
1125 sqgetGlobalVar('markRead', $markRead, SQ_POST
) ||
1126 sqgetGlobalVar('markUnread', $markUnread, SQ_POST
) ||
1127 sqgetGlobalVar('markFlagged', $markFlagged, SQ_POST
) ||
1128 sqgetGlobalVar('markUnflagged', $markUnflagged, SQ_POST
) ||
1129 sqgetGlobalVar('attache', $attache, SQ_POST
)) {
1130 asearch_edit_last(1);
1132 asearch_push_recent($mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
1137 /** Toggle show/hide saved searches
1139 if (sqgetGlobalVar('search_show_saved', $search_show_saved, SQ_GET
)) {
1140 setPref($data_dir, $username, 'search_show_saved', $search_show_saved & 1);
1142 /** Toggle show/hide recent searches
1144 if (sqgetGlobalVar('search_show_recent', $search_show_recent, SQ_GET
)) {
1145 setPref($data_dir, $username, 'search_show_recent', $search_show_recent & 1);
1147 // end of get globals
1149 /** If TRUE, do not show search interface
1151 * @global bool $search_silent
1153 $search_silent = FALSE;
1155 /* See how the page was called and fire off correct function */
1156 if ((empty($submit)) && (!empty($where_array))) {
1157 /* This happens when the Enter key is used or called from outside */
1158 $submit = $search_button_text;
1159 /* Hack needed to handle coming back from read_body et als */
1160 if (count($where_array) != count($unop_array)) {
1162 * Hack to use already existen where and what vars.
1163 * where now contains the initiator page of the messagelist
1164 * and in this case 'search'. what contains an index to access
1165 * the search history
1168 sqgetGlobalVar('what',$what,SQ_GET
);
1169 asearch_edit_last($what);
1173 if (!isset($submit)) {
1177 case $search_button_text:
1178 if (asearch_check_query($where_array, $what_array, $exclude_array) == '') {
1179 asearch_push_recent($mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
1182 case 'Search_silent':
1183 $search_silent = TRUE;
1185 case 'Search_no_update':
1186 $submit = $search_button_text;
1188 case $del_excluded_button_text:
1189 $delarray = array_keys($exclude_array);
1190 while (!empty($delarray)) {
1191 $delrow = array_pop($delarray);
1192 array_splice($mailbox_array, $delrow, 1);
1193 array_splice($biop_array, $delrow, 1);
1194 array_splice($unop_array, $delrow, 1);
1195 array_splice($where_array, $delrow, 1);
1196 array_splice($what_array, $delrow, 1);
1197 /* array_splice($exclude_array, $delrow, 1);*/ /* There is still some php magic that eludes me */
1198 array_splice($sub_array, $delrow, 1);
1200 $exclude_array = array();
1202 case $del_all_button_text:
1203 $mailbox_array = array();
1204 $biop_array = array();
1205 $unop_array = array();
1206 $where_array = array();
1207 $what_array = array();
1208 $exclude_array = array();
1209 $sub_array = array();
1212 asearch_save_recent($submit_rownum);
1214 case 'search_recent':
1215 $submit = $search_button_text;
1216 asearch_edit_recent($submit_rownum);
1217 asearch_push_recent($mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
1219 case 'edit_recent': /* no link to do this, yet */
1220 asearch_edit_recent($submit_rownum);
1222 case 'forget_recent':
1223 asearch_forget_recent($submit_rownum);
1225 case 'search_saved':
1226 $submit = $search_button_text;
1227 asearch_edit_saved($submit_rownum);
1228 asearch_push_recent($mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
1231 asearch_edit_saved($submit_rownum);
1233 case 'delete_saved':
1234 asearch_delete_saved($submit_rownum);
1239 //Texts in both basic and advanced form
1240 $imap_asearch_unops = array(
1245 if ($search_advanced) {
1246 //Texts in advanced form only
1247 $imap_asearch_options = array(
1249 //'ALL' is binary operator
1250 'ANSWERED' => _("Answered"),
1252 'BEFORE' => _("Before"),
1253 'BODY' => _("Message Body"),
1255 'DELETED' => _("Deleted"),
1256 'DRAFT' => _("Draft"),
1257 'FLAGGED' => _("Flagged"),
1258 'FROM' => _("Sent By"),
1259 'HEADER' => _("Header Field"),
1260 'KEYWORD' => _("Keyword"),
1261 'LARGER' => _("Larger Than"),
1263 //'NOT' is unary operator
1266 //'OR' is binary operator
1267 'RECENT' => _("Recent"),
1268 'SEEN' => _("Seen"),
1269 'SENTBEFORE' => _("Sent Before"),
1270 'SENTON' => _("Sent On"),
1271 'SENTSINCE' => _("Sent Since"),
1272 'SINCE' => _("Since"),
1273 'SMALLER' => _("Smaller Than"),
1274 'SUBJECT' => _("Subject Contains"),
1275 'TEXT' => _("Header and Body"),
1276 'TO' => _("Sent To"),
1278 /* 'UNANSWERED' => '',
1282 'UNKEYWORD' => _("Unkeyword"),
1283 'UNSEEN' => _("Unseen"),*/
1286 $imap_asearch_biops_in = array(
1287 'ALL' => _("And In"),
1291 $imap_asearch_biops = array(
1296 //Texts in basic form only
1297 $imap_asearch_options = array(
1299 'BODY' => _("Body"),
1301 'FROM' => _("From"),
1302 'SUBJECT' => _("Subject"),
1303 'TEXT' => _("Everywhere"),
1308 uasort($imap_asearch_options, 'asearch_unhtml_strcoll');
1310 /* open IMAP connection */
1311 $imapConnection = sqimap_login($username, false, $imapServerAddress, $imapPort, 0);
1314 /* get mailboxes once here */
1315 $boxes = sqimap_mailbox_list($imapConnection);
1316 /* ensure we have a valid default mailbox name */
1317 $mailbox = asearch_nz($mailbox_array[0]);
1318 if (($mailbox == '') ||
($mailbox == 'None')) //Workaround for sm quirk IMHO (what if I really have a mailbox called None?)
1319 $mailbox = $boxes[0]['unformatted']; //Usually INBOX ;)
1323 * Handle form actions like flag / unflag, seen / unseen, delete
1325 if (sqgetGlobalVar('mailbox',$postMailbox,SQ_POST
)) {
1328 * system wide admin settings and incoming vars.
1331 'user' => $username,
1333 $aConfig['setindex'] = 1; // $what $where = 'search'
1335 * Set the max cache size to the number of mailboxes to avoid cache cleanups
1336 * when searching all mailboxes
1338 $aConfig['max_cache_size'] = count($boxes) +
1;
1340 $aMailbox = sqm_api_mailbox_select($imapConnection, $iAccount, $postMailbox,$aConfig,array());
1341 $sError = handleMessageListForm($imapConnection,$aMailbox);
1342 /* add the mailbox to the cache */
1343 $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
1351 if (isset($aMailbox['FORWARD_SESSION'])) {
1352 /* add the mailbox to the cache */
1353 $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
1354 sqsession_register($mailbox_cache,'mailbox_cache');
1356 if ($compose_new_win) {
1357 // write the session in order to make sure that the compose window has
1358 // access to the composemessages array which is stored in the session
1359 session_write_close();
1360 // restart the session. Do not use sqsession_is_active because the session_id
1361 // isn't empty after a session_write_close
1364 if (!preg_match("/^[0-9]{3,4}$/", $compose_width)) {
1365 $compose_width = '640';
1367 if (!preg_match("/^[0-9]{3,4}$/", $compose_height)) {
1368 $compose_height = '550';
1370 // do not use &, it will break the query string and $session will not be detected!!!
1371 $comp_uri = SM_PATH
. 'src/compose.php?mailbox='. urlencode($mailbox).
1372 '&session='.$aMailbox['FORWARD_SESSION'];
1373 displayPageHeader($color, $mailbox, "comp_in_new('$comp_uri', $compose_width, $compose_height);", false);
1375 // save mailboxstate
1376 sqsession_register($aMailbox,'aLastSelectedMailbox');
1377 session_write_close();
1378 // we have to redirect to the compose page
1379 $location = SM_PATH
. 'src/compose.php?mailbox='. urlencode($mailbox).
1380 '&session='.$aMailbox['FORWARD_SESSION'];
1381 header("Location: $location");
1385 displayPageHeader($color, $mailbox);
1386 // $compose_uri = $base_uri.'src/compose.php?newmessage=1';
1390 $oTemplate->assign('note', $note);
1391 $oTemplate->display('note.tpl');
1394 do_hook('search_before_form', $null);
1396 if (!$search_silent) {
1397 asearch_print_saved($boxes);
1398 asearch_print_recent($boxes);
1399 if (empty($where_array)) {
1400 global $sent_folder;
1402 $mailbox_array[0] = $mailbox;
1403 $biop_array[0] = '';
1404 $unop_array[0] = '';
1405 if ($mailbox == $sent_folder) {
1406 $where_array[0] = 'TO';
1408 $where_array[0] = 'FROM';
1410 $what_array[0] = '';
1411 $exclude_array[0] = '';
1414 //Display advanced or basic form
1415 if ($search_advanced) {
1416 if ($submit == $add_criteria_button_text) {
1417 $last_index = max(count($where_array) - 1, 0);
1418 $mailbox_array[] = asearch_nz($mailbox_array[$last_index]);
1419 $biop_array[] = asearch_nz($biop_array[$last_index]);
1420 $unop_array[] = asearch_nz($unop_array[$last_index]);
1421 $where_array[] = asearch_nz($where_array[$last_index]);
1422 $what_array[] = asearch_nz($what_array[$last_index]);
1423 $exclude_array[] = asearch_nz($exclude_array[$last_index]);
1424 $sub_array[] = asearch_nz($sub_array[$last_index]);
1426 asearch_print_form($imapConnection, $boxes, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
1428 asearch_print_form_basic($imapConnection, $boxes, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array);
1432 do_hook('search_after_form', $null);
1434 if ($submit == $search_button_text) {
1437 $err = asearch_check_query($where_array, $what_array, $exclude_array);
1439 $oTemplate->assign('query_has_error', $err!='');
1440 $oTemplate->assign('query_error', $err=='' ?
NULL : $err);
1441 $oTemplate->assign('query', asearch_get_query_display($color, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array));
1443 $oTemplate->display('search_result_top.tpl');
1448 $mboxes_array = sqimap_asearch_get_selectable_unformatted_mailboxes($boxes);
1450 * Retrieve the search queries
1452 $mboxes_mailbox = sqimap_asearch($imapConnection, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array, $mboxes_array);
1453 foreach($mboxes_mailbox as $mbx => $search) {
1456 * until there is no per mailbox option screen to set prefs we override
1457 * the mailboxprefs by the default ones
1460 $aMailboxPrefSer=getPref($data_dir, $username,'pref_'.$iAccount.'_'.$mbx);
1461 if ($aMailboxPrefSer) {
1462 $aMailboxPref = unserialize($aMailboxPrefSer);
1463 $aMailboxPref[MBX_PREF_COLUMNS
] = $index_order;
1465 setUserPref($username,'pref_'.$iAccount.'_'.$mbx,serialize($default_mailbox_pref));
1466 $aMailboxPref = $default_mailbox_pref;
1468 if (isset($srt) && $targetmailbox == $mbx) {
1469 $aMailboxPref[MBX_PREF_SORT
] = (int) $srt;
1472 $trash_folder = (isset($trash_folder)) ?
$trash_folder : false;
1473 $sent_folder = (isset($sent_folder)) ?
$sent_folder : false;
1474 $draft_folder = (isset($draft_folder)) ?
$draft_folder : false;
1478 * until there is no per mailbox option screen to set prefs we override
1479 * the mailboxprefs by the default ones
1481 $aMailboxPref[MBX_PREF_LIMIT
] = (int) $show_num;
1482 $aMailboxPref[MBX_PREF_AUTO_EXPUNGE
] = (bool) $auto_expunge;
1483 $aMailboxPref[MBX_PREF_INTERNALDATE
] = (bool) getPref($data_dir, $username, 'internal_date_sort');
1484 $aMailboxPref[MBX_PREF_COLUMNS
] = $index_order;
1487 * Replace From => To in case it concerns a draft or sent folder
1489 if (($mbx == $sent_folder ||
$mbx == $draft_folder) &&
1490 !in_array(SQM_COL_TO
,$aMailboxPref[MBX_PREF_COLUMNS
])) {
1491 $aNewOrder = array(); // nice var name ;)
1492 foreach($aMailboxPref[MBX_PREF_COLUMNS
] as $iCol) {
1493 if ($iCol == SQM_COL_FROM
) {
1496 $aNewOrder[] = $iCol;
1498 $aMailboxPref[MBX_PREF_COLUMNS
] = $aNewOrder;
1499 setUserPref($username,'pref_'.$iAccount.'_'.$mbx,serialize($aMailboxPref));
1502 $aConfig['search'] = $search['search'];
1503 $aConfig['charset'] = $search['charset'];
1506 * Set the max cache size to the number of mailboxes to avoid cache cleanups
1507 * when searching all mailboxes
1509 $aConfig['max_cache_size'] = count($mboxes_mailbox) +
1;
1510 if (isset($startMessage) && $targetmailbox == $mbx) {
1511 $aConfig['offset'] = $startMessage;
1513 $aConfig['offset'] = 0;
1515 if (isset($showall) && $targetmailbox == $mbx) {
1516 $aConfig['showall'] = $showall;
1518 if (isset($aConfig['showall'])) {
1519 unset($aConfig['showall']);
1525 * Set the config options for the messages list
1527 $aColumns = array();
1528 foreach ($aMailboxPref[MBX_PREF_COLUMNS
] as $iCol) {
1529 $aColumns[$iCol] = array();
1532 if ($truncate_subject) {
1533 $aColumns[$iCol]['truncate'] = $truncate_subject;
1540 if ($truncate_sender) {
1541 $aColumns[$iCol]['truncate'] = $truncate_sender;
1549 'columns' => $aColumns,
1550 'config' => array('alt_index_colors' => $alt_index_colors,
1551 'highlight_list' => $message_highlight_list,
1552 'fancy_index_highlite' => $fancy_index_highlite,
1553 'show_flag_buttons' => (isset($show_flag_buttons)) ?
$show_flag_buttons : true,
1554 'lastTargetMailbox' => (isset($lastTargetMailbox)) ?
$lastTargetMailbox : '',
1555 'trash_folder' => $trash_folder,
1556 'sent_folder' => $sent_folder,
1557 'draft_folder' => $draft_folder,
1558 'enablesort' => true,
1562 'account' => (isset($iAccount)) ?
$iAccount : 0,
1563 'module' => 'read_body',
1567 $aMailbox = sqm_api_mailbox_select($imapConnection, $iAccount, $mbx,$aConfig,$aMailboxPref);
1570 $aTemplate = showMessagesForMailbox($imapConnection, $aMailbox,$aProps, $iError);
1572 // in th future we can make use of multiple message sets, now set it to 1 for search.
1574 if (isset($aMailbox['UIDSET'][$iSetIndex])) {
1575 $iMsgCnt +
= count($aMailbox['UIDSET'][$iSetIndex]);
1581 * In the future, move this the the initialisation area
1583 sqgetGlobalVar('align',$align,SQ_SESSION
);
1586 * TODO: Clean up handling of message list once the template is cleaned up.
1588 if ($aMailbox['EXISTS'] > 0) {
1591 echo "ERROR occured, errorhandler will be implemented very soon";
1593 foreach ($aTemplate as $k => $v) {
1594 $oTemplate->assign($k, $v);
1597 $mailbox_display = asearch_get_mailbox_display($aMailbox['NAME']);
1598 if (strtoupper($mbx) == 'INBOX') {
1599 $mailbox_display = _("INBOX");
1601 $mailbox_display = imap_utf7_decode_local($mbx);
1604 $oTemplate->assign('mailbox_name', htmlspecialchars($mailbox_display));
1605 $oTemplate->display('search_result_mailbox.tpl');
1607 $oTemplate->assign('page_selector', $page_selector);
1608 $oTemplate->assign('page_selector_max', $page_selector_max);
1609 $oTemplate->assign('compact_paginator', $compact_paginator);
1610 $oTemplate->assign('javascript_on', checkForJavascript());
1611 $oTemplate->assign('base_uri', sqm_baseuri());
1612 $oTemplate->assign('enablesort', (isset($aProps['config']['enablesort'])) ?
$aProps['config']['enablesort'] : false);
1613 $oTemplate->assign('icon_theme_path', $icon_theme_path);
1614 $oTemplate->assign('use_icons', (isset($use_icons)) ?
$use_icons : false);
1615 $oTemplate->assign('aOrder', array_keys($aColumns));
1616 $oTemplate->assign('alt_index_colors', isset($alt_index_colors) ?
$alt_index_colors: false);
1617 $oTemplate->assign('color', $color);
1618 $oTemplate->assign('align', $align);
1620 $oTemplate->display('message_list.tpl');
1625 /* add the mailbox to the cache */
1626 $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
1631 $oTemplate->display('search_result_empty.tpl');
1635 do_hook('search_bottom', $null);
1636 sqimap_logout($imapConnection);
1638 $oTemplate->display('footer.tpl');
1639 sqsession_register($mailbox_cache,'mailbox_cache');