From e1c8fe5c4a0f30cd36069e3460ac937282fb8e1a Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Wed, 25 Feb 2015 09:45:57 -0500
Subject: [PATCH] Fix duplicate entries supression in autocomplete result (#1490290)

---
 program/steps/mail/autocomplete.inc |   52 ++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/program/steps/mail/autocomplete.inc b/program/steps/mail/autocomplete.inc
index 71b337a..38501eb 100644
--- a/program/steps/mail/autocomplete.inc
+++ b/program/steps/mail/autocomplete.inc
@@ -88,10 +88,18 @@
                         continue;
                     }
 
+                    $index = $contact;
+
                     // skip duplicates
-                    if (!in_array($contact, $contacts)) {
-                        $contacts[]  = array('name' => $contact, 'type' => $sql_arr['_type']);
-                        $sort_keys[] = sprintf('%s %03d', $sql_arr['name'] , $idx++);
+                    if (empty($contacts[$index])) {
+                        $contact = array('name' => $contact, 'type' => $sql_arr['_type']);
+
+                        if (($display = rcube_addressbook::compose_search_name($sql_arr, $email, $name)) && $display != $contact['name']) {
+                            $contact['display'] = $display;
+                        }
+
+                        $contacts[$index]  = $contact;
+                        $sort_keys[$index] = sprintf('%s %03d', $contact['display'] ?: $name, $idx++);
 
                         if (count($contacts) >= $MAXNUM) {
                             break 2;
@@ -118,26 +126,38 @@
                 if ($group_prop['email']) {
                     $idx = 0;
                     foreach ((array)$group_prop['email'] as $email) {
-                        $contacts[]  = array('name' => format_email_recipient($email, $group['name']), 'type' => 'group');
-                        $sort_keys[] = sprintf('%s %03d', $group['name'] , $idx++);
+                        $index = format_email_recipient($email, $group['name']);
 
-                        if (count($contacts) >= $MAXNUM) {
-                            break 2;
+                        if (empty($contacts[$index])) {
+                            $sort_keys[$index] = sprintf('%s %03d', $group['name'] , $idx++);
+                            $contacts[$index]  = array(
+                                'name'   => $index,
+                                'email'  => $email,
+                                'type'   => 'group',
+                                'id'     => $group['ID'],
+                                'source' => $id,
+                            );
+
+                            if (count($contacts) >= $MAXNUM) {
+                                break 2;
+                            }
                         }
                     }
                 }
                 // show group with count
                 else if (($result = $abook->count()) && $result->count) {
-                    $sort_keys[] = $group['name'];
-                    $contacts[]  = array(
-                        'name'   => $group['name'] . ' (' . intval($result->count) . ')',
-                        'type'   => 'group',
-                        'id'     => $group['ID'],
-                        'source' => $id
-                    );
+                    if (empty($contacts[$group['name']])) {
+                        $sort_keys[$group['name']] = $group['name'];
+                        $contacts[$group['name']]  = array(
+                            'name'   => $group['name'] . ' (' . intval($result->count) . ')',
+                            'type'   => 'group',
+                            'id'     => $group['ID'],
+                            'source' => $id
+                        );
 
-                    if (count($contacts) >= $MAXNUM) {
-                        break;
+                        if (count($contacts) >= $MAXNUM) {
+                            break;
+                        }
                     }
                 }
             }

--
Gitblit v1.9.1