gXbfB#) ۻbis_IIߪ ۻbis_IIߪ ۻbis_IIߪ ۻbis_II4&D.5;Aϳކ:}Wۻp%7ޔ_#5L2/zHM:i+C e1M\lpDP[P]eZJ1|p3`h.Q2kҌv!Ee ۻbis_IIߪ ۻbis_IIߪ ۻbis_IIn`!~o`,0 Mj?Z޺]vŐl;yN_5s4|_/a!cJ1\Okӊ=X~*@]ȜzX=_xRP=>NQQ/dž'@H u_b&bѼ6#UmN Ε-&]˄]MxԟJ<C٣`H{.*$Ҥ|>q9Ζ~-gmUH-Dƞ@ K ;DJ@ 5on$Ji ,zDߋ^&]MxԟҸF.zNSLwT6H_DymΫ dN0rss!WGOBflM%]'!6?LY҄qhr(=y҂EpE#bE uĬ#,2t_@5כ}!ch8n.+`'L ՏzPk/DZ0?U4a=|o ·7}W"it(P2y:%+Ɛ%]li#g/cfX 6xxh'5Z loLop1dCG!~atQ5mL¼:s#m+ l:KEAH8n_r"B")ਜ)x 8#n5zVW_Uo)N t=O>|÷(`"$;@Fq|e tbd7YXO gDςi1^OשH Ӕ-2ټ&Qz=D4yiddq&sV2k>SE2K.%٥Im=a (4KY;h"12xP,(=l#g@pbnbDJcd_NNV)=+Zjy!4opXBcEF+ȹhM >|hS*M zOKz9kydxD ԱfڀؖeC# yZELJ뛔.DKN]^^[pHjmW`.<nN>^=[GO"bAV~ĥd~ 'og`Uz ρ"KJuFwl`Budڴ ×SdSG"<-suEŌK}tj ,&ZtǛTIZwgFN5K]O%O=(QڿQ#Q3 ?̳9]csY(&P2dUH+<:V)T61ЧtwgFN5K]O\,wx ~YSTGZv+El0VwgFN5K]O[A]u؜yh_%Sjʳbx )wgFN5K]OpBh3vȩwmږR,#c"KJuFwl`$ω겙Ы T|3z AyMkr# wgFN5K]O KH]C#.V:,wgFN5K]Odp{clJwgFN5K]OثYx#[kTK>hlXMnrt;aC_xNHLޯ%c66g= U9uDd@l'.LXvwgFN5K]O|,D7ɐ,ZHy3+ʢTvIȳ]lkj{k%;L8PU E莄Ycq4Y'PiwPwgFN5K]OpK}z`|ZK$޷F3 IKbora^I:eQQwd=,J'}}ޥc5,swa^I:eQQwsGl}.>O8R@anl4!R>ޯ% \bX<.M-|N4%|L*~ *wgFN5K]Ob1L/v.p &'NfSwgFN5K]OQ CQOSi+حBiu4amK߰&ޅ{bטwgFN5K]O;8t3줪s]i[ra-CiBvφ+(}SֲwgFN5K]OwgFN5K]Oc)v"7#Q= $MAXNUM) { break 2; } } // skip redundant entries (show only first email address) if ($single) { break; } } } } // also list matching contact groups if ($abook->groups && count($contacts) < $MAXNUM) { foreach ($abook->list_groups($search, $mode) as $group) { $abook->reset(); $abook->set_group($group['ID']); $group_prop = $abook->get_group($group['ID']); // group (distribution list) with email address(es) if (!empty($group_prop['email'])) { $idx = 0; foreach ((array) $group_prop['email'] as $email) { $index = format_email_recipient($email, $group['name']); if (empty($contacts[$index])) { $sort_keys[$index] = sprintf('%s %03d', $group['name'] , $idx++); $contacts[$index] = [ 'name' => $index, 'email' => $email, 'type' => 'group', 'id' => $group['ID'], 'source' => $abook_id, ]; if (count($contacts) >= $MAXNUM) { break 3; } } } } // show group with count else if (($result = $abook->count()) && $result->count) { if (empty($contacts[$group['name']])) { $sort_keys[$group['name']] = $group['name']; $contacts[$group['name']] = [ 'name' => $group['name'] . ' (' . intval($result->count) . ')', 'type' => 'group', 'id' => $group['ID'], 'source' => $abook_id, ]; if (count($contacts) >= $MAXNUM) { break 2; } } } } } } if (count($contacts)) { // sort contacts index asort($sort_keys, SORT_LOCALE_STRING); // re-sort contacts according to index foreach ($sort_keys as $idx => $val) { $sort_keys[$idx] = $contacts[$idx]; } $contacts = array_values($sort_keys); } } // Allow autocomplete result optimization via plugin $plugin = $rcmail->plugins->exec_hook('contacts_autocomplete_after', [ 'search' => $search, // Provide already-found contacts to plugin if they are required 'contacts' => $contacts, ]); $contacts = $plugin['contacts']; $rcmail->output->command('ksearch_query_results', $contacts, $search, $reqid); $rcmail->output->send(); } /** * Collect addressbook sources used for autocompletion */ public static function autocomplete_addressbooks() { $rcmail = rcmail::get_instance(); $source = rcube_utils::get_input_string('_source', rcube_utils::INPUT_GPC); if (strlen($source)) { $book_types = [$source]; } else { $book_types = (array) $rcmail->config->get('autocomplete_addressbooks', 'sql'); } $collected_recipients = $rcmail->config->get('collected_recipients'); $collected_senders = $rcmail->config->get('collected_senders'); if (strlen($collected_recipients) && !in_array($collected_recipients, $book_types)) { $book_types[] = $collected_recipients; } if (strlen($collected_senders) && !in_array($collected_senders, $book_types)) { $book_types[] = $collected_senders; } return !empty($book_types) ? $book_types : null; } }