Пример #1
0
function networks_widget($baseurl, $selected = '')
{
    $a = get_app();
    if (!local_user()) {
        return '';
    }
    if (!feature_enabled(local_user(), 'networks')) {
        return '';
    }
    $extra_sql = unavailable_networks();
    $r = q("SELECT DISTINCT(`network`) FROM `contact` WHERE `uid` = %d AND NOT `self` {$extra_sql} ORDER BY `network`", intval(local_user()));
    $nets = array();
    if (count($r)) {
        require_once 'include/contact_selectors.php';
        foreach ($r as $rr) {
            if ($rr['network']) {
                $nets[] = array('ref' => $rr['network'], 'name' => network_to_name($rr['network']), 'selected' => $selected == $rr['network'] ? 'selected' : '');
            }
        }
    }
    if (count($nets) < 2) {
        return '';
    }
    return replace_macros(get_markup_template('nets.tpl'), array('$title' => t('Networks'), '$desc' => '', '$sel_all' => $selected == '' ? 'selected' : '', '$all' => t('All Networks'), '$nets' => $nets, '$base' => $baseurl));
}
Пример #2
0
function contacts_content(&$a)
{
    $sort_type = 0;
    $o = '';
    nav_set_selected('contacts');
    if (!local_user()) {
        notice(t('Permission denied.') . EOL);
        return;
    }
    if ($a->argc == 3) {
        $contact_id = intval($a->argv[1]);
        if (!$contact_id) {
            return;
        }
        $cmd = $a->argv[2];
        $orig_record = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d AND `self` = 0 LIMIT 1", intval($contact_id), intval(local_user()));
        if (!count($orig_record)) {
            notice(t('Could not access contact record.') . EOL);
            goaway($a->get_baseurl(true) . '/contacts');
            return;
            // NOTREACHED
        }
        if ($cmd === 'update') {
            _contact_update($contact_id);
            goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
            // NOTREACHED
        }
        if ($cmd === 'updateprofile') {
            _contact_update_profile($contact_id);
            goaway($a->get_baseurl(true) . '/crepair/' . $contact_id);
            // NOTREACHED
        }
        if ($cmd === 'block') {
            $r = _contact_block($contact_id, $orig_record[0]);
            if ($r) {
                $blocked = $orig_record[0]['blocked'] ? 0 : 1;
                info(($blocked ? t('Contact has been blocked') : t('Contact has been unblocked')) . EOL);
            }
            goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
            return;
            // NOTREACHED
        }
        if ($cmd === 'ignore') {
            $r = _contact_ignore($contact_id, $orig_record[0]);
            if ($r) {
                $readonly = $orig_record[0]['readonly'] ? 0 : 1;
                info(($readonly ? t('Contact has been ignored') : t('Contact has been unignored')) . EOL);
            }
            goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
            return;
            // NOTREACHED
        }
        if ($cmd === 'archive') {
            $r = _contact_archive($contact_id, $orig_record[0]);
            if ($r) {
                $archived = $orig_record[0]['archive'] ? 0 : 1;
                info(($archived ? t('Contact has been archived') : t('Contact has been unarchived')) . EOL);
            }
            goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
            return;
            // NOTREACHED
        }
        if ($cmd === 'drop') {
            // Check if we should do HTML-based delete confirmation
            if ($_REQUEST['confirm']) {
                // <form> can't take arguments in its "action" parameter
                // so add any arguments as hidden inputs
                $query = explode_querystring($a->query_string);
                $inputs = array();
                foreach ($query['args'] as $arg) {
                    if (strpos($arg, 'confirm=') === false) {
                        $arg_parts = explode('=', $arg);
                        $inputs[] = array('name' => $arg_parts[0], 'value' => $arg_parts[1]);
                    }
                }
                $a->page['aside'] = '';
                return replace_macros(get_markup_template('contact_drop_confirm.tpl'), array('$contact' => _contact_detail_for_template($orig_record[0]), '$method' => 'get', '$message' => t('Do you really want to delete this contact?'), '$extra_inputs' => $inputs, '$confirm' => t('Yes'), '$confirm_url' => $query['base'], '$confirm_name' => 'confirmed', '$cancel' => t('Cancel')));
            }
            // Now check how the user responded to the confirmation query
            if ($_REQUEST['canceled']) {
                if (x($_SESSION, 'return_url')) {
                    goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
                } else {
                    goaway($a->get_baseurl(true) . '/contacts');
                }
            }
            _contact_drop($contact_id, $orig_record[0]);
            info(t('Contact has been removed.') . EOL);
            if (x($_SESSION, 'return_url')) {
                goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
            } else {
                goaway($a->get_baseurl(true) . '/contacts');
            }
            return;
            // NOTREACHED
        }
        if ($cmd === 'posts') {
            return contact_posts($a, $contact_id);
        }
    }
    $_SESSION['return_url'] = $a->query_string;
    if (x($a->data, 'contact') && is_array($a->data['contact'])) {
        $contact_id = $a->data['contact']['id'];
        $contact = $a->data['contact'];
        $editselect = 'none';
        if (feature_enabled(local_user(), 'richtext')) {
            $editselect = 'exact';
        }
        $a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), array('$baseurl' => $a->get_baseurl(true), '$editselect' => $editselect));
        $a->page['end'] .= replace_macros(get_markup_template('contact_end.tpl'), array('$baseurl' => $a->get_baseurl(true), '$editselect' => $editselect));
        require_once 'include/contact_selectors.php';
        $tpl = get_markup_template("contact_edit.tpl");
        switch ($contact['rel']) {
            case CONTACT_IS_FRIEND:
                $dir_icon = 'images/lrarrow.gif';
                $relation_text = t('You are mutual friends with %s');
                break;
            case CONTACT_IS_FOLLOWER:
                $dir_icon = 'images/larrow.gif';
                $relation_text = t('You are sharing with %s');
                break;
            case CONTACT_IS_SHARING:
                $dir_icon = 'images/rarrow.gif';
                $relation_text = t('%s is sharing with you');
                break;
            default:
                break;
        }
        if (!in_array($contact['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA))) {
            $relation_text = "";
        }
        $relation_text = sprintf($relation_text, htmlentities($contact['name']));
        if ($contact['network'] === NETWORK_DFRN && $contact['rel']) {
            $url = "redir/{$contact['id']}";
            $sparkle = ' class="sparkle" ';
        } else {
            $url = $contact['url'];
            $sparkle = '';
        }
        $insecure = t('Private communications are not available for this contact.');
        $last_update = $contact['last-update'] == '0000-00-00 00:00:00' ? t('Never') : datetime_convert('UTC', date_default_timezone_get(), $contact['last-update'], 'D, j M Y, g:i A');
        if ($contact['last-update'] !== '0000-00-00 00:00:00') {
            $last_update .= ' ' . ($contact['last-update'] <= $contact['success_update'] ? t("(Update was successful)") : t("(Update was not successful)"));
        }
        $lblsuggest = $contact['network'] === NETWORK_DFRN ? t('Suggest friends') : '';
        $poll_enabled = in_array($contact['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_FEED, NETWORK_MAIL, NETWORK_MAIL2));
        $nettype = sprintf(t('Network type: %s'), network_to_name($contact['network'], $contact["url"]));
        //$common = count_common_friends(local_user(),$contact['id']);
        //$common_text = (($common) ? sprintf( tt('%d contact in common','%d contacts in common', $common),$common) : '');
        $polling = $contact['network'] === NETWORK_MAIL | $contact['network'] === NETWORK_FEED ? 'polling' : '';
        //$x = count_all_friends(local_user(), $contact['id']);
        //$all_friends = (($x) ? t('View all contacts') : '');
        // tabs
        $tab_str = contacts_tab($a, $contact_id, 2);
        $lost_contact = $contact['archive'] && $contact['term-date'] != '0000-00-00 00:00:00' && $contact['term-date'] < datetime_convert('', '', 'now') ? t('Communications lost with this contact!') : '';
        if ($contact['network'] == NETWORK_FEED) {
            $fetch_further_information = array('fetch_further_information', t('Fetch further information for feeds'), $contact['fetch_further_information'], t('Fetch further information for feeds'), array('0' => t('Disabled'), '1' => t('Fetch information'), '2' => t('Fetch information and keywords')));
        }
        if (in_array($contact['network'], array(NETWORK_FEED, NETWORK_MAIL, NETWORK_MAIL2))) {
            $poll_interval = contact_poll_interval($contact['priority'], !$poll_enabled);
        }
        if ($contact['network'] == NETWORK_DFRN) {
            $profile_select = contact_profile_assign($contact['profile-id'], $contact['network'] !== NETWORK_DFRN ? true : false);
        }
        if (in_array($contact['network'], array(NETWORK_DIASPORA, NETWORK_OSTATUS)) and $contact['rel'] == CONTACT_IS_FOLLOWER) {
            $follow = $a->get_baseurl(true) . "/follow?url=" . urlencode($contact["url"]);
        }
        $o .= replace_macros($tpl, array('$tab_str' => $tab_str, '$submit' => t('Submit'), '$lbl_vis1' => t('Profile Visibility'), '$lbl_vis2' => sprintf(t('Please choose the profile you would like to display to %s when viewing your profile securely.'), $contact['name']), '$lbl_info1' => t('Contact Information / Notes'), '$infedit' => t('Edit contact notes'), '$common_text' => $common_text, '$common_link' => $a->get_baseurl(true) . '/common/loc/' . local_user() . '/' . $contact['id'], '$all_friends' => $all_friends, '$relation_text' => $relation_text, '$visit' => sprintf(t('Visit %s\'s profile [%s]'), $contact['name'], $contact['url']), '$blockunblock' => t('Block/Unblock contact'), '$ignorecont' => t('Ignore contact'), '$lblcrepair' => t("Repair URL settings"), '$lblrecent' => t('View conversations'), '$lblsuggest' => $lblsuggest, '$delete' => t('Delete contact'), '$nettype' => $nettype, '$poll_interval' => $poll_interval, '$poll_enabled' => $poll_enabled, '$lastupdtext' => t('Last update:'), '$lost_contact' => $lost_contact, '$updpub' => t('Update public posts'), '$last_update' => $last_update, '$udnow' => t('Update now'), '$follow' => $follow, '$follow_text' => t("Connect/Follow"), '$profile_select' => $profile_select, '$contact_id' => $contact['id'], '$block_text' => $contact['blocked'] ? t('Unblock') : t('Block'), '$ignore_text' => $contact['readonly'] ? t('Unignore') : t('Ignore'), '$insecure' => $contact['network'] !== NETWORK_DFRN && $contact['network'] !== NETWORK_MAIL && $contact['network'] !== NETWORK_FACEBOOK && $contact['network'] !== NETWORK_DIASPORA ? $insecure : '', '$info' => $contact['info'], '$blocked' => $contact['blocked'] ? t('Currently blocked') : '', '$ignored' => $contact['readonly'] ? t('Currently ignored') : '', '$archived' => $contact['archive'] ? t('Currently archived') : '', '$hidden' => array('hidden', t('Hide this contact from others'), $contact['hidden'] == 1, t('Replies/likes to your public posts <strong>may</strong> still be visible')), '$notify' => array('notify', t('Notification for new posts'), $contact['notify_new_posts'] == 1, t('Send a notification of every new post of this contact')), '$fetch_further_information' => $fetch_further_information, '$ffi_keyword_blacklist' => $contact['ffi_keyword_blacklist'], '$ffi_keyword_blacklist' => array('ffi_keyword_blacklist', t('Blacklisted keywords'), $contact['ffi_keyword_blacklist'], t('Comma separated list of keywords that should not be converted to hashtags, when "Fetch information and keywords" is selected')), '$photo' => $contact['photo'], '$name' => htmlentities($contact['name']), '$dir_icon' => $dir_icon, '$alt_text' => $alt_text, '$sparkle' => $sparkle, '$url' => $url, '$profileurllabel' => t('Profile URL'), '$profileurl' => $contact['url'], '$location' => bbcode($contact["location"]), '$location_label' => t("Location:"), '$about' => bbcode($contact["about"], false, false), '$about_label' => t("About:"), '$keywords' => $contact["keywords"], '$keywords_label' => t("Tags:")));
        $arr = array('contact' => $contact, 'output' => $o);
        call_hooks('contact_edit', $arr);
        return $arr['output'];
    }
    $blocked = false;
    $hidden = false;
    $ignored = false;
    $all = false;
    if ($a->argc == 2 && $a->argv[1] === 'all') {
        $sql_extra = '';
        $all = true;
    } elseif ($a->argc == 2 && $a->argv[1] === 'blocked') {
        $sql_extra = " AND `blocked` = 1 ";
        $blocked = true;
    } elseif ($a->argc == 2 && $a->argv[1] === 'hidden') {
        $sql_extra = " AND `hidden` = 1 ";
        $hidden = true;
    } elseif ($a->argc == 2 && $a->argv[1] === 'ignored') {
        $sql_extra = " AND `readonly` = 1 ";
        $ignored = true;
    } elseif ($a->argc == 2 && $a->argv[1] === 'archived') {
        $sql_extra = " AND `archive` = 1 ";
        $archived = true;
    } else {
        $sql_extra = " AND `blocked` = 0 ";
    }
    $search = x($_GET, 'search') ? notags(trim($_GET['search'])) : '';
    $nets = x($_GET, 'nets') ? notags(trim($_GET['nets'])) : '';
    $tabs = array(array('label' => t('Suggestions'), 'url' => $a->get_baseurl(true) . '/suggest', 'sel' => '', 'title' => t('Suggest potential friends'), 'id' => 'suggestions-tab', 'accesskey' => 'g'), array('label' => t('All Contacts'), 'url' => $a->get_baseurl(true) . '/contacts/all', 'sel' => $all ? 'active' : '', 'title' => t('Show all contacts'), 'id' => 'showall-tab', 'accesskey' => 'l'), array('label' => t('Unblocked'), 'url' => $a->get_baseurl(true) . '/contacts', 'sel' => !$all && !$blocked && !$hidden && !$search && !$nets && !$ignored && !$archived ? 'active' : '', 'title' => t('Only show unblocked contacts'), 'id' => 'showunblocked-tab', 'accesskey' => 'o'), array('label' => t('Blocked'), 'url' => $a->get_baseurl(true) . '/contacts/blocked', 'sel' => $blocked ? 'active' : '', 'title' => t('Only show blocked contacts'), 'id' => 'showblocked-tab', 'accesskey' => 'b'), array('label' => t('Ignored'), 'url' => $a->get_baseurl(true) . '/contacts/ignored', 'sel' => $ignored ? 'active' : '', 'title' => t('Only show ignored contacts'), 'id' => 'showignored-tab', 'accesskey' => 'i'), array('label' => t('Archived'), 'url' => $a->get_baseurl(true) . '/contacts/archived', 'sel' => $archived ? 'active' : '', 'title' => t('Only show archived contacts'), 'id' => 'showarchived-tab', 'accesskey' => 'y'), array('label' => t('Hidden'), 'url' => $a->get_baseurl(true) . '/contacts/hidden', 'sel' => $hidden ? 'active' : '', 'title' => t('Only show hidden contacts'), 'id' => 'showhidden-tab', 'accesskey' => 'h'));
    $tab_tpl = get_markup_template('common_tabs.tpl');
    $t = replace_macros($tab_tpl, array('$tabs' => $tabs));
    $searching = false;
    if ($search) {
        $search_hdr = $search;
        $search_txt = dbesc(protect_sprintf(preg_quote($search)));
        $searching = true;
    }
    $sql_extra .= $searching ? " AND (name REGEXP '{$search_txt}' OR url REGEXP '{$search_txt}'  OR nick REGEXP '{$search_txt}') " : "";
    if ($nets) {
        $sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets));
    }
    $sql_extra2 = $sort_type > 0 && $sort_type <= CONTACT_IS_FRIEND ? sprintf(" AND `rel` = %d ", intval($sort_type)) : '';
    $r = q("SELECT COUNT(*) AS `total` FROM `contact`\n\t\tWHERE `uid` = %d AND `self` = 0 AND `pending` = 0 {$sql_extra} {$sql_extra2} ", intval($_SESSION['uid']));
    if (count($r)) {
        $a->set_pager_total($r[0]['total']);
        $total = $r[0]['total'];
    }
    $sql_extra3 = unavailable_networks();
    $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `pending` = 0 {$sql_extra} {$sql_extra2} {$sql_extra3} ORDER BY `name` ASC LIMIT %d , %d ", intval($_SESSION['uid']), intval($a->pager['start']), intval($a->pager['itemspage']));
    $contacts = array();
    if (count($r)) {
        foreach ($r as $rr) {
            $contacts[] = _contact_detail_for_template($rr);
        }
    }
    $tpl = get_markup_template("contacts-template.tpl");
    $o .= replace_macros($tpl, array('$baseurl' => z_root(), '$header' => t('Contacts') . ($nets ? ' - ' . network_to_name($nets) : ''), '$tabs' => $t, '$total' => $total, '$search' => $search_hdr, '$desc' => t('Search your contacts'), '$finding' => $searching ? t('Finding: ') . "'" . $search . "'" : "", '$submit' => t('Find'), '$cmd' => $a->cmd, '$contacts' => $contacts, '$contact_drop_confirm' => t('Do you really want to delete this contact?'), 'multiselect' => 1, '$batch_actions' => array('contacts_batch_update' => t('Update'), 'contacts_batch_block' => t('Block') . "/" . t("Unblock"), "contacts_batch_ignore" => t('Ignore') . "/" . t("Unignore"), "contacts_batch_archive" => t('Archive') . "/" . t("Unarchive"), "contacts_batch_drop" => t('Delete')), '$paginate' => paginate($a)));
    return $o;
}
Пример #3
0
/**
 * @brief: Search for contacts
 * 
 * This function search for a users contacts. The code is copied from contact search
 * in /mod/contacts.php. With this function the contacts will permitted to acl_lookup()
 * and can grabbed as json. For this we use the type="r". This is usful to to let js 
 * grab the contact data.
 * We use this to give the data to textcomplete and have a filter function at the
 * contact page.
 * 
 * @param App $a The app data
 * @param array $results The array with the originals from acl_lookup()
 */
function frio_acl_lookup($a, &$results)
{
    require_once "mod/contacts.php";
    $nets = x($_GET, "nets") ? notags(trim($_GET["nets"])) : "";
    // we introduce a new search type, r should do the same query like it's
    // done in /mod/contacts for connections
    if ($results["type"] == "r") {
        $searching = false;
        if ($search) {
            $search_hdr = $search;
            $search_txt = dbesc(protect_sprintf(preg_quote($search)));
            $searching = true;
        }
        $sql_extra .= $searching ? " AND (`attag` LIKE '%%" . dbesc($search_txt) . "%%' OR `name` LIKE '%%" . dbesc($search_txt) . "%%' OR `nick` LIKE '%%" . dbesc($search_txt) . "%%') " : "";
        if ($nets) {
            $sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets));
        }
        $sql_extra2 = $sort_type > 0 && $sort_type <= CONTACT_IS_FRIEND ? sprintf(" AND `rel` = %d ", intval($sort_type)) : '';
        $r = q("SELECT COUNT(*) AS `total` FROM `contact`\n\t\t\tWHERE `uid` = %d AND `self` = 0 AND `pending` = 0 {$sql_extra} {$sql_extra2} ", intval($_SESSION['uid']));
        if (count($r)) {
            $total = $r[0]["total"];
        }
        $sql_extra3 = unavailable_networks();
        $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `pending` = 0 {$sql_extra} {$sql_extra2} {$sql_extra3} ORDER BY `name` ASC LIMIT 100 ", intval($_SESSION['uid']));
        $contacts = array();
        if (count($r)) {
            foreach ($r as $rr) {
                $contacts[] = _contact_detail_for_template($rr);
            }
        }
        $results["items"] = $contacts;
        $results["tot"] = $total;
    }
}
Пример #4
0
function acl_lookup(&$a, $out_type = 'json')
{
    if (!local_user()) {
        return "";
    }
    $start = x($_REQUEST, 'start') ? $_REQUEST['start'] : 0;
    $count = x($_REQUEST, 'count') ? $_REQUEST['count'] : 100;
    $search = x($_REQUEST, 'search') ? $_REQUEST['search'] : "";
    $type = x($_REQUEST, 'type') ? $_REQUEST['type'] : "";
    $conv_id = x($_REQUEST, 'conversation') ? $_REQUEST['conversation'] : null;
    // For use with jquery.autocomplete for private mail completion
    if (x($_REQUEST, 'query') && strlen($_REQUEST['query'])) {
        if (!$type) {
            $type = 'm';
        }
        $search = $_REQUEST['query'];
    }
    //	logger("Searching for ".$search." - type ".$type, LOGGER_DEBUG);
    if ($search != "") {
        $sql_extra = "AND `name` LIKE '%%" . dbesc($search) . "%%'";
        $sql_extra2 = "AND (`attag` LIKE '%%" . dbesc($search) . "%%' OR `name` LIKE '%%" . dbesc($search) . "%%' OR `nick` LIKE '%%" . dbesc($search) . "%%')";
    } else {
        $sql_extra = $sql_extra2 = "";
    }
    // count groups and contacts
    if ($type == '' || $type == 'g') {
        $r = q("SELECT COUNT(*) AS g FROM `group` WHERE `deleted` = 0 AND `uid` = %d {$sql_extra}", intval(local_user()));
        $group_count = (int) $r[0]['g'];
    } else {
        $group_count = 0;
    }
    $sql_extra2 .= " " . unavailable_networks();
    if ($type == '' || $type == 'c') {
        $r = q("SELECT COUNT(*) AS c FROM `contact`\n\t\t\t\tWHERE `uid` = %d AND `self` = 0\n\t\t\t\tAND `blocked` = 0 AND `pending` = 0 AND `archive` = 0\n\t\t\t\tAND `notify` != '' {$sql_extra2}", intval(local_user()));
        $contact_count = (int) $r[0]['c'];
    } elseif ($type == 'm') {
        // autocomplete for Private Messages
        $r = q("SELECT COUNT(*) AS c FROM `contact`\n\t\t\t\tWHERE `uid` = %d AND `self` = 0\n\t\t\t\tAND `blocked` = 0 AND `pending` = 0 AND `archive` = 0\n\t\t\t\tAND `network` IN ('%s','%s','%s') {$sql_extra2}", intval(local_user()), dbesc(NETWORK_DFRN), dbesc(NETWORK_ZOT), dbesc(NETWORK_DIASPORA));
        $contact_count = (int) $r[0]['c'];
    } elseif ($type == 'a') {
        // autocomplete for Contacts
        $r = q("SELECT COUNT(*) AS c FROM `contact`\n\t\t\t\tWHERE `uid` = %d AND `self` = 0\n\t\t\t\tAND `pending` = 0 {$sql_extra2}", intval(local_user()));
        $contact_count = (int) $r[0]['c'];
    } else {
        $contact_count = 0;
    }
    $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\n\t\t\t\tFROM `group`,`group_member`\n\t\t\t\tWHERE `group`.`deleted` = 0 AND `group`.`uid` = %d\n\t\t\t\t\tAND `group_member`.`gid`=`group`.`id`\n\t\t\t\t\t{$sql_extra}\n\t\t\t\tGROUP BY `group`.`id`\n\t\t\t\tORDER BY `group`.`name`\n\t\t\t\tLIMIT %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" => htmlentities($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`\n\t\t\tWHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''\n\t\t\tAND NOT (`network` IN ('%s', '%s'))\n\t\t\t{$sql_extra2}\n\t\t\tORDER BY `name` ASC ", intval(local_user()), dbesc(NETWORK_OSTATUS), dbesc(NETWORK_STATUSNET));
    } elseif ($type == 'm') {
        $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag` FROM `contact`\n\t\t\tWHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0\n\t\t\tAND `network` IN ('%s','%s','%s')\n\t\t\t{$sql_extra2}\n\t\t\tORDER 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`\n\t\t\tWHERE `uid` = %d AND `pending` = 0\n\t\t\t{$sql_extra2}\n\t\t\tORDER 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'][] = proxy_url($g['micro'], false, PROXY_SIZE_MICRO);
                $x['links'][] = $g['url'];
                $x['suggestions'][] = htmlentities($g['name']);
                $x['data'][] = intval($g['id']);
            }
        }
        echo json_encode($x);
        killme();
    }
    if (count($r)) {
        foreach ($r as $g) {
            $contacts[] = array("type" => "c", "photo" => proxy_url($g['micro'], false, PROXY_SIZE_MICRO), "name" => htmlentities($g['name']), "id" => intval($g['id']), "network" => $g['network'], "link" => $g['url'], "nick" => htmlentities($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\n\t\t\t\t\t`author-avatar`,`author-name`,`author-link`\n\t\t\t\tfrom item where parent=%d\n\t\t\t\tand (\n\t\t\t\t\t`author-name` LIKE '%%%s%%' OR\n\t\t\t\t\t`author-link` LIKE '%%%s%%'\n\t\t\t\t) and\n\t\t\t\t`author-link` NOT IN ('%s')\n\t\t\t\tGROUP BY `author-link`\n\t\t\t\tORDER BY `author-name` ASC\n\t\t\t\t", 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" => proxy_url($row['author-avatar'], false, PROXY_SIZE_MICRO), "name" => htmlentities($row['author-name']), "id" => '', "network" => "unknown", "link" => $row['author-link'], "nick" => htmlentities($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);
    killme();
}