/**
  * Searches IMAP (and POP3?) accounts/folders for emails with qualifying criteria
  */
 function search($ieId, $subject = '', $from = '', $to = '', $body = '', $dateFrom = '', $dateTo = '')
 {
     global $current_user;
     global $app_strings;
     global $timedate;
     $beans = array();
     $bean = new InboundEmail();
     $bean->retrieve($ieId);
     $beans[] = $bean;
     //$beans = $this->retrieveAllByGroupId($current_user->id, true);
     $subject = urldecode($subject);
     $criteria = "";
     $criteria .= !empty($subject) ? 'SUBJECT ' . from_html($subject) . '' : "";
     $criteria .= !empty($from) ? ' FROM "' . $from . '"' : "";
     $criteria .= !empty($to) ? ' FROM "' . $to . '"' : "";
     $criteria .= !empty($body) ? ' TEXT "' . $body . '"' : "";
     $criteria .= !empty($dateFrom) ? ' SINCE "' . $timedate->fromString($dateFrom)->format('d-M-Y') . '"' : "";
     $criteria .= !empty($dateTo) ? ' BEFORE "' . $timedate->fromString($dateTo)->format('d-M-Y') . '"' : "";
     //$criteria .= (!empty($from)) ? ' FROM "'.$from.'"' : "";
     $showFolders = unserialize(base64_decode($current_user->getPreference('showFolders', 'Emails')));
     $out = array();
     foreach ($beans as $bean) {
         if (!in_array($bean->id, $showFolders)) {
             continue;
         }
         $GLOBALS['log']->info("*** INBOUNDEMAIL: searching [ {$bean->name} ] for [ {$subject}{$from}{$to}{$body}{$dateFrom}{$dateTo} ]");
         $group = !$bean->is_personal ? 'group.' : '';
         $bean->connectMailServer();
         $mailboxes = $bean->getMailboxes(true);
         if (!in_array('INBOX', $mailboxes)) {
             $mailboxes[] = 'INBOX';
         }
         $totalHits = 0;
         foreach ($mailboxes as $mbox) {
             $bean->mailbox = $mbox;
             $searchOverviews = array();
             if ($bean->protocol == 'pop3') {
                 $pop3Criteria = "SELECT * FROM email_cache WHERE ie_id = '{$bean->id}' AND mbox = '{$mbox}'";
                 $pop3Criteria .= !empty($subject) ? ' AND subject like "%' . $bean->db->quote($subject) . '%"' : "";
                 $pop3Criteria .= !empty($from) ? ' AND fromaddr like "%' . $from . '%"' : "";
                 $pop3Criteria .= !empty($to) ? ' AND toaddr like "%' . $to . '%"' : "";
                 $pop3Criteria .= !empty($dateFrom) ? ' AND senddate > "' . $dateFrom . '"' : "";
                 $pop3Criteria .= !empty($dateTo) ? ' AND senddate < "' . $dateTo . '"' : "";
                 $GLOBALS['log']->info("*** INBOUNDEMAIL: searching [ {$mbox} ] using criteria [ {$pop3Criteria} ]");
                 $r = $bean->db->query($pop3Criteria);
                 while ($a = $bean->db->fetchByAssoc($r)) {
                     $overview = new Overview();
                     foreach ($a as $k => $v) {
                         $k = strtolower($k);
                         switch ($k) {
                             case "imap_uid":
                                 $overview->imap_uid = $v;
                                 $overview->uid = $a['message_id'];
                                 break;
                             case "toaddr":
                                 $overview->to = from_html($v);
                                 break;
                             case "fromaddr":
                                 $overview->from = from_html($v);
                                 break;
                             case "mailsize":
                                 $overview->size = $v;
                                 break;
                             case "senddate":
                                 $overview->date = $timedate->fromString($v)->format('r');
                                 break;
                             default:
                                 $overview->{$k} = from_html($v);
                                 break;
                         }
                         // sqitch
                     }
                     // foreach
                     $searchOverviews[] = $overview;
                 }
                 // while
             } else {
                 $bean->connectMailServer();
                 $searchResult = imap_search($bean->conn, $criteria, SE_UID);
                 if (!empty($searchResult)) {
                     $searchOverviews = imap_fetch_overview($bean->conn, implode(',', $searchResult), FT_UID);
                 }
                 // if
             }
             // else
             $numHits = count($searchOverviews);
             if ($numHits > 0) {
                 $totalHits = $totalHits + $numHits;
                 $ret = $bean->sortFetchedOverview($searchOverviews, 'date', 'desc', true);
                 $mbox = "{$bean->id}.SEARCH";
                 $out = array_merge($out, $bean->displayFetchedSortedListXML($ret, $mbox, false));
             }
         }
     }
     $metadata = array();
     $metadata['mbox'] = $app_strings['LBL_EMAIL_SEARCH_RESULTS_TITLE'];
     $metadata['ieId'] = $this->id;
     $metadata['name'] = $this->name;
     $metadata['unreadChecked'] = $current_user->getPreference('showUnreadOnly', 'Emails') == 1 ? 'CHECKED' : '';
     $metadata['out'] = $out;
     return $metadata;
 }
 public function testdisplayFetchedSortedListXML()
 {
     $inboundEmail = new InboundEmail();
     //get the cache values array first
     $inboundEmail->id = 1;
     $ret = $inboundEmail->getCacheValue('INBOX');
     //use the cache values array as parameter and verify that it returns an array
     $result = $inboundEmail->displayFetchedSortedListXML($ret, 'INBOX');
     $this->assertTrue(is_array($result));
 }