/** * 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; }
/** Print the basic search form */ function asearch_print_form_basic($imapConnection, &$boxes, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array) { global $color; //Search Form echo "<br />\n"; echo '<form action="' . asearch_get_href() . '" name="form_asearch">' . "\n"; echo html_tag('table', '', 'center', $color[9], 'width="100%" cellpadding="1" cellspacing="1" border="0"'); //echo html_tag('tr', html_tag('td', asearch_get_title_display($color, _("Search Criteria")), 'center', $color[5], 'colspan=4')); $row_count = count($where_array); for ($row_num = 0; $row_num < $row_count; $row_num++) { $mailbox = asearch_nz($mailbox_array[$row_num]); $biop = strip_tags(asearch_nz($biop_array[$row_num])); $unop = strip_tags(asearch_nz($unop_array[$row_num])); $where = strip_tags(asearch_nz($where_array[$row_num])); $what = asearch_nz($what_array[$row_num]); $exclude = strip_tags(asearch_nz($exclude_array[$row_num])); $sub = strip_tags(asearch_nz($sub_array[$row_num])); asearch_print_form_row_basic($imapConnection, $boxes, $mailbox, $biop, $unop, $where, $what, $exclude, $sub, $row_num); } echo '</table>' . "\n"; echo '</form>' . "\n"; }
/** Print the basic search form * @param stream $imapConnection * @param array $boxes * @param array $mailbox_array * @param array $biop_array * @param array $unop_array * @param array $where_array * @param array $what_array * @param array $exclude_array * @param array $sub_array * @since 1.5.1 * @private */ function asearch_print_form_basic($imapConnection, &$boxes, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array) { global $allow_advanced_search, $search_advanced, $oTemplate, $imap_asearch_unops, $imap_asearch_options; $row_num = 0; $mailbox = asearch_nz($mailbox_array[$row_num]); $biop = strip_tags(asearch_nz($biop_array[$row_num])); $unop = strip_tags(asearch_nz($unop_array[$row_num])); $where = strip_tags(asearch_nz($where_array[$row_num])); $what = asearch_nz($what_array[$row_num]); $exclude = strip_tags(asearch_nz($exclude_array[$row_num])); $sub = strip_tags(asearch_nz($sub_array[$row_num])); # Build the mailbox array $a = array(); if ($mailbox != 'All Folders' && !asearch_mailbox_exists($mailbox, $boxes)) { $a[$mailbox] = '[' . _("Missing") . '] ' . sm_encode_html_special_chars(asearch_get_mailbox_display($mailbox)); } $a['All Folders'] = '[' . asearch_get_mailbox_display('All Folders') . ']'; $a = array_merge($a, sqimap_mailbox_option_array($imapConnection, 0, $boxes, NULL)); if ($allow_advanced_search > 1) { $link = '../src/search.php?advanced=' . ($search_advanced ? 0 : 1); $txt = $search_advanced ? _("Standard Search") : _("Advanced search"); } else { $link = NULL; $txt = NULL; } $oTemplate->assign('allow_advanced_search', $allow_advanced_search > 1); $oTemplate->assign('adv_toggle_text', $txt); $oTemplate->assign('adv_toggle_link', $link); $oTemplate->assign('mailbox_options', $a); $oTemplate->assign('unary_options', $imap_asearch_unops); $oTemplate->assign('where_options', $imap_asearch_options); $oTemplate->assign('mailbox_sel', strtolower(sm_encode_html_special_chars($mailbox))); $oTemplate->assign('unary_sel', $unop); $oTemplate->assign('where_sel', $where); $oTemplate->assign('what_val', $what); echo '<form action="../src/search.php" name="form_asearch">' . "\n" . addHidden('smtoken', sm_generate_security_token()) . "\n"; $oTemplate->display('search.tpl'); echo "</form>\n"; }