+ $tot = $group_count+$contact_count;
+
+ $groups = array();
+ $contacts = array();
+
+ if ($type=='' || $type=='g'){
+
+ $r = q("SELECT `group`.`id`, `group`.`name`, GROUP_CONCAT(DISTINCT `group_member`.`contact-id` SEPARATOR ',') as uids
+ FROM `group`,`group_member`
+ WHERE `group`.`deleted` = 0 AND `group`.`uid` = %d
+ AND `group_member`.`gid`=`group`.`id`
+ $sql_extra
+ GROUP BY `group`.`id`
+ ORDER BY `group`.`name`
+ LIMIT %d,%d",
+ intval(local_user()),
+ intval($start),
+ intval($count)
+ );
+
+ foreach($r as $g){
+// logger('acl: group: ' . $g['name'] . ' members: ' . $g['uids']);
+ $groups[] = array(
+ "type" => "g",
+ "photo" => "images/twopeople.png",
+ "name" => $g['name'],
+ "id" => intval($g['id']),
+ "uids" => array_map("intval", explode(",",$g['uids'])),
+ "link" => '',
+ "forum" => '0'
+ );
+ }
+ }
+
+ if ($type=='' || $type=='c'){
+
+ $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, forum FROM `contact`
+ WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
+ $sql_extra2
+ ORDER BY `name` ASC ",
+ intval(local_user())
+ );
+ }
+ elseif($type == 'm') {
+ $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag` FROM `contact`
+ WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0
+ AND `network` IN ('%s','%s','%s')
+ $sql_extra2
+ ORDER BY `name` ASC ",
+ intval(local_user()),
+ dbesc(NETWORK_DFRN),
+ dbesc(NETWORK_ZOT),
+ dbesc(NETWORK_DIASPORA)
+ );
+ }
+ elseif($type == 'a') {
+ $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag` FROM `contact`
+ WHERE `uid` = %d AND `pending` = 0
+ $sql_extra2
+ ORDER BY `name` ASC ",
+ intval(local_user())
+ );
+ }
+ else
+ $r = array();
+
+
+ if($type == 'm' || $type == 'a') {
+ $x = array();
+ $x['query'] = $search;
+ $x['photos'] = array();
+ $x['links'] = array();
+ $x['suggestions'] = array();
+ $x['data'] = array();
+ if(count($r)) {
+ foreach($r as $g) {
+ $x['photos'][] = $g['micro'];
+ $x['links'][] = $g['url'];
+ $x['suggestions'][] = $g['name'];
+ $x['data'][] = intval($g['id']);
+ }
+ }
+ echo json_encode($x);
+ killme();
+ }
+
+ if(count($r)) {
+ foreach($r as $g){
+ $contacts[] = array(
+ "type" => "c",
+ "photo" => $g['micro'],
+ "name" => $g['name'],
+ "id" => intval($g['id']),
+ "network" => $g['network'],
+ "link" => $g['url'],
+ "nick" => ($g['attag']) ? $g['attag'] : $g['nick'],
+ "forum" => $g['forum']
+ );
+ }
+ }
+
+ $items = array_merge($groups, $contacts);
+
+ if ($conv_id) {
+ /* if $conv_id is set, get unknow contacts in thread */
+ /* but first get know contacts url to filter them out */
+ function _contact_link($i){ return dbesc($i['link']); }
+ $known_contacts = array_map(_contact_link, $contacts);
+ $unknow_contacts=array();
+ $r = q("select
+ `author-avatar`,`author-name`,`author-link`
+ from item where parent=%d
+ and (
+ `author-name` LIKE '%%%s%%' OR
+ `author-link` LIKE '%%%s%%'
+ ) and
+ `author-link` NOT IN ('%s')
+ GROUP BY `author-link`
+ ORDER BY `author-name` ASC
+ ",
+ intval($conv_id),
+ dbesc($search),
+ dbesc($search),
+ implode("','", $known_contacts)
+ );
+ if (is_array($r) && count($r)){
+ foreach($r as $row) {
+ // nickname..
+ $up = parse_url($row['author-link']);
+ $nick = explode("/",$up['path']);
+ $nick = $nick[count($nick)-1];
+ $nick .= "@".$up['host'];
+ // /nickname
+ $unknow_contacts[] = array(
+ "type" => "c",
+ "photo" => $row['author-avatar'],
+ "name" => $row['author-name'],
+ "id" => '',
+ "network" => "unknown",
+ "link" => $row['author-link'],
+ "nick" => $nick,
+ "forum" => false
+ );
+ }
+ }
+
+ $items = array_merge($items, $unknow_contacts);
+ $tot += count($unknow_contacts);
+ }
+
+ if($out_type === 'html') {
+ $o = array(
+ 'tot' => $tot,
+ 'start' => $start,
+ 'count' => $count,
+ 'groups' => $groups,
+ 'contacts' => $contacts,
+ );
+ return $o;
+ }
+
+ $o = array(
+ 'tot' => $tot,
+ 'start' => $start,
+ 'count' => $count,
+ 'items' => $items,
+ );
+
+ echo json_encode($o);