]> git.donarmstrong.com Git - roundcube.git/blob - program/steps/mail/search.inc
Imported Upstream version 0.3.1
[roundcube.git] / program / steps / mail / search.inc
1 <?php
2 /*
3  +-----------------------------------------------------------------------+
4  | steps/mail/search.inc                                                 |
5  |                                                                       |
6  | Search functions for rc webmail                                       |
7  | Licensed under the GNU GPL                                            |
8  |                                                                       |
9  +-----------------------------------------------------------------------+
10  | Author: Benjamin Smith <defitro@gmail.com>                            |
11  |         Thomas Bruederli <roundcube@gmail.com>                        |
12  +-----------------------------------------------------------------------+
13
14 */
15
16 $REMOTE_REQUEST = TRUE;
17
18 // reset list_page and old search results
19 $IMAP->set_page(1);
20 $IMAP->set_search_set(NULL);
21 $_SESSION['page'] = 1;
22
23 // using encodeURI with javascript "should" give us
24 // a correctly encoded query string
25 $imap_charset = RCMAIL_CHARSET;
26
27 // get search string
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);
33
34 // add list filter string
35 $search_str = $filter && $filter != 'ALL' ? $filter : '';
36
37 $_SESSION['search_filter'] = $filter;
38
39 // Check the search string for type of search
40 if (preg_match("/^from:.*/i", $str))
41 {
42   list(,$srch) = explode(":", $str);
43   $subject['from'] = "HEADER FROM";
44 }
45 else if (preg_match("/^to:.*/i", $str))
46 {
47   list(,$srch) = explode(":", $str);
48   $subject['to'] = "HEADER TO";
49 }
50 else if (preg_match("/^cc:.*/i", $str))
51 {
52   list(,$srch) = explode(":", $str);
53   $subject['cc'] = "HEADER CC";
54 }
55 else if (preg_match("/^bcc:.*/i", $str))
56 {
57   list(,$srch) = explode(":", $str);
58   $subject['bcc'] = "HEADER BCC";
59 }
60 else if (preg_match("/^subject:.*/i", $str))
61 {
62   list(,$srch) = explode(":", $str);
63   $subject['subject'] = "HEADER SUBJECT";
64 }
65 else if (preg_match("/^body:.*/i", $str))
66 {
67   list(,$srch) = explode(":", $str);
68   $subject['text'] = "TEXT";
69 }
70 else if(trim($str))
71 {
72   if ($headers) {
73     $headers = explode(',', $headers);
74     foreach($headers as $header)
75       switch ($header) {
76         case 'text': $subject['text'] = 'TEXT'; break;
77         default: $subject[$header] = 'HEADER '.$header;
78       }
79   } else {
80     // search in subject by default
81     $subject['subject'] = 'HEADER SUBJECT';
82   }
83 }
84
85 $search = $srch ? trim($srch) : trim($str);
86
87 if ($subject) {
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;
92 }
93
94 $search_str = trim($search_str);
95
96 // execute IMAP search
97 if ($search_str)
98   $result = $IMAP->search($mbox, $search_str, $imap_charset, $_SESSION['sort_col']);
99
100 // Get the headers
101 $result_h = $IMAP->list_headers($mbox, 1, $_SESSION['sort_col'], $_SESSION['sort_order']);
102 $count = $IMAP->messagecount();
103
104 // save search results in session
105 if (!is_array($_SESSION['search']))
106   $_SESSION['search'] = array();
107
108 if ($search_str) {
109   $_SESSION['search'][$search_request] = $IMAP->get_search_set();
110   $_SESSION['last_text_search'] = $str;
111 }
112
113 // Make sure we got the headers
114 if (!empty($result_h))
115 {
116   rcmail_js_message_list($result_h);
117   if ($search_str)
118     $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $count));
119 }
120 else
121 {
122   $OUTPUT->show_message('searchnomatch', 'notice');
123 }
124
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));
130 $OUTPUT->send();
131
132 ?>