3 +-----------------------------------------------------------------------+
4 | steps/mail/search.inc |
6 | Search functions for rc webmail |
7 | Licensed under the GNU GPL |
9 +-----------------------------------------------------------------------+
10 | Author: Benjamin Smith <defitro@gmail.com> |
11 | Thomas Bruederli <roundcube@gmail.com> |
12 +-----------------------------------------------------------------------+
16 $REMOTE_REQUEST = TRUE;
18 // reset list_page and old search results
20 $IMAP->set_search_set(NULL);
21 $_SESSION['page'] = 1;
23 // using encodeURI with javascript "should" give us
24 // a correctly encoded query string
25 $imap_charset = RCMAIL_CHARSET;
28 $str = get_input_value('_q', RCUBE_INPUT_GET);
29 $filter = get_input_value('_filter', RCUBE_INPUT_GET);
30 $mbox = get_input_value('_mbox', RCUBE_INPUT_GET);
31 $headers = get_input_value('_headers', RCUBE_INPUT_GET);
32 $search_request = md5($mbox.$filter.$str);
34 // add list filter string
35 $search_str = $filter && $filter != 'ALL' ? $filter : '';
37 $_SESSION['search_filter'] = $filter;
39 // Check the search string for type of search
40 if (preg_match("/^from:.*/i", $str))
42 list(,$srch) = explode(":", $str);
43 $subject['from'] = "HEADER FROM";
45 else if (preg_match("/^to:.*/i", $str))
47 list(,$srch) = explode(":", $str);
48 $subject['to'] = "HEADER TO";
50 else if (preg_match("/^cc:.*/i", $str))
52 list(,$srch) = explode(":", $str);
53 $subject['cc'] = "HEADER CC";
55 else if (preg_match("/^bcc:.*/i", $str))
57 list(,$srch) = explode(":", $str);
58 $subject['bcc'] = "HEADER BCC";
60 else if (preg_match("/^subject:.*/i", $str))
62 list(,$srch) = explode(":", $str);
63 $subject['subject'] = "HEADER SUBJECT";
65 else if (preg_match("/^body:.*/i", $str))
67 list(,$srch) = explode(":", $str);
68 $subject['text'] = "TEXT";
73 $headers = explode(',', $headers);
74 foreach($headers as $header)
76 case 'text': $subject['text'] = 'TEXT'; break;
77 default: $subject[$header] = 'HEADER '.$header;
80 // search in subject by default
81 $subject['subject'] = 'HEADER SUBJECT';
85 $search = $srch ? trim($srch) : trim($str);
88 $search_str .= str_repeat(' OR', count($subject)-1);
89 foreach ($subject as $sub)
90 $search_str .= sprintf(" %s {%d}\r\n%s", $sub, strlen($search), $search);
91 $_SESSION['search_mods'] = $subject;
94 $search_str = trim($search_str);
96 // execute IMAP search
98 $result = $IMAP->search($mbox, $search_str, $imap_charset, $_SESSION['sort_col']);
101 $result_h = $IMAP->list_headers($mbox, 1, $_SESSION['sort_col'], $_SESSION['sort_order']);
102 $count = $IMAP->messagecount();
104 // save search results in session
105 if (!is_array($_SESSION['search']))
106 $_SESSION['search'] = array();
109 $_SESSION['search'][$search_request] = $IMAP->get_search_set();
110 $_SESSION['last_text_search'] = $str;
113 // Make sure we got the headers
114 if (!empty($result_h))
116 rcmail_js_message_list($result_h);
118 $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $count));
122 $OUTPUT->show_message('searchnomatch', 'notice');
125 // update message count display
126 $OUTPUT->set_env('search_request', $search_str ? $search_request : -1);
127 $OUTPUT->set_env('messagecount', $count);
128 $OUTPUT->set_env('pagecount', ceil($count/$IMAP->page_size));
129 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count, 1));