]> git.mxchange.org Git - friendica.git/blobdiff - include/conversation.php
Update functions and calls
[friendica.git] / include / conversation.php
index b32a98426e9ea628245c4cd41e8a8d1a0b8de0bb..bcc0b855f5abfd0acec9e70cca724eaa3f4ef1b1 100644 (file)
@@ -3,27 +3,24 @@
  * @file include/conversation.php
  */
 use Friendica\App;
-use Friendica\Content\Features;
+use Friendica\Content\ContactSelector;
+use Friendica\Content\Feature;
+use Friendica\Core\Addon;
 use Friendica\Core\Config;
 use Friendica\Core\PConfig;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
-use Friendica\Object\Contact;
-use Friendica\Object\Conversation;
-use Friendica\Object\Item;
+use Friendica\Model\Contact;
+use Friendica\Model\Profile;
+use Friendica\Object\Thread;
+use Friendica\Object\Post;
 
 require_once "include/bbcode.php";
 require_once "include/acl_selectors.php";
 
-/*
- * Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
- * is identical to the code in mod/message.php for 'item_extract_images' and
- * 'item_redir_and_replace_images'
- */
-if (! function_exists('item_extract_images')) {
 function item_extract_images($body) {
 
-       $saved_image = array();
+       $saved_image = [];
        $orig_body = $body;
        $new_body = '';
 
@@ -61,10 +58,9 @@ function item_extract_images($body) {
 
        $new_body = $new_body . $orig_body;
 
-       return array('body' => $new_body, 'images' => $saved_image);
-}}
+       return ['body' => $new_body, 'images' => $saved_image];
+}
 
-if (! function_exists('item_redir_and_replace_images')) {
 function item_redir_and_replace_images($body, $images, $cid) {
 
        $origbody = $body;
@@ -104,7 +100,7 @@ function item_redir_and_replace_images($body, $images, $cid) {
                $cnt++;
        }
        return $newbody;
-}}
+}
 
 /**
  * Render actions localized
@@ -141,39 +137,39 @@ function localize_item(&$item) {
                        case ACTIVITY_POST:
                                switch ($obj['object-type']) {
                                        case ACTIVITY_OBJ_EVENT:
-                                               $post_type = t('event');
+                                               $post_type = L10n::t('event');
                                                break;
                                        default:
-                                               $post_type = t('status');
+                                               $post_type = L10n::t('status');
                                }
                                break;
                        default:
                                if ($obj['resource-id']) {
-                                       $post_type = t('photo');
-                                       $m = array();
+                                       $post_type = L10n::t('photo');
+                                       $m = [];
                                        preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
                                        $rr['plink'] = $m[1];
                                } else {
-                                       $post_type = t('status');
+                                       $post_type = L10n::t('status');
                                }
                }
 
                $plink = '[url=' . $obj['plink'] . ']' . $post_type . '[/url]';
 
                if (activity_match($item['verb'], ACTIVITY_LIKE)) {
-                       $bodyverb = t('%1$s likes %2$s\'s %3$s');
+                       $bodyverb = L10n::t('%1$s likes %2$s\'s %3$s');
                }
                elseif (activity_match($item['verb'], ACTIVITY_DISLIKE)) {
-                       $bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
+                       $bodyverb = L10n::t('%1$s doesn\'t like %2$s\'s %3$s');
                }
                elseif (activity_match($item['verb'], ACTIVITY_ATTEND)) {
-                       $bodyverb = t('%1$s attends %2$s\'s %3$s');
+                       $bodyverb = L10n::t('%1$s attends %2$s\'s %3$s');
                }
                elseif (activity_match($item['verb'], ACTIVITY_ATTENDNO)) {
-                       $bodyverb = t('%1$s doesn\'t attend %2$s\'s %3$s');
+                       $bodyverb = L10n::t('%1$s doesn\'t attend %2$s\'s %3$s');
                }
                elseif (activity_match($item['verb'], ACTIVITY_ATTENDMAYBE)) {
-                       $bodyverb = t('%1$s attends maybe %2$s\'s %3$s');
+                       $bodyverb = L10n::t('%1$s attends maybe %2$s\'s %3$s');
                }
                $item['body'] = sprintf($bodyverb, $author, $objauthor, $plink);
 
@@ -200,13 +196,13 @@ function localize_item(&$item) {
                        }
                }
 
-               $A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
-               $B = '[url=' . zrl($Blink) . ']' . $Bname . '[/url]';
+               $A = '[url=' . Profile::zrl($Alink) . ']' . $Aname . '[/url]';
+               $B = '[url=' . Profile::zrl($Blink) . ']' . $Bname . '[/url]';
                if ($Bphoto != "") {
-                       $Bphoto = '[url=' . zrl($Blink) . '][img]' . $Bphoto . '[/img][/url]';
+                       $Bphoto = '[url=' . Profile::zrl($Blink) . '][img]' . $Bphoto . '[/img][/url]';
                }
 
-               $item['body'] = sprintf( t('%1$s is now friends with %2$s'), $A, $B)."\n\n\n".$Bphoto;
+               $item['body'] = sprintf( L10n::t('%1$s is now friends with %2$s'), $A, $B)."\n\n\n".$Bphoto;
 
        }
        if (stristr($item['verb'], ACTIVITY_POKE)) {
@@ -237,41 +233,27 @@ function localize_item(&$item) {
                        }
                }
 
-               $A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
-               $B = '[url=' . zrl($Blink) . ']' . $Bname . '[/url]';
+               $A = '[url=' . Profile::zrl($Alink) . ']' . $Aname . '[/url]';
+               $B = '[url=' . Profile::zrl($Blink) . ']' . $Bname . '[/url]';
                if ($Bphoto != "") {
-                       $Bphoto = '[url=' . zrl($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]';
+                       $Bphoto = '[url=' . Profile::zrl($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]';
                }
 
                /*
                 * we can't have a translation string with three positions but no distinguishable text
                 * So here is the translate string.
                 */
-               $txt = t('%1$s poked %2$s');
+               $txt = L10n::t('%1$s poked %2$s');
 
                // now translate the verb
                $poked_t = trim(sprintf($txt, "", ""));
-               $txt = str_replace( $poked_t, t($verb), $txt);
+               $txt = str_replace( $poked_t, L10n::t($verb), $txt);
 
                // then do the sprintf on the translation string
 
                $item['body'] = sprintf($txt, $A, $B). "\n\n\n" . $Bphoto;
 
        }
-       if (stristr($item['verb'], ACTIVITY_MOOD)) {
-               $verb = urldecode(substr($item['verb'], strpos($item['verb'], '#') + 1));
-               if (! $verb) {
-                       return;
-               }
-
-               $Aname = $item['author-name'];
-               $Alink = $item['author-link'];
-               $A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
-
-               $txt = t('%1$s is currently %2$s');
-
-               $item['body'] = sprintf($txt, $A, t($verb));
-       }
 
        if (activity_match($item['verb'], ACTIVITY_TAG)) {
                /// @TODO may hurt performance "joining" two tables + asterisk
@@ -286,26 +268,26 @@ function localize_item(&$item) {
 
                $obj = $r[0];
 
-               $author  = '[url=' . zrl($item['author-link']) . ']' . $item['author-name'] . '[/url]';
-               $objauthor =  '[url=' . zrl($obj['author-link']) . ']' . $obj['author-name'] . '[/url]';
+               $author  = '[url=' . Profile::zrl($item['author-link']) . ']' . $item['author-name'] . '[/url]';
+               $objauthor =  '[url=' . Profile::zrl($obj['author-link']) . ']' . $obj['author-name'] . '[/url]';
 
                switch ($obj['verb']) {
                        case ACTIVITY_POST:
                                switch ($obj['object-type']) {
                                        case ACTIVITY_OBJ_EVENT:
-                                               $post_type = t('event');
+                                               $post_type = L10n::t('event');
                                                break;
                                        default:
-                                               $post_type = t('status');
+                                               $post_type = L10n::t('status');
                                }
                                break;
                        default:
                                if ($obj['resource-id']) {
-                                       $post_type = t('photo');
-                                       $m=array(); preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
+                                       $post_type = L10n::t('photo');
+                                       $m=[]; preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
                                        $rr['plink'] = $m[1];
                                } else {
-                                       $post_type = t('status');
+                                       $post_type = L10n::t('status');
                                }
                                // Let's break everthing ... ;-)
                                break;
@@ -315,7 +297,7 @@ function localize_item(&$item) {
                $parsedobj = parse_xml_string($xmlhead.$item['object']);
 
                $tag = sprintf('#[url=%s]%s[/url]', $parsedobj->id, $parsedobj->content);
-               $item['body'] = sprintf( t('%1$s tagged %2$s\'s %3$s with %4$s'), $author, $objauthor, $plink, $tag );
+               $item['body'] = sprintf( L10n::t('%1$s tagged %2$s\'s %3$s with %4$s'), $author, $objauthor, $plink, $tag );
 
        }
        if (activity_match($item['verb'], ACTIVITY_FAVORITE)) {
@@ -340,10 +322,10 @@ function localize_item(&$item) {
                                $target = $r[0];
                                $Bname = $target['author-name'];
                                $Blink = $target['author-link'];
-                               $A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
-                               $B = '[url=' . zrl($Blink) . ']' . $Bname . '[/url]';
-                               $P = '[url=' . $target['plink'] . ']' . t('post/item') . '[/url]';
-                               $item['body'] = sprintf( t('%1$s marked %2$s\'s %3$s as favorite'), $A, $B, $P)."\n";
+                               $A = '[url=' . Profile::zrl($Alink) . ']' . $Aname . '[/url]';
+                               $B = '[url=' . Profile::zrl($Blink) . ']' . $Bname . '[/url]';
+                               $P = '[url=' . $target['plink'] . ']' . L10n::t('post/item') . '[/url]';
+                               $item['body'] = sprintf( L10n::t('%1$s marked %2$s\'s %3$s as favorite'), $A, $B, $P)."\n";
                        }
                }
        }
@@ -351,7 +333,7 @@ function localize_item(&$item) {
        if (preg_match_all('/@\[url=(.*?)\]/is', $item['body'], $matches, PREG_SET_ORDER)) {
                foreach ($matches as $mtch) {
                        if (! strpos($mtch[1], 'zrl=')) {
-                               $item['body'] = str_replace($mtch[0], '@[url=' . zrl($mtch[1]) . ']', $item['body']);
+                               $item['body'] = str_replace($mtch[0], '@[url=' . Profile::zrl($mtch[1]) . ']', $item['body']);
                        }
                }
        }
@@ -359,7 +341,7 @@ function localize_item(&$item) {
        // add zrl's to public images
        $photo_pattern = "/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is";
        if (preg_match($photo_pattern, $item['body'])) {
-               $photo_replace = '[url=' . zrl('$1' . '/photos/' . '$2' . '/image/' . '$3' ,true) . '][img' . '$4' . ']h' . '$5'  . '[/img][/url]';
+               $photo_replace = '[url=' . Profile::zrl('$1' . '/photos/' . '$2' . '/image/' . '$3' ,true) . '][img' . '$4' . ']h' . '$5'  . '[/img][/url]';
                $item['body'] = bb_tag_preg_replace($photo_pattern, $photo_replace, 'url', $item['body']);
        }
 
@@ -401,7 +383,7 @@ function visible_activity($item) {
         * likes (etc.) can apply to other things besides posts. Check if they are post children,
         * in which case we handle them specially
         */
-       $hidden_activities = array(ACTIVITY_LIKE, ACTIVITY_DISLIKE, ACTIVITY_ATTEND, ACTIVITY_ATTENDNO, ACTIVITY_ATTENDMAYBE);
+       $hidden_activities = [ACTIVITY_LIKE, ACTIVITY_DISLIKE, ACTIVITY_ATTEND, ACTIVITY_ATTENDNO, ACTIVITY_ATTENDMAYBE];
        foreach ($hidden_activities as $act) {
                if (activity_match($item['verb'], $act)) {
                        return false;
@@ -449,7 +431,6 @@ These Fields are not added below (yet). They are here to for bug search.
 `item`.`deleted`,
 `item`.`origin`,
 `item`.`forum_mode`,
-`item`.`last-child`,
 `item`.`mention`,
 `item`.`global`,
 `item`.`gcontact-id`,
@@ -500,7 +481,6 @@ function item_condition() {
        return "`item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated`";
 }
 
-if (!function_exists('conversation')) {
 /**
  * "Render" a conversation or list of items for HTML display.
  * There are two major forms of display:
@@ -512,14 +492,12 @@ if (!function_exists('conversation')) {
  *
  */
 function conversation(App $a, $items, $mode, $update, $preview = false) {
-
        require_once 'include/bbcode.php';
        require_once 'mod/proxy.php';
 
        $ssl_state = ((local_user()) ? true : false);
 
        $profile_owner = 0;
-       $page_writeable = false;
        $live_update_div = '';
 
        $arr_blocked = null;
@@ -539,7 +517,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
 
        if ($mode === 'network') {
                $profile_owner = local_user();
-               $page_writeable = true;
                if (!$update) {
                        /*
                         * The special div is needed for liveUpdate to kick in for this page.
@@ -567,11 +544,12 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                }
        } elseif ($mode === 'profile') {
                $profile_owner = $a->profile['profile_uid'];
-               $page_writeable = can_write_wall($a,$profile_owner);
 
                if (!$update) {
-                       $tab = notags(trim($_GET['tab']));
-                       $tab = ( $tab ? $tab : 'posts' );
+                       $tab = 'posts';
+                       if (x($_GET, 'tab')) {
+                               $tab = notags(trim($_GET['tab']));
+                       }
                        if ($tab === 'posts') {
                                /*
                                 * This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
@@ -585,7 +563,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                }
        } elseif ($mode === 'notes') {
                $profile_owner = local_user();
-               $page_writeable = true;
                if (!$update) {
                        $live_update_div = '<div id="live-notes"></div>' . "\r\n"
                                . "<script> var profile_uid = " . local_user()
@@ -593,18 +570,20 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                }
        } elseif ($mode === 'display') {
                $profile_owner = $a->profile['uid'];
-               $page_writeable = can_write_wall($a,$profile_owner);
                if (!$update) {
                        $live_update_div = '<div id="live-display"></div>' . "\r\n"
                                . "<script> var profile_uid = " . $_SESSION['uid'] . ";"
                                . " var profile_page = 1; </script>";
                }
        } elseif ($mode === 'community') {
+               if (!$community_readonly) {
+                       $items = community_add_items($items);
+               }
                $profile_owner = 0;
-               $page_writeable = false;
                if (!$update) {
                        $live_update_div = '<div id="live-community"></div>' . "\r\n"
-                               . "<script> var profile_uid = -1; var netargs = '/?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
+                               . "<script> var profile_uid = -1; var netargs = '" . substr($a->cmd, 10)
+                               ."/?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
                }
        } elseif ($mode === 'search') {
                $live_update_div = '<div id="live-search"></div>' . "\r\n";
@@ -612,35 +591,46 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
 
        $page_dropping = ((local_user() && local_user() == $profile_owner) ? true : false);
 
-
-       if ($update) {
-               $return_url = $_SESSION['return_url'];
-       } else {
-               $return_url = $_SESSION['return_url'] = $a->query_string;
+       if (!$update) {
+               $_SESSION['return_url'] = $a->query_string;
        }
 
-       $cb = array('items' => $items, 'mode' => $mode, 'update' => $update, 'preview' => $preview);
-       call_hooks('conversation_start',$cb);
+       $cb = ['items' => $items, 'mode' => $mode, 'update' => $update, 'preview' => $preview];
+       Addon::callHooks('conversation_start',$cb);
 
        $items = $cb['items'];
 
-       $cmnt_tpl    = get_markup_template('comment_item.tpl');
-       $hide_comments_tpl = get_markup_template('hide_comments.tpl');
-
-       $conv_responses = array(
-               'like' => array('title' => t('Likes','title')), 'dislike' => array('title' => t('Dislikes','title')),
-               'attendyes' => array('title' => t('Attending','title')), 'attendno' => array('title' => t('Not attending','title')), 'attendmaybe' => array('title' => t('Might attend','title'))
-       );
+       $conv_responses = [
+               'like' => ['title' => L10n::t('Likes','title')], 'dislike' => ['title' => L10n::t('Dislikes','title')],
+               'attendyes' => ['title' => L10n::t('Attending','title')], 'attendno' => ['title' => L10n::t('Not attending','title')], 'attendmaybe' => ['title' => L10n::t('Might attend','title')]
+       ];
 
        // array with html for each thread (parent+comments)
-       $threads = array();
+       $threads = [];
        $threadsid = -1;
 
        $page_template = get_markup_template("conversation.tpl");
 
        if ($items && count($items)) {
+               $community_readonly = ($mode === 'community');
+
+               // Currently behind a config value. This allows the commenting and sharing of every public item.
+               if (Config::get('system', 'comment_public')) {
+                       if ($mode === 'community') {
+                               $community_readonly = false;
+                               $writable = true;
+                       } else {
+                               $writable = ($items[0]['uid'] == 0) && in_array($items[0]['network'], [NETWORK_OSTATUS, NETWORK_DIASPORA, NETWORK_DFRN]);
+                       }
+               } else {
+                       $writable = false;
+               }
+
+               if (!local_user()) {
+                       $writable = false;
+               }
 
-               if ($mode === 'network-new' || $mode === 'search' || $mode === 'community') {
+               if (in_array($mode, ['network-new', 'search', 'contact-posts']) || $community_readonly) {
 
                        /*
                         * "New Item View" on network page or search page results
@@ -669,20 +659,10 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
 
                                $threadsid++;
 
-                               $comment     = '';
                                $owner_url   = '';
                                $owner_name  = '';
                                $sparkle     = '';
 
-                               if ($mode === 'search' || $mode === 'community') {
-                                       if (((activity_match($item['verb'], ACTIVITY_LIKE)) || (activity_match($item['verb'], ACTIVITY_DISLIKE)))
-                                               && ($item['id'] != $item['parent']))
-                                               continue;
-                                       $nickname = $item['nickname'];
-                               } else {
-                                       $nickname = $a->user['nickname'];
-                               }
-
                                // prevent private email from leaking.
                                if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
                                        continue;
@@ -693,15 +673,15 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                        $profile_name = $item['author-link'];
                                }
 
-                               $tags = array();
-                               $hashtags = array();
-                               $mentions = array();
+                               $tags = [];
+                               $hashtags = [];
+                               $mentions = [];
 
                                $searchpath = System::baseUrl()."/search?tag=";
 
-                               $taglist = dba::select('term', array('type', 'term', 'url'),
-                                                       array("`otype` = ? AND `oid` = ? AND `type` IN (?, ?)", TERM_OBJ_POST, $item['id'], TERM_HASHTAG, TERM_MENTION),
-                                                       array('order' => array('tid')));
+                               $taglist = dba::select('term', ['type', 'term', 'url'],
+                                                       ["`otype` = ? AND `oid` = ? AND `type` IN (?, ?)", TERM_OBJ_POST, $item['id'], TERM_HASHTAG, TERM_MENTION],
+                                                       ['order' => ['tid']]);
 
                                while ($tag = dba::fetch($taglist)) {
                                        if ($tag["url"] == "") {
@@ -730,7 +710,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                if ($sp) {
                                        $sparkle = ' sparkle';
                                } else {
-                                       $profile_link = zrl($profile_link);
+                                       $profile_link = Profile::zrl($profile_link);
                                }
 
                                if (!x($item, 'author-thumb') || ($item['author-thumb'] == "")) {
@@ -751,8 +731,8 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                        }
                                }
 
-                               $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
-                               call_hooks('render_location',$locate);
+                               $locate = ['location' => $item['location'], 'coord' => $item['coord'], 'html' => ''];
+                               Addon::callHooks('render_location',$locate);
 
                                $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_dummy($locate));
 
@@ -763,19 +743,18 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                        $dropping = false;
                                }
 
-                               $drop = array(
+                               $drop = [
                                        'dropping' => $dropping,
                                        'pagedrop' => $page_dropping,
-                                       'select' => t('Select'),
-                                       'delete' => t('Delete'),
-                               );
+                                       'select' => L10n::t('Select'),
+                                       'delete' => L10n::t('Delete'),
+                               ];
 
                                $star = false;
                                $isstarred = "unstarred";
 
                                $lock = false;
                                $likebuttons = false;
-                               $shareable = false;
 
                                $body = prepare_body($item, true, $preview);
 
@@ -794,13 +773,13 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                        $item['item_network'] = $item['network'];
                                }
 
-                               $tmp_item = array(
+                               $tmp_item = [
                                        'template' => $tpl,
                                        'id' => (($preview) ? 'P0' : $item['item_id']),
                                        'guid' => (($preview) ? 'Q0' : $item['guid']),
                                        'network' => $item['item_network'],
-                                       'network_name' => network_to_name($item['item_network'], $profile_link),
-                                       'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
+                                       'network_name' => ContactSelector::networkToName($item['item_network'], $profile_link),
+                                       'linktitle' => sprintf( L10n::t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
                                        'profile_url' => $profile_link,
                                        'item_photo_menu' => item_photo_menu($item),
                                        'name' => $profile_name_e,
@@ -812,15 +791,15 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                        'tags' => $tags_e,
                                        'hashtags' => $hashtags_e,
                                        'mentions' => $mentions_e,
-                                       'txt_cats' => t('Categories:'),
-                                       'txt_folders' => t('Filed under:'),
+                                       'txt_cats' => L10n::t('Categories:'),
+                                       'txt_folders' => L10n::t('Filed under:'),
                                        'has_cats' => ((count($categories)) ? 'true' : ''),
                                        'has_folders' => ((count($folders)) ? 'true' : ''),
                                        'categories' => $categories,
                                        'folders' => $folders,
                                        'text' => strip_tags($body_e),
                                        'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
-                                       'ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])),
+                                       'ago' => (($item['app']) ? sprintf( L10n::t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])),
                                        'location' => $location_e,
                                        'indent' => '',
                                        'owner_name' => $owner_name_e,
@@ -835,35 +814,32 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                        'like' => '',
                                        'dislike' => '',
                                        'comment' => '',
-                                       //'conv' => (($preview) ? '' : array('href'=> 'display/' . $nickname . '/' . $item['id'], 'title'=> t('View in context'))),
-                                       'conv' => (($preview) ? '' : array('href'=> 'display/'.$item['guid'], 'title'=> t('View in context'))),
+                                       'conv' => (($preview) ? '' : ['href'=> 'display/'.$item['guid'], 'title'=> L10n::t('View in context')]),
                                        'previewing' => $previewing,
-                                       'wait' => t('Please wait'),
+                                       'wait' => L10n::t('Please wait'),
                                        'thread_level' => 1,
-                               );
+                               ];
 
-                               $arr = array('item' => $item, 'output' => $tmp_item);
-                               call_hooks('display_item', $arr);
+                               $arr = ['item' => $item, 'output' => $tmp_item];
+                               Addon::callHooks('display_item', $arr);
 
                                $threads[$threadsid]['id'] = $item['item_id'];
                                $threads[$threadsid]['network'] = $item['item_network'];
-                               $threads[$threadsid]['items'] = array($arr['output']);
+                               $threads[$threadsid]['items'] = [$arr['output']];
 
                        }
                } else {
                        // Normal View
                        $page_template = get_markup_template("threaded_conversation.tpl");
 
-                       $conv = new Conversation($mode, $preview);
+                       $conv = new Thread($mode, $preview, $writable);
 
                        /*
                         * get all the topmost parents
                         * this shouldn't be needed, as we should have only them in our array
                         * But for now, this array respects the old style, just in case
                         */
-                       $threads = array();
                        foreach ($items as $item) {
-
                                if ($arr_blocked) {
                                        $blocked = false;
                                        foreach ($arr_blocked as $b) {
@@ -889,38 +865,101 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                        continue;
                                }
 
-                               call_hooks('display_item', $arr);
+                               Addon::callHooks('display_item', $arr);
 
                                $item['pagedrop'] = $page_dropping;
 
                                if ($item['id'] == $item['parent']) {
-                                       $item_object = new Item($item);
-                                       $conv->addThread($item_object);
+                                       $item_object = new Post($item);
+                                       $conv->addParent($item_object);
                                }
                        }
 
                        $threads = $conv->getTemplateData($conv_responses);
-
                        if (!$threads) {
                                logger('[ERROR] conversation : Failed to get template data.', LOGGER_DEBUG);
-                               $threads = array();
+                               $threads = [];
                        }
                }
        }
 
-       $o = replace_macros($page_template, array(
+       $o = replace_macros($page_template, [
                '$baseurl' => System::baseUrl($ssl_state),
                '$return_path' => $a->query_string,
                '$live_update' => $live_update_div,
-               '$remove' => t('remove'),
+               '$remove' => L10n::t('remove'),
                '$mode' => $mode,
                '$user' => $a->user,
                '$threads' => $threads,
-               '$dropping' => ($page_dropping && Features::isEnabled(local_user(), 'multi_delete') ? t('Delete Selected Items') : False),
-       ));
+               '$dropping' => ($page_dropping && Feature::isEnabled(local_user(), 'multi_delete') ? L10n::t('Delete Selected Items') : False),
+       ]);
 
        return $o;
-}}
+}
+
+/**
+ * @brief Add comments to top level entries that had been fetched before
+ *
+ * The system will fetch the comments for the local user whenever possible.
+ * This behaviour is currently needed to allow commenting on Friendica posts.
+ *
+ * @param array $parents Parent items
+ *
+ * @return array items with parents and comments
+ */
+function community_add_items($parents) {
+       $max_comments = Config::get("system", "max_comments", 100);
+
+       $items = [];
+
+       foreach ($parents AS $parent) {
+               $thread_items = dba::p(item_query()." AND `item`.`uid` = ?
+                       AND `item`.`parent-uri` = ?
+                       ORDER BY `item`.`commented` DESC LIMIT ".intval($max_comments + 1),
+                       local_user(),
+                       $parent['uri']
+               );
+               $comments = dba::inArray($thread_items);
+
+               // Check if the original item is in the result.
+               // When commenting from the community page there can be incomplete threads
+               if (count($comments) > 0) {
+                       $parent_found = false;
+                       foreach ($comments as $comment) {
+                               if ($comment['uri'] == $comment['parent-uri']) {
+                                       $parent_found = true;
+                                       break;
+                               }
+                       }
+                       if (!$parent_found) {
+                               $comments = [];
+                       }
+               }
+
+               if (count($comments) == 0) {
+                       $thread_items = dba::p(item_query()." AND `item`.`uid` = 0
+                               AND `item`.`parent-uri` = ?
+                               ORDER BY `item`.`commented` DESC LIMIT ".intval($max_comments + 1),
+                               $parent['uri']
+                       );
+                       $comments = dba::inArray($thread_items);
+               }
+
+               if (count($comments) != 0) {
+                       $items = array_merge($items, $comments);
+               }
+       }
+
+       foreach ($items as $index => $item) {
+               if ($item['uid'] == 0) {
+                       $items[$index]['writable'] = in_array($item['network'], [NETWORK_OSTATUS, NETWORK_DIASPORA, NETWORK_DFRN]);
+               }
+       }
+
+       $items = conv_sort($items, "`commented`");
+
+       return $items;
+}
 
 function best_link_url($item, &$sparkle, $url = '') {
 
@@ -930,11 +969,15 @@ function best_link_url($item, &$sparkle, $url = '') {
        $clean_url = normalise_link($item['author-link']);
 
        if (local_user()) {
-               $r = dba::select('contact', array('id'),
-                       array('network' => NETWORK_DFRN, 'uid' => local_user(), 'nurl' => normalise_link($clean_url), 'pending' => false),
-                       array('limit' => 1));
-               if (DBM::is_result($r)) {
-                       $best_url = 'redir/' . $r['id'];
+               $condition = [
+                       'network' => NETWORK_DFRN,
+                       'uid' => local_user(),
+                       'nurl' => normalise_link($clean_url),
+                       'pending' => false
+               ];
+               $contact = dba::selectFirst('contact', ['id'], $condition);
+               if (DBM::is_result($contact)) {
+                       $best_url = 'redir/' . $contact['id'];
                        $sparkle = true;
                        if ($url != '') {
                                $hostname = get_app()->get_hostname();
@@ -968,7 +1011,6 @@ function item_photo_menu($item) {
        $status_link = '';
        $photos_link = '';
        $posts_link = '';
-       $network = '';
 
        if ((local_user()) && local_user() == $item['uid'] && $item['parent'] == $item['id'] && (! $item['self'])) {
                $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;';
@@ -983,20 +1025,20 @@ function item_photo_menu($item) {
        $cid = 0;
        $network = '';
        $rel = 0;
-       $r = dba::select('contact', array('id', 'network', 'rel'), array('uid' => local_user(), 'nurl' => normalise_link($item['author-link'])), array('limit' => 1));
-       if (DBM::is_result($r)) {
-               $cid = $r['id'];
-               $network = $r['network'];
-               $rel = $r['rel'];
+       $condition = ['uid' => local_user(), 'nurl' => normalise_link($item['author-link'])];
+       $contact = dba::selectFirst('contact', ['id', 'network', 'rel'], $condition);
+       if (DBM::is_result($contact)) {
+               $cid = $contact['id'];
+               $network = $contact['network'];
+               $rel = $contact['rel'];
        }
 
        if ($sparkle) {
                $status_link = $profile_link . '?url=status';
                $photos_link = $profile_link . '?url=photos';
                $profile_link = $profile_link . '?url=profile';
-               $zurl = '';
        } else {
-               $profile_link = zrl($profile_link);
+               $profile_link = Profile::zrl($profile_link);
        }
 
        if ($cid && !$item['self']) {
@@ -1004,37 +1046,37 @@ function item_photo_menu($item) {
                $contact_url = 'contacts/' . $cid;
                $posts_link = 'contacts/' . $cid . '/posts';
 
-               if (in_array($network, array(NETWORK_DFRN, NETWORK_DIASPORA))) {
+               if (in_array($network, [NETWORK_DFRN, NETWORK_DIASPORA])) {
                        $pm_url = 'message/new/' . $cid;
                }
        }
 
        if (local_user()) {
-               $menu = array(
-                       t('Follow Thread') => $sub_link,
-                       t('View Status') => $status_link,
-                       t('View Profile') => $profile_link,
-                       t('View Photos') => $photos_link,
-                       t('Network Posts') => $posts_link,
-                       t('View Contact') => $contact_url,
-                       t('Send PM') => $pm_url
-               );
+               $menu = [
+                       L10n::t('Follow Thread') => $sub_link,
+                       L10n::t('View Status') => $status_link,
+                       L10n::t('View Profile') => $profile_link,
+                       L10n::t('View Photos') => $photos_link,
+                       L10n::t('Network Posts') => $posts_link,
+                       L10n::t('View Contact') => $contact_url,
+                       L10n::t('Send PM') => $pm_url
+               ];
 
                if ($network == NETWORK_DFRN) {
-                       $menu[t("Poke")] = $poke_link;
+                       $menu[L10n::t("Poke")] = $poke_link;
                }
 
                if ((($cid == 0) || ($rel == CONTACT_IS_FOLLOWER)) &&
-                       in_array($item['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA))) {
-                       $menu[t('Connect/Follow')] = 'follow?url=' . urlencode($item['author-link']);
+                       in_array($item['network'], [NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA])) {
+                       $menu[L10n::t('Connect/Follow')] = 'follow?url=' . urlencode($item['author-link']);
                }
        } else {
-               $menu = array(t('View Profile') => $item['author-link']);
+               $menu = [L10n::t('View Profile') => $item['author-link']];
        }
 
-       $args = array('item' => $item, 'menu' => $menu);
+       $args = ['item' => $item, 'menu' => $menu];
 
-       call_hooks('item_photo_menu', $args);
+       Addon::callHooks('item_photo_menu', $args);
 
        $menu = $args['menu'];
 
@@ -1050,7 +1092,6 @@ function item_photo_menu($item) {
        return $o;
 }
 
-if (! function_exists('builtin_activity_puller')) {
 /**
  * @brief Checks item to see if it is one of the builtin activities (like/dislike, event attendance, consensus items, etc.)
  * Increments the count of each matching activity and adds a link to the author as needed.
@@ -1082,7 +1123,6 @@ function builtin_activity_puller($item, &$conv_responses) {
                                break;
                        default:
                                return;
-                               break;
                }
 
                if ((activity_match($item['verb'], $verb)) && ($item['id'] != $item['parent'])) {
@@ -1091,7 +1131,7 @@ function builtin_activity_puller($item, &$conv_responses) {
                                $url = 'redir/' . $item['contact-id'];
                                $sparkle = ' class="sparkle" ';
                        } else {
-                               $url = zrl($url);
+                               $url = Profile::zrl($url);
                        }
 
                        $url = '<a href="'. $url . '"'. $sparkle .'>' . htmlentities($item['author-name']) . '</a>';
@@ -1102,7 +1142,7 @@ function builtin_activity_puller($item, &$conv_responses) {
 
                        if (! ((isset($conv_responses[$mode][$item['thr-parent'] . '-l']))
                                && (is_array($conv_responses[$mode][$item['thr-parent'] . '-l'])))) {
-                               $conv_responses[$mode][$item['thr-parent'] . '-l'] = array();
+                               $conv_responses[$mode][$item['thr-parent'] . '-l'] = [];
                        }
 
                        // only list each unique author once
@@ -1126,9 +1166,8 @@ function builtin_activity_puller($item, &$conv_responses) {
                        return;
                }
        }
-}}
+}
 
-if (! function_exists('format_like')) {
 /**
  * Format the vote text for a profile item
  * @param int $cnt = number of people who vote the item
@@ -1148,19 +1187,19 @@ function format_like($cnt, array $arr, $type, $id) {
                // list which show all likers
                switch ($type) {
                        case 'like' :
-                               $phrase = sprintf( t('%s likes this.'), $likers);
+                               $phrase = sprintf( L10n::t('%s likes this.'), $likers);
                                break;
                        case 'dislike' :
-                               $phrase = sprintf( t('%s doesn\'t like this.'), $likers);
+                               $phrase = sprintf( L10n::t('%s doesn\'t like this.'), $likers);
                                break;
                        case 'attendyes' :
-                               $phrase = sprintf( t('%s attends.'), $likers);
+                               $phrase = sprintf( L10n::t('%s attends.'), $likers);
                                break;
                        case 'attendno' :
-                               $phrase = sprintf( t('%s doesn\'t attend.'), $likers);
+                               $phrase = sprintf( L10n::t('%s doesn\'t attend.'), $likers);
                                break;
                        case 'attendmaybe' :
-                               $phrase = sprintf( t('%s attends maybe.'), $likers);
+                               $phrase = sprintf( L10n::t('%s attends maybe.'), $likers);
                                break;
                }
        }
@@ -1171,13 +1210,13 @@ function format_like($cnt, array $arr, $type, $id) {
                        $arr = array_slice($arr, 0, MAX_LIKERS - 1);
                }
                if ($total < MAX_LIKERS) {
-                       $last = t('and') . ' ' . $arr[count($arr)-1];
+                       $last = L10n::t('and') . ' ' . $arr[count($arr)-1];
                        $arr2 = array_slice($arr, 0, -1);
                        $str = implode(', ', $arr2) . ' ' . $last;
                }
                if ($total >= MAX_LIKERS) {
                        $str = implode(', ', $arr);
-                       $str .= sprintf( t(', and %d other people'), $total - MAX_LIKERS );
+                       $str .= sprintf( L10n::t(', and %d other people'), $total - MAX_LIKERS );
                }
 
                $likers = $str;
@@ -1186,24 +1225,24 @@ function format_like($cnt, array $arr, $type, $id) {
 
                switch ($type) {
                        case 'like':
-                               $phrase = sprintf( t('<span  %1$s>%2$d people</span> like this'), $spanatts, $cnt);
-                               $explikers = sprintf( t('%s like this.'), $likers);
+                               $phrase = sprintf( L10n::t('<span  %1$s>%2$d people</span> like this'), $spanatts, $cnt);
+                               $explikers = sprintf( L10n::t('%s like this.'), $likers);
                                break;
                        case 'dislike':
-                               $phrase = sprintf( t('<span  %1$s>%2$d people</span> don\'t like this'), $spanatts, $cnt);
-                               $explikers = sprintf( t('%s don\'t like this.'), $likers);
+                               $phrase = sprintf( L10n::t('<span  %1$s>%2$d people</span> don\'t like this'), $spanatts, $cnt);
+                               $explikers = sprintf( L10n::t('%s don\'t like this.'), $likers);
                                break;
                        case 'attendyes':
-                               $phrase = sprintf( t('<span  %1$s>%2$d people</span> attend'), $spanatts, $cnt);
-                               $explikers = sprintf( t('%s attend.'), $likers);
+                               $phrase = sprintf( L10n::t('<span  %1$s>%2$d people</span> attend'), $spanatts, $cnt);
+                               $explikers = sprintf( L10n::t('%s attend.'), $likers);
                                break;
                        case 'attendno':
-                               $phrase = sprintf( t('<span  %1$s>%2$d people</span> don\'t attend'), $spanatts, $cnt);
-                               $explikers = sprintf( t('%s don\'t attend.'), $likers);
+                               $phrase = sprintf( L10n::t('<span  %1$s>%2$d people</span> don\'t attend'), $spanatts, $cnt);
+                               $explikers = sprintf( L10n::t('%s don\'t attend.'), $likers);
                                break;
                        case 'attendmaybe':
-                               $phrase = sprintf( t('<span  %1$s>%2$d people</span> attend maybe'), $spanatts, $cnt);
-                               $explikers = sprintf( t('%s anttend maybe.'), $likers);
+                               $phrase = sprintf( L10n::t('<span  %1$s>%2$d people</span> attend maybe'), $spanatts, $cnt);
+                               $explikers = sprintf( L10n::t('%s anttend maybe.'), $likers);
                                break;
                }
 
@@ -1211,54 +1250,55 @@ function format_like($cnt, array $arr, $type, $id) {
        }
 
        $phrase .= EOL ;
-       $o .= replace_macros(get_markup_template('voting_fakelink.tpl'), array(
+       $o .= replace_macros(get_markup_template('voting_fakelink.tpl'), [
                '$phrase' => $phrase,
                '$type' => $type,
                '$id' => $id
-       ));
+       ]);
        $o .= $expanded;
 
        return $o;
-}}
+}
 
-function status_editor(App $a, $x, $notes_cid = 0, $popup = false) {
+function status_editor(App $a, $x, $notes_cid = 0, $popup = false)
+{
        $o = '';
 
-       $geotag = (x($x, 'allow_location') ? replace_macros(get_markup_template('jot_geotag.tpl'), array()) : '');
+       $geotag = x($x, 'allow_location') ? replace_macros(get_markup_template('jot_geotag.tpl'), []) : '';
 
        $tpl = get_markup_template('jot-header.tpl');
-       $a->page['htmlhead'] .= replace_macros($tpl, array(
-               '$newpost' => 'true',
-               '$baseurl' => System::baseUrl(true),
-               '$geotag' => $geotag,
-               '$nickname' => $x['nickname'],
-               '$ispublic' => t('Visible to <strong>everybody</strong>'),
-               '$linkurl' => t('Please enter a link URL:'),
-               '$vidurl' => t("Please enter a video link/URL:"),
-               '$audurl' => t("Please enter an audio link/URL:"),
-               '$term' => t('Tag term:'),
-               '$fileas' => t('Save to Folder:'),
-               '$whereareu' => t('Where are you right now?'),
-               '$delitems' => t('Delete item(s)?')
-       ));
+       $a->page['htmlhead'] .= replace_macros($tpl, [
+               '$newpost'   => 'true',
+               '$baseurl'   => System::baseUrl(true),
+               '$geotag'    => $geotag,
+               '$nickname'  => $x['nickname'],
+               '$ispublic'  => L10n::t('Visible to <strong>everybody</strong>'),
+               '$linkurl'   => L10n::t('Please enter a link URL:'),
+               '$vidurl'    => L10n::t("Please enter a video link/URL:"),
+               '$audurl'    => L10n::t("Please enter an audio link/URL:"),
+               '$term'      => L10n::t('Tag term:'),
+               '$fileas'    => L10n::t('Save to Folder:'),
+               '$whereareu' => L10n::t('Where are you right now?'),
+               '$delitems'  => L10n::t('Delete item(s)?')
+       ]);
 
        $tpl = get_markup_template('jot-end.tpl');
-       $a->page['end'] .= replace_macros($tpl, array(
-               '$newpost' => 'true',
-               '$baseurl' => System::baseUrl(true),
-               '$geotag' => $geotag,
-               '$nickname' => $x['nickname'],
-               '$ispublic' => t('Visible to <strong>everybody</strong>'),
-               '$linkurl' => t('Please enter a link URL:'),
-               '$vidurl' => t("Please enter a video link/URL:"),
-               '$audurl' => t("Please enter an audio link/URL:"),
-               '$term' => t('Tag term:'),
-               '$fileas' => t('Save to Folder:'),
-               '$whereareu' => t('Where are you right now?')
-       ));
+       $a->page['end'] .= replace_macros($tpl, [
+               '$newpost'   => 'true',
+               '$baseurl'   => System::baseUrl(true),
+               '$geotag'    => $geotag,
+               '$nickname'  => $x['nickname'],
+               '$ispublic'  => L10n::t('Visible to <strong>everybody</strong>'),
+               '$linkurl'   => L10n::t('Please enter a link URL:'),
+               '$vidurl'    => L10n::t("Please enter a video link/URL:"),
+               '$audurl'    => L10n::t("Please enter an audio link/URL:"),
+               '$term'      => L10n::t('Tag term:'),
+               '$fileas'    => L10n::t('Save to Folder:'),
+               '$whereareu' => L10n::t('Where are you right now?')
+       ]);
 
        $jotplugins = '';
-       call_hooks('jot_tool', $jotplugins);
+       Addon::callHooks('jot_tool', $jotplugins);
 
        // Private/public post links for the non-JS ACL form
        $private_post = 1;
@@ -1268,7 +1308,7 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) {
 
        $query_str = $a->query_string;
        if (strpos($query_str, 'public=1') !== false) {
-               $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
+               $query_str = str_replace(['?public=1', '&public=1'], ['', ''], $query_str);
        }
 
        /*
@@ -1285,67 +1325,65 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) {
        // $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
        $tpl = get_markup_template("jot.tpl");
 
-       $o .= replace_macros($tpl,array(
-               '$return_path' => $query_str,
-               '$action' =>  'item',
-               '$share' => (x($x,'button') ? $x['button'] : t('Share')),
-               '$upload' => t('Upload photo'),
-               '$shortupload' => t('upload photo'),
-               '$attach' => t('Attach file'),
-               '$shortattach' => t('attach file'),
-               '$weblink' => t('Insert web link'),
-               '$shortweblink' => t('web link'),
-               '$video' => t('Insert video link'),
-               '$shortvideo' => t('video link'),
-               '$audio' => t('Insert audio link'),
-               '$shortaudio' => t('audio link'),
-               '$setloc' => t('Set your location'),
-               '$shortsetloc' => t('set location'),
-               '$noloc' => t('Clear browser location'),
-               '$shortnoloc' => t('clear location'),
-               '$title' => $x['title'],
-               '$placeholdertitle' => t('Set title'),
-               '$category' => $x['category'],
-               '$placeholdercategory' => (Features::isEnabled(local_user(), 'categories') ? t('Categories (comma-separated list)') : ''),
-               '$wait' => t('Please wait'),
-               '$permset' => t('Permission settings'),
-               '$shortpermset' => t('permissions'),
-               '$ptyp' => (($notes_cid) ? 'note' : 'wall'),
-               '$content' => $x['content'],
-               '$post_id' => $x['post_id'],
-               '$baseurl' => System::baseUrl(true),
-               '$defloc' => $x['default_location'],
-               '$visitor' => $x['visitor'],
-               '$pvisit' => (($notes_cid) ? 'none' : $x['visitor']),
-               '$public' => t('Public post'),
-               '$jotnets' => $jotnets,
-               '$lockstate' => $x['lockstate'],
-               '$bang' => $x['bang'],
-               '$profile_uid' => $x['profile_uid'],
-               '$preview' => ((Features::isEnabled($x['profile_uid'],'preview')) ? t('Preview') : ''),
-               '$jotplugins' => $jotplugins,
-               '$notes_cid' => $notes_cid,
-               '$sourceapp' => t($a->sourcename),
-               '$cancel' => t('Cancel'),
-               '$rand_num' => random_digits(12),
+       $o .= replace_macros($tpl,[
+               '$return_path'  => $query_str,
+               '$action'       => 'item',
+               '$share'        => defaults($x, 'button', L10n::t('Share')),
+               '$upload'       => L10n::t('Upload photo'),
+               '$shortupload'  => L10n::t('upload photo'),
+               '$attach'       => L10n::t('Attach file'),
+               '$shortattach'  => L10n::t('attach file'),
+               '$weblink'      => L10n::t('Insert web link'),
+               '$shortweblink' => L10n::t('web link'),
+               '$video'        => L10n::t('Insert video link'),
+               '$shortvideo'   => L10n::t('video link'),
+               '$audio'        => L10n::t('Insert audio link'),
+               '$shortaudio'   => L10n::t('audio link'),
+               '$setloc'       => L10n::t('Set your location'),
+               '$shortsetloc'  => L10n::t('set location'),
+               '$noloc'        => L10n::t('Clear browser location'),
+               '$shortnoloc'   => L10n::t('clear location'),
+               '$title'        => defaults($x, 'title', ''),
+               '$placeholdertitle' => L10n::t('Set title'),
+               '$category'     => defaults($x, 'category', ''),
+               '$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? L10n::t('Categories (comma-separated list)') : '',
+               '$wait'         => L10n::t('Please wait'),
+               '$permset'      => L10n::t('Permission settings'),
+               '$shortpermset' => L10n::t('permissions'),
+               '$ptyp'         => $notes_cid ? 'note' : 'wall',
+               '$content'      => defaults($x, 'content', ''),
+               '$post_id'      => defaults($x, 'post_id', ''),
+               '$baseurl'      => System::baseUrl(true),
+               '$defloc'       => $x['default_location'],
+               '$visitor'      => $x['visitor'],
+               '$pvisit'       => $notes_cid ? 'none' : $x['visitor'],
+               '$public'       => L10n::t('Public post'),
+               '$lockstate'    => $x['lockstate'],
+               '$bang'         => $x['bang'],
+               '$profile_uid'  => $x['profile_uid'],
+               '$preview'      => Feature::isEnabled($x['profile_uid'], 'preview') ? L10n::t('Preview') : '',
+               '$jotplugins'   => $jotplugins,
+               '$notes_cid'    => $notes_cid,
+               '$sourceapp'    => L10n::t($a->sourcename),
+               '$cancel'       => L10n::t('Cancel'),
+               '$rand_num'     => random_digits(12),
 
                // ACL permissions box
-               '$acl' => $x['acl'],
-               '$acl_data' => $x['acl_data'],
-               '$group_perms' => t('Post to Groups'),
-               '$contact_perms' => t('Post to Contacts'),
-               '$private' => t('Private post'),
-               '$is_private' => $private_post,
-               '$public_link' => $public_post_link,
+               '$acl'           => $x['acl'],
+               '$group_perms'   => L10n::t('Post to Groups'),
+               '$contact_perms' => L10n::t('Post to Contacts'),
+               '$private'       => L10n::t('Private post'),
+               '$is_private'    => $private_post,
+               '$public_link'   => $public_post_link,
 
                //jot nav tab (used in some themes)
-               '$message' => t('Message'),
-               '$browser' => t('Browser'),
-       ));
+               '$message' => L10n::t('Message'),
+               '$browser' => L10n::t('Browser'),
+       ]);
 
 
        if ($popup == true) {
-               $o = '<div id="jot-popup" style="display: none;">'.$o.'</div>';
+               $o = '<div id="jot-popup" style="display: none;">' . $o . '</div>';
        }
 
        return $o;
@@ -1598,16 +1636,16 @@ function render_location_dummy($item) {
 
 /// @TODO Add type-hint
 function get_responses($conv_responses, $response_verbs, $ob, $item) {
-       $ret = array();
+       $ret = [];
        foreach ($response_verbs as $v) {
-               $ret[$v] = array();
-               $ret[$v]['count'] = ((x($conv_responses[$v], $item['uri'])) ? $conv_responses[$v][$item['uri']] : '');
-               $ret[$v]['list']  = ((x($conv_responses[$v], $item['uri'])) ? $conv_responses[$v][$item['uri'] . '-l'] : '');
-               $ret[$v]['self']  = ((x($conv_responses[$v], $item['uri'])) ? $conv_responses[$v][$item['uri'] . '-self'] : '0');
+               $ret[$v] = [];
+               $ret[$v]['count'] = defaults($conv_responses[$v], $item['uri'], '');
+               $ret[$v]['list']  = defaults($conv_responses[$v], $item['uri'] . '-l', '');
+               $ret[$v]['self']  = defaults($conv_responses[$v], $item['uri'] . '-self', '0');
                if (count($ret[$v]['list']) > MAX_LIKERS) {
                        $ret[$v]['list_part'] = array_slice($ret[$v]['list'], 0, MAX_LIKERS);
                        array_push($ret[$v]['list_part'], '<a href="#" data-toggle="modal" data-target="#' . $v . 'Modal-'
-                               . (($ob) ? $ob->getId() : $item['id']) . '"><b>' . t('View all') . '</b></a>');
+                               . (($ob) ? $ob->getId() : $item['id']) . '"><b>' . L10n::t('View all') . '</b></a>');
                } else {
                        $ret[$v]['list_part'] = '';
                }
@@ -1626,22 +1664,25 @@ function get_responses($conv_responses, $response_verbs, $ob, $item) {
        return $ret;
 }
 
-function get_response_button_text($v, $count) {
+function get_response_button_text($v, $count)
+{
        switch ($v) {
                case 'like':
-                       return tt('Like', 'Likes', $count, 'noun');
+                       $return = tt('Like', 'Likes', $count);
                        break;
                case 'dislike':
-                       return tt('Dislike', 'Dislikes', $count, 'noun');
+                       $return = tt('Dislike', 'Dislikes', $count);
                        break;
                case 'attendyes':
-                       return tt('Attending', 'Attending', $count, 'noun');
+                       $return = tt('Attending', 'Attending', $count);
                        break;
                case 'attendno':
-                       return tt('Not Attending', 'Not Attending', $count, 'noun');
+                       $return = tt('Not Attending', 'Not Attending', $count);
                        break;
                case 'attendmaybe':
-                       return tt('Undecided', 'Undecided', $count, 'noun');
+                       $return = tt('Undecided', 'Undecided', $count);
                        break;
        }
+
+       return $return;
 }