+/**
+ * Create the search query strings for all given criteria and merge results for every mailbox
+ * @param resource $imapConnection
+ * @param array $mailbox_array (reference)
+ * @param array $biop_array (reference)
+ * @param array $unop_array (reference)
+ * @param array $where_array (reference)
+ * @param array $what_array (reference)
+ * @param array $exclude_array (reference)
+ * @param array $sub_array (reference)
+ * @param array $mboxes_array selectable unformatted mailboxes names (reference)
+ * @return array array(mailbox => array(UIDs))
+ */
+function sqimap_asearch($imapConnection, &$mailbox_array, &$biop_array, &$unop_array, &$where_array, &$what_array, &$exclude_array, &$sub_array, &$mboxes_array)
+{
+
+ $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])) {
+ $aCriteria = array();
+ 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);
+}