- $mbox_msgs = array();
- $search_charset = $languages[$squirrelmail_language]['CHARSET'];
- $search_string = '';
- $cur_mailbox = $mailbox_array[0];
- $cur_biop = ''; /* Start with ALL */
- /* We loop one more time than the real array count, so the last search gets fired */
- for ($cur_crit = 0; $cur_crit <= count($where_array); $cur_crit++) {
- if (empty($exclude_array[$cur_crit])) {
- $next_mailbox = $mailbox_array[$cur_crit];
- if ($next_mailbox != $cur_mailbox) {
- $search_string = trim($search_string); /* Trim out last space */
- if (($cur_mailbox == 'All Folders') && (!empty($mboxes_array)))
- $search_mboxes = $mboxes_array;
- else
- $search_mboxes = array($cur_mailbox);
- foreach ($search_mboxes as $cur_mailbox) {
- sqimap_mailbox_select($imapConnection, $cur_mailbox);
- s_debug_dump('SELECT',$cur_mailbox);
- if (isset($mbox_msgs[$cur_mailbox])) {
- if ($cur_biop == 'OR') /* Merge with previous results */
- $mbox_msgs[$cur_mailbox] = sqimap_array_merge_unique($mbox_msgs[$cur_mailbox], sqimap_run_search($imapConnection, $search_string, $search_charset));
- else /* Intersect previous results */
- $mbox_msgs[$cur_mailbox] = array_values(array_intersect(sqimap_run_search($imapConnection, $search_string, $search_charset), $mbox_msgs[$cur_mailbox]));
- }
- else /* No previous results */
- $mbox_msgs[$cur_mailbox] = sqimap_run_search($imapConnection, $search_string, $search_charset);
- if (empty($mbox_msgs[$cur_mailbox])) /* Can happen with intersect, and we need at the end a contiguous array */
- unset($mbox_msgs[$cur_mailbox]);
- }
- $cur_mailbox = $next_mailbox;
- $search_string = '';
- }
- if (isset($where_array[$cur_crit])) {
- $criteria = sqimap_asearch_build_criteria($where_array[$cur_crit], $what_array[$cur_crit], $search_charset);
- if (!empty($criteria)) {
- $unop = $unop_array[$cur_crit];
- if (!empty($unop))
- $criteria = $unop . ' ' . $criteria;
- /* We need to infix the next non-excluded criteria's biop if it's the same mailbox */
- $next_biop = '';
- for ($next_crit = $cur_crit+1; $next_crit <= count($where_array); $next_crit++) {
- if (empty($exclude_array[$next_crit])) {
- if (asearch_nz($mailbox_array[$next_crit]) == $cur_mailbox)
- $next_biop = asearch_nz($biop_array[$next_crit]);
- break;
- }
- }
- if ($next_biop == 'OR')
- $criteria = $next_biop . ' ' . $criteria;
- $search_string .= $criteria;
- $cur_biop = asearch_nz($biop_array[$cur_crit]);
- }
- }
- }
- }
- return $mbox_msgs;
+ $search_charset = sqimap_asearch_get_charset();
+ $mbox_search = array();
+ $search_string = '';
+ $cur_mailbox = $mailbox_array[0];
+ $cur_biop = ''; /* Start with ALL */
+ /* We loop one more time than the real array count, so the last search gets fired */
+ for ($cur_crit=0,$iCnt=count($where_array); $cur_crit <= $iCnt; ++$cur_crit) {
+ if (empty($exclude_array[$cur_crit])) {
+ $next_mailbox = (isset($mailbox_array[$cur_crit])) ? $mailbox_array[$cur_crit] : false;
+ if ($next_mailbox != $cur_mailbox) {
+ $search_string = trim($search_string); /* Trim out last space */
+ if ($cur_mailbox == 'All Folders')
+ $search_mboxes = $mboxes_array;
+ else if ((!empty($sub_array[$cur_crit - 1])) || (!in_array($cur_mailbox, $mboxes_array)))
+ $search_mboxes = sqimap_asearch_get_sub_mailboxes($cur_mailbox, $mboxes_array);
+ else
+ $search_mboxes = array($cur_mailbox);
+ foreach ($search_mboxes as $cur_mailbox) {
+ if (isset($mbox_search[$cur_mailbox])) {
+ $mbox_search[$cur_mailbox]['search'] .= ' ' . $search_string;
+ } else {
+ $mbox_search[$cur_mailbox]['search'] = $search_string;
+ }
+ $mbox_search[$cur_mailbox]['charset'] = $search_charset;
+ }
+ $cur_mailbox = $next_mailbox;
+ $search_string = '';
+ }
+ if (isset($where_array[$cur_crit]) && empty($exclude_array[$cur_crit])) {
+ for ($crit = $cur_crit; $crit < count($where_array); $crit++) {
+ $criteria = trim(sqimap_asearch_build_criteria($where_array[$crit], $what_array[$crit], $search_charset));
+ if (!empty($criteria) && empty($exclude_array[$crit])) {
+ if (asearch_nz($mailbox_array[$crit]) == $cur_mailbox) {
+ $unop = $unop_array[$crit];
+ if (!empty($unop)) {
+ $criteria = $unop . ' ' . $criteria;
+ }
+ $aCriteria[] = array($biop_array[$crit], $criteria);
+ }
+ }
+ // unset something
+ $exclude_array[$crit] = true;
+ }
+ $aSearch = array();
+ for($i=0,$iCnt=count($aCriteria);$i<$iCnt;++$i) {
+ $cur_biop = $aCriteria[$i][0];
+ $next_biop = (isset($aCriteria[$i+1][0])) ? $aCriteria[$i+1][0] : false;
+ if ($next_biop != $cur_biop && $next_biop == 'OR') {
+ $aSearch[] = 'OR '.$aCriteria[$i][1];
+ } else if ($cur_biop != 'OR') {
+ $aSearch[] = 'ALL '.$aCriteria[$i][1];
+ } else { // OR only supports 2 search keys so we need to create a parenthesized list
+ $prev_biop = (isset($aCriteria[$i-1][0])) ? $aCriteria[$i-1][0] : false;
+ if ($prev_biop == $cur_biop) {
+ $last = $aSearch[$i-1];
+ if (!substr($last,-1) == ')') {
+ $aSearch[$i-1] = "(OR $last";
+ $aSearch[] = $aCriteria[$i][1].')';
+ } else {
+ $sEnd = '';
+ while ($last && substr($last,-1) == ')') {
+ $last = substr($last,0,-1);
+ $sEnd .= ')';
+ }
+ $aSearch[$i-1] = "(OR $last";
+ $aSearch[] = $aCriteria[$i][1].$sEnd.')';
+ }
+ } else {
+ $aSearch[] = $aCriteria[$i][1];
+ }
+ }
+ }
+ $search_string .= implode(' ',$aSearch);
+ }
+ }
+ }
+ return ($mbox_search);