]> git.mxchange.org Git - friendica.git/blobdiff - include/conversation.php
Merge pull request #3819 from annando/photo-rework
[friendica.git] / include / conversation.php
index a937eb69f5fb0abe2fb7f75ab1837bc4e176433b..bc227d97729fb0ac1a2251f2bab3ce48e310f3eb 100644 (file)
@@ -1,12 +1,16 @@
 <?php
 
-require_once("include/bbcode.php");
-require_once("include/acl_selectors.php");
+use Friendica\App;
+use Friendica\Core\System;
 
+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'
+/*
+ * 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) {
 
@@ -30,14 +34,16 @@ function item_extract_images($body) {
                        $new_body = $new_body . substr($orig_body, 0, $img_start) . '[!#saved_image' . $cnt . '#!]';
 
                        $cnt++;
-               }
-               else
+               } else {
                        $new_body = $new_body . substr($orig_body, 0, $img_end + strlen('[/img]'));
+               }
 
                $orig_body = substr($orig_body, $img_end + strlen('[/img]'));
 
-               if ($orig_body === false) // in case the body ends on a closing image tag
+               if ($orig_body === false) {
+                       // in case the body ends on a closing image tag
                        $orig_body = '';
+               }
 
                $img_start = strpos($orig_body, '[img');
                $img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
@@ -60,14 +66,15 @@ function item_redir_and_replace_images($body, $images, $cid) {
        while ($pos !== false && $cnt < 1000) {
 
                $search = '/\[url\=(.*?)\]\[!#saved_image([0-9]*)#!\]\[\/url\]' . '/is';
-               $replace = '[url=' . z_path() . '/redir/' . $cid
+               $replace = '[url=' . System::baseUrl() . '/redir/' . $cid
                                   . '?f=1&url=' . '$1' . '][!#saved_image' . '$2' .'#!][/url]';
 
                $newbody .= substr($origbody, 0, $pos['start']['open']);
                $subject = substr($origbody, $pos['start']['open'], $pos['end']['close'] - $pos['start']['open']);
                $origbody = substr($origbody, $pos['end']['close']);
-               if ($origbody === false)
+               if ($origbody === false) {
                        $origbody = '';
+               }
 
                $subject = preg_replace($search, $replace, $subject);
                $newbody .= $subject;
@@ -79,45 +86,51 @@ function item_redir_and_replace_images($body, $images, $cid) {
 
        $cnt = 0;
        foreach ($images as $image) {
-               // We're depending on the property of 'foreach' (specified on the PHP website) that
-               // it loops over the array starting from the first element and going sequentially
-               // to the last element
+               /*
+                * We're depending on the property of 'foreach' (specified on the PHP website) that
+                * it loops over the array starting from the first element and going sequentially
+                * to the last element.
+                */
                $newbody = str_replace('[!#saved_image' . $cnt . '#!]', '[img]' . $image . '[/img]', $newbody);
                $cnt++;
        }
        return $newbody;
 }}
 
-
-
 /**
  * Render actions localized
  */
-function localize_item(&$item){
+function localize_item(&$item) {
 
        $extracted = item_extract_images($item['body']);
-       if ($extracted['images'])
+       if ($extracted['images']) {
                $item['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $item['contact-id']);
+       }
 
-       $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
-       if (activity_match($item['verb'],ACTIVITY_LIKE)
-               || activity_match($item['verb'],ACTIVITY_DISLIKE)
-               || activity_match($item['verb'],ACTIVITY_ATTEND)
-               || activity_match($item['verb'],ACTIVITY_ATTENDNO)
-               || activity_match($item['verb'],ACTIVITY_ATTENDMAYBE)){
-
-               $r = q("SELECT * from `item`,`contact` WHERE
-                               `item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';",
-                                dbesc($item['parent-uri']));
-               if (!dbm::is_result($r)) return;
-               $obj=$r[0];
+       /// @Separted ???
+       $xmlhead = "<" . "?xml version='1.0' encoding='UTF-8' ?" . ">";
+       if (activity_match($item['verb'], ACTIVITY_LIKE)
+               || activity_match($item['verb'], ACTIVITY_DISLIKE)
+               || activity_match($item['verb'], ACTIVITY_ATTEND)
+               || activity_match($item['verb'], ACTIVITY_ATTENDNO)
+               || activity_match($item['verb'], ACTIVITY_ATTENDMAYBE)) {
+
+               /// @TODO may hurt performance
+               $r = q("SELECT * FROM `item`, `contact`
+                       WHERE `item`.`contact-id`=`contact`.`id`
+                       AND `item`.`uri`='%s'",
+                       dbesc($item['parent-uri']));
+               if (!dbm::is_result($r)) {
+                       return;
+               }
+               $obj = $r[0];
 
                $author  = '[url=' . $item['author-link'] . ']' . $item['author-name'] . '[/url]';
                $objauthor =  '[url=' . $obj['author-link'] . ']' . $obj['author-name'] . '[/url]';
 
-               switch($obj['verb']){
+               switch ($obj['verb']) {
                        case ACTIVITY_POST:
-                               switch ($obj['object-type']){
+                               switch ($obj['object-type']) {
                                        case ACTIVITY_OBJ_EVENT:
                                                $post_type = t('event');
                                                break;
@@ -126,9 +139,10 @@ function localize_item(&$item){
                                }
                                break;
                        default:
-                               if ($obj['resource-id']){
+                               if ($obj['resource-id']) {
                                        $post_type = t('photo');
-                                       $m=array(); preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
+                                       $m = array();
+                                       preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
                                        $rr['plink'] = $m[1];
                                } else {
                                        $post_type = t('status');
@@ -137,25 +151,25 @@ function localize_item(&$item){
 
                $plink = '[url=' . $obj['plink'] . ']' . $post_type . '[/url]';
 
-               if (activity_match($item['verb'],ACTIVITY_LIKE)) {
+               if (activity_match($item['verb'], ACTIVITY_LIKE)) {
                        $bodyverb = t('%1$s likes %2$s\'s %3$s');
                }
-               elseif (activity_match($item['verb'],ACTIVITY_DISLIKE)) {
+               elseif (activity_match($item['verb'], ACTIVITY_DISLIKE)) {
                        $bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
                }
-               elseif (activity_match($item['verb'],ACTIVITY_ATTEND)) {
+               elseif (activity_match($item['verb'], ACTIVITY_ATTEND)) {
                        $bodyverb = t('%1$s attends %2$s\'s %3$s');
                }
-               elseif (activity_match($item['verb'],ACTIVITY_ATTENDNO)) {
+               elseif (activity_match($item['verb'], ACTIVITY_ATTENDNO)) {
                        $bodyverb = t('%1$s doesn\'t attend %2$s\'s %3$s');
                }
-               elseif (activity_match($item['verb'],ACTIVITY_ATTENDMAYBE)) {
+               elseif (activity_match($item['verb'], ACTIVITY_ATTENDMAYBE)) {
                        $bodyverb = t('%1$s attends maybe %2$s\'s %3$s');
                }
                $item['body'] = sprintf($bodyverb, $author, $objauthor, $plink);
 
        }
-       if (activity_match($item['verb'],ACTIVITY_FRIEND)) {
+       if (activity_match($item['verb'], ACTIVITY_FRIEND)) {
 
                if ($item['object-type']=="" || $item['object-type']!== ACTIVITY_OBJ_PERSON) return;
 
@@ -169,57 +183,65 @@ function localize_item(&$item){
 
                $Bname = $obj->title;
                $Blink = ""; $Bphoto = "";
-               foreach ($links->link as $l){
+               foreach ($links->link as $l) {
                        $atts = $l->attributes();
-                       switch($atts['rel']){
+                       switch ($atts['rel']) {
                                case "alternate": $Blink = $atts['href'];
                                case "photo": $Bphoto = $atts['href'];
                        }
-
                }
 
                $A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
                $B = '[url=' . zrl($Blink) . ']' . $Bname . '[/url]';
-               if ($Bphoto!="") $Bphoto = '[url=' . zrl($Blink) . '][img]' . $Bphoto . '[/img][/url]';
+               if ($Bphoto != "") {
+                       $Bphoto = '[url=' . zrl($Blink) . '][img]' . $Bphoto . '[/img][/url]';
+               }
 
                $item['body'] = sprintf( t('%1$s is now friends with %2$s'), $A, $B)."\n\n\n".$Bphoto;
 
        }
-       if (stristr($item['verb'],ACTIVITY_POKE)) {
+       if (stristr($item['verb'], ACTIVITY_POKE)) {
                $verb = urldecode(substr($item['verb'],strpos($item['verb'],'#')+1));
-               if (! $verb)
+               if (! $verb) {
                        return;
-               if ($item['object-type']=="" || $item['object-type']!== ACTIVITY_OBJ_PERSON) return;
+               }
+               if ($item['object-type']=="" || $item['object-type']!== ACTIVITY_OBJ_PERSON) {
+                       return;
+               }
 
                $Aname = $item['author-name'];
                $Alink = $item['author-link'];
 
-               $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
+               $xmlhead = "<" . "?xml version='1.0' encoding='UTF-8' ?" . ">";
 
                $obj = parse_xml_string($xmlhead.$item['object']);
                $links = parse_xml_string($xmlhead."<links>".unxmlify($obj->link)."</links>");
 
                $Bname = $obj->title;
-               $Blink = ""; $Bphoto = "";
-               foreach ($links->link as $l){
+               $Blink = "";
+               $Bphoto = "";
+               foreach ($links->link as $l) {
                        $atts = $l->attributes();
-                       switch($atts['rel']){
+                       switch ($atts['rel']) {
                                case "alternate": $Blink = $atts['href'];
                                case "photo": $Bphoto = $atts['href'];
                        }
-
                }
 
                $A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
                $B = '[url=' . zrl($Blink) . ']' . $Bname . '[/url]';
-               if ($Bphoto!="") $Bphoto = '[url=' . zrl($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]';
+               if ($Bphoto != "") {
+                       $Bphoto = '[url=' . 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.
+               /*
+                * 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');
 
                // now translate the verb
-               $poked_t = trim(sprintf($txt, "",""));
+               $poked_t = trim(sprintf($txt, "", ""));
                $txt = str_replace( $poked_t, t($verb), $txt);
 
                // then do the sprintf on the translation string
@@ -227,10 +249,11 @@ function localize_item(&$item){
                $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)
+       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'];
@@ -241,19 +264,25 @@ function localize_item(&$item){
                $item['body'] = sprintf($txt, $A, t($verb));
        }
 
-       if (activity_match($item['verb'],ACTIVITY_TAG)) {
-               $r = q("SELECT * from `item`,`contact` WHERE
-               `item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';",
-                dbesc($item['parent-uri']));
-               if (!dbm::is_result($r)) return;
-               $obj=$r[0];
+       if (activity_match($item['verb'], ACTIVITY_TAG)) {
+               /// @TODO may hurt performance "joining" two tables + asterisk
+               $r = q("SELECT * FROM `item`, `contact`
+                       WHERE `item`.`contact-id`=`contact`.`id`
+                       AND `item`.`uri`='%s'",
+                       dbesc($item['parent-uri']));
+
+               if (!dbm::is_result($r)) {
+                       return;
+               }
+
+               $obj = $r[0];
 
                $author  = '[url=' . zrl($item['author-link']) . ']' . $item['author-name'] . '[/url]';
                $objauthor =  '[url=' . zrl($obj['author-link']) . ']' . $obj['author-name'] . '[/url]';
 
-               switch($obj['verb']){
+               switch ($obj['verb']) {
                        case ACTIVITY_POST:
-                               switch ($obj['object-type']){
+                               switch ($obj['object-type']) {
                                        case ACTIVITY_OBJ_EVENT:
                                                $post_type = t('event');
                                                break;
@@ -262,13 +291,15 @@ function localize_item(&$item){
                                }
                                break;
                        default:
-                               if ($obj['resource-id']){
+                               if ($obj['resource-id']) {
                                        $post_type = t('photo');
                                        $m=array(); preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
                                        $rr['plink'] = $m[1];
                                } else {
                                        $post_type = t('status');
                                }
+                               // Let's break everthing ... ;-)
+                               break;
                }
                $plink = '[url=' . $obj['plink'] . ']' . $post_type . '[/url]';
 
@@ -278,22 +309,24 @@ function localize_item(&$item){
                $item['body'] = sprintf( t('%1$s tagged %2$s\'s %3$s with %4$s'), $author, $objauthor, $plink, $tag );
 
        }
-       if (activity_match($item['verb'],ACTIVITY_FAVORITE)){
+       if (activity_match($item['verb'], ACTIVITY_FAVORITE)) {
 
-               if ($item['object-type']== "")
+               if ($item['object-type'] == "") {
                        return;
+               }
 
                $Aname = $item['author-name'];
                $Alink = $item['author-link'];
 
-               $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
+               $xmlhead = "<" . "?xml version='1.0' encoding='UTF-8' ?" . ">";
 
                $obj = parse_xml_string($xmlhead.$item['object']);
                if (strlen($obj->id)) {
-                       $r = q("select * from item where uri = '%s' and uid = %d limit 1",
+                       $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
                                        dbesc($obj->id),
                                        intval($item['uid'])
                        );
+
                        if (dbm::is_result($r) && $r[0]['plink']) {
                                $target = $r[0];
                                $Bname = $target['author-name'];
@@ -302,22 +335,21 @@ function localize_item(&$item){
                                $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";
-
                        }
                }
        }
        $matches = null;
-       if (preg_match_all('/@\[url=(.*?)\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
+       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']);
+                       if (! strpos($mtch[1], 'zrl=')) {
+                               $item['body'] = str_replace($mtch[0], '@[url=' . zrl($mtch[1]) . ']', $item['body']);
                        }
                }
        }
 
        // add zrl's to public images
        $photo_pattern = "/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is";
-       if (preg_match($photo_pattern,$item['body'])) {
+       if (preg_match($photo_pattern, $item['body'])) {
                $photo_replace = '[url=' . 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']);
        }
@@ -327,27 +359,26 @@ function localize_item(&$item){
        $x = stristr($item['plink'],'/display/');
        if ($x) {
                $sparkle = false;
-               $y = best_link_url($item,$sparkle,true);
+               $y = best_link_url($item, $sparkle);
 
-               if (strstr($y,'/redir/')) {
+               if (strstr($y, '/redir/')) {
                        $item['plink'] = $y . '?f=&url=' . $item['plink'];
                }
        }
-
-
-
 }
 
 /**
  * Count the total of comments on this item and its desendants
+ * @TODO proper type-hint + doc-tag
  */
 function count_descendants($item) {
        $total = count($item['children']);
 
        if ($total > 0) {
                foreach ($item['children'] as $child) {
-                       if (! visible_activity($child))
+                       if (! visible_activity($child)) {
                                $total --;
+                       }
                        $total += count_descendants($child);
                }
        }
@@ -357,17 +388,18 @@ function count_descendants($item) {
 
 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
-
+       /*
+        * 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);
        foreach ($hidden_activities as $act) {
-               if (activity_match($item['verb'],$act)) {
+               if (activity_match($item['verb'], $act)) {
                        return false;
                }
        }
 
-       if (activity_match($item['verb'],ACTIVITY_FOLLOW) && $item['object-type'] === ACTIVITY_OBJ_NOTE) {
+       if (activity_match($item['verb'], ACTIVITY_FOLLOW) && $item['object-type'] === ACTIVITY_OBJ_NOTE) {
                if (! (($item['self']) && ($item['uid'] == local_user()))) {
                        return false;
                }
@@ -380,9 +412,8 @@ function visible_activity($item) {
  * @brief SQL query for items
  */
 function item_query() {
-
-       return "SELECT ".item_fieldlists()." FROM `item` ".
-               item_joins()." WHERE ".item_condition();
+       return "SELECT " . item_fieldlists() . " FROM `item` " .
+               item_joins() . " WHERE " . item_condition();
 }
 
 /**
@@ -394,7 +425,6 @@ function item_fieldlists() {
 These Fields are not added below (yet). They are here to for bug search.
 `item`.`type`,
 `item`.`extid`,
-`item`.`received`,
 `item`.`changed`,
 `item`.`moderated`,
 `item`.`target-type`,
@@ -421,7 +451,7 @@ These Fields are not added below (yet). They are here to for bug search.
                `item`.`owner-id`, `item`.`owner-link`, `item`.`owner-name`, `item`.`owner-avatar`,
                `item`.`contact-id`, `item`.`uid`, `item`.`id`, `item`.`parent`,
                `item`.`uri`, `item`.`thr-parent`, `item`.`parent-uri`,
-               `item`.`commented`, `item`.`created`, `item`.`edited`,
+               `item`.`commented`, `item`.`created`, `item`.`edited`, `item`.`received`,
                `item`.`verb`, `item`.`object-type`, `item`.`postopts`, `item`.`plink`,
                `item`.`guid`, `item`.`wall`, `item`.`private`, `item`.`starred`,
                `item`.`title`, `item`.`body`, `item`.`file`, `item`.`event-id`,
@@ -433,28 +463,35 @@ These Fields are not added below (yet). They are here to for bug search.
                `author`.`thumb` AS `author-thumb`, `owner`.`thumb` AS `owner-thumb`,
 
                `contact`.`network`, `contact`.`url`, `contact`.`name`, `contact`.`writable`,
-               `contact`.`self`, `contact`.`id` AS `cid`, `contact`.`alias`";
+               `contact`.`self`, `contact`.`id` AS `cid`, `contact`.`alias`,
+
+               `event`.`created` AS `event-created`, `event`.`edited` AS `event-edited`,
+               `event`.`start` AS `event-start`,`event`.`finish` AS `event-finish`,
+               `event`.`summary` AS `event-summary`,`event`.`desc` AS `event-desc`,
+               `event`.`location` AS `event-location`, `event`.`type` AS `event-type`,
+               `event`.`nofinish` AS `event-nofinish`,`event`.`adjust` AS `event-adjust`,
+               `event`.`ignore` AS `event-ignore`, `event`.`id` AS `event-id`";
 }
 
 /**
  * @brief SQL join for contacts that are needed for displaying items
  */
 function item_joins() {
-
        return "STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND
                (NOT `contact`.`blocked` OR `contact`.`pending`)
                LEFT JOIN `contact` AS `author` ON `author`.`id`=`item`.`author-id`
-               LEFT JOIN `contact` AS `owner` ON `owner`.`id`=`item`.`owner-id`";
+               LEFT JOIN `contact` AS `owner` ON `owner`.`id`=`item`.`owner-id`
+               LEFT JOIN `event` ON `event-id` = `event`.`id`";
 }
 
 /**
  * @brief SQL condition for items that are needed for displaying items
  */
 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:
@@ -465,13 +502,11 @@ function item_condition() {
  * that are based on unique features of the calling module.
  *
  */
-
-if (!function_exists('conversation')) {
 function conversation(App $a, $items, $mode, $update, $preview = false) {
 
-       require_once('include/bbcode.php');
-       require_once('include/Contact.php');
-       require_once('mod/proxy.php');
+       require_once 'include/bbcode.php';
+       require_once 'include/Contact.php';
+       require_once 'mod/proxy.php';
 
        $ssl_state = ((local_user()) ? true : false);
 
@@ -482,9 +517,9 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
        $arr_blocked = null;
 
        if (local_user()) {
-               $str_blocked = get_pconfig(local_user(),'system','blocked');
+               $str_blocked = get_pconfig(local_user(), 'system', 'blocked');
                if ($str_blocked) {
-                       $arr_blocked = explode(',',$str_blocked);
+                       $arr_blocked = explode(',', $str_blocked);
                        for ($x = 0; $x < count($arr_blocked); $x ++) {
                                $arr_blocked[$x] = trim($arr_blocked[$x]);
                        }
@@ -498,31 +533,31 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                $profile_owner = local_user();
                $page_writeable = true;
                if (!$update) {
-                       // The special div is needed for liveUpdate to kick in for this page.
-                       // We only launch liveUpdate if you aren't filtering in some incompatible
-                       // way and also you aren't writing a comment (discovered in javascript).
-
+                       /*
+                        * The special div is needed for liveUpdate to kick in for this page.
+                        * We only launch liveUpdate if you aren't filtering in some incompatible
+                        * way and also you aren't writing a comment (discovered in javascript).
+                        */
                        $live_update_div = '<div id="live-network"></div>' . "\r\n"
                                . "<script> var profile_uid = " . $_SESSION['uid']
-                               . "; var netargs = '" . substr($a->cmd,8)
+                               . "; var netargs = '" . substr($a->cmd, 8)
                                . '?f='
-                               . ((x($_GET,'cid'))    ? '&cid='    . $_GET['cid']    : '')
-                               . ((x($_GET,'search')) ? '&search=' . $_GET['search'] : '')
-                               . ((x($_GET,'star'))   ? '&star='   . $_GET['star']   : '')
-                               . ((x($_GET,'order'))  ? '&order='  . $_GET['order']  : '')
-                               . ((x($_GET,'bmark'))  ? '&bmark='  . $_GET['bmark']  : '')
-                               . ((x($_GET,'liked'))  ? '&liked='  . $_GET['liked']  : '')
-                               . ((x($_GET,'conv'))   ? '&conv='   . $_GET['conv']   : '')
-                               . ((x($_GET,'spam'))   ? '&spam='   . $_GET['spam']   : '')
-                               . ((x($_GET,'nets'))   ? '&nets='   . $_GET['nets']   : '')
-                               . ((x($_GET,'cmin'))   ? '&cmin='   . $_GET['cmin']   : '')
-                               . ((x($_GET,'cmax'))   ? '&cmax='   . $_GET['cmax']   : '')
-                               . ((x($_GET,'file'))   ? '&file='   . $_GET['file']   : '')
+                               . ((x($_GET, 'cid'))    ? '&cid='    . $_GET['cid']    : '')
+                               . ((x($_GET, 'search')) ? '&search=' . $_GET['search'] : '')
+                               . ((x($_GET, 'star'))   ? '&star='   . $_GET['star']   : '')
+                               . ((x($_GET, 'order'))  ? '&order='  . $_GET['order']  : '')
+                               . ((x($_GET, 'bmark'))  ? '&bmark='  . $_GET['bmark']  : '')
+                               . ((x($_GET, 'liked'))  ? '&liked='  . $_GET['liked']  : '')
+                               . ((x($_GET, 'conv'))   ? '&conv='   . $_GET['conv']   : '')
+                               . ((x($_GET, 'spam'))   ? '&spam='   . $_GET['spam']   : '')
+                               . ((x($_GET, 'nets'))   ? '&nets='   . $_GET['nets']   : '')
+                               . ((x($_GET, 'cmin'))   ? '&cmin='   . $_GET['cmin']   : '')
+                               . ((x($_GET, 'cmax'))   ? '&cmax='   . $_GET['cmax']   : '')
+                               . ((x($_GET, 'file'))   ? '&file='   . $_GET['file']   : '')
 
                                . "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
                }
-       }
-       else if ($mode === 'profile') {
+       } elseif ($mode === 'profile') {
                $profile_owner = $a->profile['profile_uid'];
                $page_writeable = can_write_wall($a,$profile_owner);
 
@@ -530,16 +565,17 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                        $tab = notags(trim($_GET['tab']));
                        $tab = ( $tab ? $tab : 'posts' );
                        if ($tab === 'posts') {
-                               // This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
-                               // because browser prefetching might change it on us. We have to deliver it with the page.
+                               /*
+                                * This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
+                                * because browser prefetching might change it on us. We have to deliver it with the page.
+                                */
 
                                $live_update_div = '<div id="live-profile"></div>' . "\r\n"
                                        . "<script> var profile_uid = " . $a->profile['profile_uid']
                                        . "; var netargs = '?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
                        }
                }
-       }
-       else if ($mode === 'notes') {
+       } elseif ($mode === 'notes') {
                $profile_owner = local_user();
                $page_writeable = true;
                if (!$update) {
@@ -547,8 +583,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                . "<script> var profile_uid = " . local_user()
                                . "; var netargs = '/?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
                }
-       }
-       else if ($mode === 'display') {
+       } elseif ($mode === 'display') {
                $profile_owner = $a->profile['uid'];
                $page_writeable = can_write_wall($a,$profile_owner);
                if (!$update) {
@@ -556,26 +591,25 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                . "<script> var profile_uid = " . $_SESSION['uid'] . ";"
                                . " var profile_page = 1; </script>";
                }
-       }
-       else if ($mode === 'community') {
+       } elseif ($mode === 'community') {
                $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";
                }
-       }
-       else if ($mode === 'search') {
+       } elseif ($mode === 'search') {
                $live_update_div = '<div id="live-search"></div>' . "\r\n";
        }
 
        $page_dropping = ((local_user() && local_user() == $profile_owner) ? true : false);
 
 
-       if ($update)
+       if ($update) {
                $return_url = $_SESSION['return_url'];
-       else
+       } else {
                $return_url = $_SESSION['return_url'] = $a->query_string;
+       }
 
        $cb = array('items' => $items, 'mode' => $mode, 'update' => $update, 'preview' => $preview);
        call_hooks('conversation_start',$cb);
@@ -600,10 +634,13 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
 
                if ($mode === 'network-new' || $mode === 'search' || $mode === 'community') {
 
-                       // "New Item View" on network page or search page results
-                       // - just loop through the items and format them minimally for display
+                       /*
+                        * "New Item View" on network page or search page results
+                        * - just loop through the items and format them minimally for display
+                        */
 
-//                     $tpl = get_markup_template('search_item.tpl');
+                       /// @TODO old lost code?
+                       // $tpl = get_markup_template('search_item.tpl');
                        $tpl = 'search_item.tpl';
 
                        foreach ($items as $item) {
@@ -611,13 +648,14 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                if ($arr_blocked) {
                                        $blocked = false;
                                        foreach ($arr_blocked as $b) {
-                                               if ($b && link_compare($item['author-link'],$b)) {
+                                               if ($b && link_compare($item['author-link'], $b)) {
                                                        $blocked = true;
                                                        break;
                                                }
                                        }
-                                       if ($blocked)
+                                       if ($blocked) {
                                                continue;
+                                       }
                                }
 
 
@@ -629,69 +667,80 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                $sparkle     = '';
 
                                if ($mode === 'search' || $mode === 'community') {
-                                       if (((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE)))
+                                       if (((activity_match($item['verb'], ACTIVITY_LIKE)) || (activity_match($item['verb'], ACTIVITY_DISLIKE)))
                                                && ($item['id'] != $item['parent']))
                                                continue;
                                        $nickname = $item['nickname'];
-                               }
-                               else
+                               } else {
                                        $nickname = $a->user['nickname'];
+                               }
 
                                // prevent private email from leaking.
-                               if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid'])
-                                               continue;
+                               if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
+                                       continue;
+                               }
 
-                               $profile_name   = ((strlen($item['author-name']))   ? $item['author-name']   : $item['name']);
-                               if ($item['author-link'] && (! $item['author-name']))
+                               $profile_name = ((strlen($item['author-name'])) ? $item['author-name'] : $item['name']);
+                               if ($item['author-link'] && (! $item['author-name'])) {
                                        $profile_name = $item['author-link'];
+                               }
 
-
-
-                               $tags=array();
+                               $tags = array();
                                $hashtags = array();
                                $mentions = array();
 
-                               $taglist = q("SELECT `type`, `term`, `url` FROM `term` WHERE `otype` = %d AND `oid` = %d AND `type` IN (%d, %d) ORDER BY `tid`",
-                                               intval(TERM_OBJ_POST), intval($item['id']), intval(TERM_HASHTAG), intval(TERM_MENTION));
+                               $searchpath = System::baseUrl()."/search?tag=";
 
-                               foreach ($taglist as $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')));
 
-                                       if ($tag["url"] == "")
-                                               $tag["url"] = $searchpath.strtolower($tag["term"]);
+                               while ($tag = dba::fetch($taglist)) {
+                                       if ($tag["url"] == "") {
+                                               $tag["url"] = $searchpath . strtolower($tag["term"]);
+                                       }
+
+                                       $tag["url"] = best_link_url($item, $sp, $tag["url"]);
 
                                        if ($tag["type"] == TERM_HASHTAG) {
-                                               $hashtags[] = "#<a href=\"".$tag["url"]."\" target=\"_blank\">".$tag["term"]."</a>";
+                                               $hashtags[] = "#<a href=\"" . $tag["url"] . "\" target=\"_blank\">" . $tag["term"] . "</a>";
                                                $prefix = "#";
                                        } elseif ($tag["type"] == TERM_MENTION) {
-                                               $mentions[] = "@<a href=\"".$tag["url"]."\" target=\"_blank\">".$tag["term"]."</a>";
+                                               $mentions[] = "@<a href=\"" . $tag["url"] . "\" target=\"_blank\">" . $tag["term"] . "</a>";
                                                $prefix = "@";
                                        }
-                                       $tags[] = $prefix."<a href=\"".$tag["url"]."\" target=\"_blank\">".$tag["term"]."</a>";
+                                       $tags[] = $prefix."<a href=\"" . $tag["url"] . "\" target=\"_blank\">" . $tag["term"] . "</a>";
                                }
+                               dba::close($taglist);
 
                                $sp = false;
-                               $profile_link = best_link_url($item,$sp);
-                               if ($profile_link === 'mailbox')
+                               $profile_link = best_link_url($item, $sp);
+                               if ($profile_link === 'mailbox') {
                                        $profile_link = '';
-                               if ($sp)
+                               }
+
+                               if ($sp) {
                                        $sparkle = ' sparkle';
-                               else
+                               } else {
                                        $profile_link = zrl($profile_link);
+                               }
 
-                               if (!isset($item['author-thumb']) OR ($item['author-thumb'] == "")) {
+                               if (!x($item, 'author-thumb') || ($item['author-thumb'] == "")) {
                                        $author_contact = get_contact_details_by_url($item['author-link'], $profile_owner);
-                                       if ($author_contact["thumb"])
+                                       if ($author_contact["thumb"]) {
                                                $item['author-thumb'] = $author_contact["thumb"];
-                                       else
+                                       } else {
                                                $item['author-thumb'] = $item['author-avatar'];
+                                       }
                                }
 
-                               if (!isset($item['owner-thumb']) OR ($item['owner-thumb'] == "")) {
+                               if (!isset($item['owner-thumb']) || ($item['owner-thumb'] == "")) {
                                        $owner_contact = get_contact_details_by_url($item['owner-link'], $profile_owner);
-                                       if ($owner_contact["thumb"])
+                                       if ($owner_contact["thumb"]) {
                                                $item['owner-thumb'] = $owner_contact["thumb"];
-                                       else
+                                       } else {
                                                $item['owner-thumb'] = $item['owner-avatar'];
+                                       }
                                }
 
                                $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
@@ -700,11 +749,11 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_dummy($locate));
 
                                localize_item($item);
-                               if ($mode === 'network-new')
+                               if ($mode === 'network-new') {
                                        $dropping = true;
-                               else
+                               } else {
                                        $dropping = false;
-
+                               }
 
                                $drop = array(
                                        'dropping' => $dropping,
@@ -720,8 +769,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                $likebuttons = false;
                                $shareable = false;
 
-                               $body = prepare_body($item,true, $preview);
-
+                               $body = prepare_body($item, true, $preview);
 
                                list($categories, $folders) = get_cats_and_terms($item);
 
@@ -734,8 +782,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                        $mentions_e = template_escape($mentions);
                                        $location_e = template_escape($location);
                                        $owner_name_e = template_escape($owner_name);
-                               }
-                               else {
+                               } else {
                                        $profile_name_e = $profile_name;
                                        $item['title_e'] = $item['title'];
                                        $body_e = $body;
@@ -746,12 +793,14 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                        $owner_name_e = $owner_name;
                                }
 
-                               if ($item['item_network'] == "")
+                               if ($item['item_network'] == "") {
                                        $item['item_network'] = $item['network'];
+                               }
 
                                $tmp_item = array(
                                        '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'])),
@@ -760,7 +809,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                        'name' => $profile_name_e,
                                        'sparkle' => $sparkle,
                                        'lock' => $lock,
-                                       'thumb' => App::remove_baseurl(proxy_url($item['author-thumb'], false, PROXY_SIZE_THUMB)),
+                                       'thumb' => System::removedBaseUrl(proxy_url($item['author-thumb'], false, PROXY_SIZE_THUMB)),
                                        'title' => $item['title_e'],
                                        'body' => $body_e,
                                        'tags' => $tags_e,
@@ -779,7 +828,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                        'indent' => '',
                                        'owner_name' => $owner_name_e,
                                        'owner_url' => $owner_url,
-                                       'owner_photo' => App::remove_baseurl(proxy_url($item['owner-thumb'], false, PROXY_SIZE_THUMB)),
+                                       'owner_photo' => System::removedBaseUrl(proxy_url($item['owner-thumb'], false, PROXY_SIZE_THUMB)),
                                        'plink' => get_plink($item),
                                        'edpost' => false,
                                        'isstarred' => $isstarred,
@@ -804,39 +853,36 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                $threads[$threadsid]['items'] = array($arr['output']);
 
                        }
-               }
-               else
-               {
+               } else {
                        // Normal View
                        $page_template = get_markup_template("threaded_conversation.tpl");
 
-                       require_once('object/Conversation.php');
-                       require_once('object/Item.php');
+                       require_once 'object/Conversation.php';
+                       require_once 'object/Item.php';
 
                        $conv = new Conversation($mode, $preview);
 
-                       // 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
-
+                       /*
+                        * 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) {
-
-                                               if ($b && link_compare($item['author-link'],$b)) {
+                                               if ($b && link_compare($item['author-link'], $b)) {
                                                        $blocked = true;
                                                        break;
                                                }
                                        }
-                                       if ($blocked)
+                                       if ($blocked) {
                                                continue;
+                                       }
                                }
 
-
-
                                // Can we put this after the visibility check?
                                builtin_activity_puller($item, $conv_responses);
 
@@ -844,6 +890,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
                                        continue;
                                }
+
                                if (! visible_activity($item)) {
                                        continue;
                                }
@@ -868,20 +915,20 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
        }
 
        $o = replace_macros($page_template, array(
-               '$baseurl' => App::get_baseurl($ssl_state),
+               '$baseurl' => System::baseUrl($ssl_state),
                '$return_path' => $a->query_string,
                '$live_update' => $live_update_div,
                '$remove' => t('remove'),
                '$mode' => $mode,
                '$user' => $a->user,
                '$threads' => $threads,
-               '$dropping' => ($page_dropping && feature_enabled(local_user(),'multi_delete') ? t('Delete Selected Items') : False),
+               '$dropping' => ($page_dropping && feature_enabled(local_user(), 'multi_delete') ? t('Delete Selected Items') : False),
        ));
 
        return $o;
 }}
 
-function best_link_url($item,&$sparkle,$ssl_state = false) {
+function best_link_url($item, &$sparkle, $url = '') {
 
        $best_url = '';
        $sparkle  = false;
@@ -889,33 +936,37 @@ function best_link_url($item,&$sparkle,$ssl_state = false) {
        $clean_url = normalise_link($item['author-link']);
 
        if (local_user()) {
-               $r = q("SELECT `id` FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `nurl` = '%s' AND NOT `pending` LIMIT 1",
-                       dbesc(NETWORK_DFRN), intval(local_user()), dbesc(normalise_link($clean_url)));
-               if ($r) {
-                       $best_url = 'redir/'.$r[0]['id'];
+               $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'];
                        $sparkle = true;
+                       if ($url != '') {
+                               $hostname = get_app()->get_hostname();
+                               if (!strstr($url, $hostname)) {
+                                       $best_url .= "?url=".$url;
+                               } else {
+                                       $best_url = $url;
+                               }
+                       }
                }
        }
        if (! $best_url) {
-               if (strlen($item['author-link']))
+               if ($url != '') {
+                       $best_url = $url;
+               } elseif (strlen($item['author-link'])) {
                        $best_url = $item['author-link'];
-               else
+               } else {
                        $best_url = $item['url'];
+               }
        }
 
        return $best_url;
 }
 
 
-if (! function_exists('item_photo_menu')) {
-function item_photo_menu($item)
-{
-       $ssl_state = false;
-
-       if (local_user()) {
-               $ssl_state = true;
-       }
-
+function item_photo_menu($item) {
        $sub_link = '';
        $poke_link = '';
        $contact_url = '';
@@ -930,7 +981,7 @@ function item_photo_menu($item)
        }
 
        $sparkle = false;
-       $profile_link = best_link_url($item, $sparkle, $ssl_state);
+       $profile_link = best_link_url($item, $sparkle);
        if ($profile_link === 'mailbox') {
                $profile_link = '';
        }
@@ -938,12 +989,11 @@ function item_photo_menu($item)
        $cid = 0;
        $network = '';
        $rel = 0;
-       $r = q("SELECT `id`, `network`, `rel` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' LIMIT 1",
-               intval(local_user()), dbesc(normalise_link($item['author-link'])));
-       if ($r) {
-               $cid = $r[0]['id'];
-               $network = $r[0]['network'];
-               $rel = $r[0]['rel'];
+       $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'];
        }
 
        if ($sparkle) {
@@ -966,7 +1016,7 @@ function item_photo_menu($item)
        }
 
        if (local_user()) {
-               $menu = Array(
+               $menu = array(
                        t('Follow Thread') => $sub_link,
                        t('View Status') => $status_link,
                        t('View Profile') => $profile_link,
@@ -980,7 +1030,7 @@ function item_photo_menu($item)
                        $menu[t("Poke")] = $poke_link;
                }
 
-               if ((($cid == 0) OR ($rel == CONTACT_IS_FOLLOWER)) AND
+               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']);
                }
@@ -1004,8 +1054,9 @@ 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.
@@ -1014,13 +1065,12 @@ function item_photo_menu($item)
  * @param array &$conv_responses (already created with builtin activity structure)
  * @return void
  */
-if (! function_exists('builtin_activity_puller')) {
 function builtin_activity_puller($item, &$conv_responses) {
        foreach ($conv_responses as $mode => $v) {
                $url = '';
                $sparkle = '';
 
-               switch($mode) {
+               switch ($mode) {
                        case 'like':
                                $verb = ACTIVITY_LIKE;
                                break;
@@ -1043,30 +1093,34 @@ function builtin_activity_puller($item, &$conv_responses) {
 
                if ((activity_match($item['verb'], $verb)) && ($item['id'] != $item['parent'])) {
                        $url = $item['author-link'];
-                       if ((local_user()) && (local_user() == $item['uid']) && ($item['network'] === NETWORK_DFRN) && (! $item['self']) && (link_compare($item['author-link'],$item['url']))) {
+                       if ((local_user()) && (local_user() == $item['uid']) && ($item['network'] === NETWORK_DFRN) && (! $item['self']) && (link_compare($item['author-link'], $item['url']))) {
                                $url = 'redir/' . $item['contact-id'];
                                $sparkle = ' class="sparkle" ';
-                       }
-                       else
+                       } else {
                                $url = zrl($url);
+                       }
 
                        $url = '<a href="'. $url . '"'. $sparkle .'>' . htmlentities($item['author-name']) . '</a>';
 
-                       if (! $item['thr-parent'])
+                       if (! $item['thr-parent']) {
                                $item['thr-parent'] = $item['parent-uri'];
+                       }
 
                        if (! ((isset($conv_responses[$mode][$item['thr-parent'] . '-l']))
-                               && (is_array($conv_responses[$mode][$item['thr-parent'] . '-l']))))
+                               && (is_array($conv_responses[$mode][$item['thr-parent'] . '-l'])))) {
                                $conv_responses[$mode][$item['thr-parent'] . '-l'] = array();
+                       }
 
                        // only list each unique author once
-                       if (in_array($url,$conv_responses[$mode][$item['thr-parent'] . '-l']))
+                       if (in_array($url,$conv_responses[$mode][$item['thr-parent'] . '-l'])) {
                                continue;
+                       }
 
-                       if (! isset($conv_responses[$mode][$item['thr-parent']]))
+                       if (! isset($conv_responses[$mode][$item['thr-parent']])) {
                                $conv_responses[$mode][$item['thr-parent']] = 1;
-                       else
+                       } else {
                                $conv_responses[$mode][$item['thr-parent']] ++;
+                       }
 
                        if (public_contact() == $item['author-id']) {
                                $conv_responses[$mode][$item['thr-parent'] . '-self'] = 1;
@@ -1080,15 +1134,16 @@ function builtin_activity_puller($item, &$conv_responses) {
        }
 }}
 
-// Format the vote text for a profile item
-// $cnt = number of people who vote the item
-// $arr = array of pre-linked names of likers/dislikers
-// $type = one of 'like, 'dislike', 'attendyes', 'attendno', 'attendmaybe'
-// $id  = item id
-// returns formatted text
-
 if (! function_exists('format_like')) {
-function format_like($cnt,$arr,$type,$id) {
+/**
+ * Format the vote text for a profile item
+ * @param int $cnt = number of people who vote the item
+ * @param array $arr = array of pre-linked names of likers/dislikers
+ * @param string $type = one of 'like, 'dislike', 'attendyes', 'attendno', 'attendmaybe'
+ * @param int $id  = item id
+ * @return formatted text
+ */
+function format_like($cnt, array $arr, $type, $id) {
        $o = '';
        $expanded = '';
 
@@ -1097,7 +1152,7 @@ function format_like($cnt,$arr,$type,$id) {
 
                // Phrase if there is only one liker. In other cases it will be uses for the expanded
                // list which show all likers
-               switch($type) {
+               switch ($type) {
                        case 'like' :
                                $phrase = sprintf( t('%s likes this.'), $likers);
                                break;
@@ -1118,8 +1173,9 @@ function format_like($cnt,$arr,$type,$id) {
 
        if ($cnt > 1) {
                $total = count($arr);
-               if ($total >= MAX_LIKERS)
+               if ($total >= MAX_LIKERS) {
                        $arr = array_slice($arr, 0, MAX_LIKERS - 1);
+               }
                if ($total < MAX_LIKERS) {
                        $last = t('and') . ' ' . $arr[count($arr)-1];
                        $arr2 = array_slice($arr, 0, -1);
@@ -1134,7 +1190,7 @@ function format_like($cnt,$arr,$type,$id) {
 
                $spanatts = "class=\"fakelink\" onclick=\"openClose('{$type}list-$id');\"";
 
-               switch($type) {
+               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);
@@ -1171,16 +1227,15 @@ function format_like($cnt,$arr,$type,$id) {
        return $o;
 }}
 
-
-function status_editor($a,$x, $notes_cid = 0, $popup=false) {
+function status_editor(App $a, $x, $notes_cid = 0, $popup = false) {
        $o = '';
 
-       $geotag = (($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'), array()) : '');
 
        $tpl = get_markup_template('jot-header.tpl');
        $a->page['htmlhead'] .= replace_macros($tpl, array(
                '$newpost' => 'true',
-               '$baseurl' => App::get_baseurl(true),
+               '$baseurl' => System::baseUrl(true),
                '$geotag' => $geotag,
                '$nickname' => $x['nickname'],
                '$ispublic' => t('Visible to <strong>everybody</strong>'),
@@ -1196,7 +1251,7 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
        $tpl = get_markup_template('jot-end.tpl');
        $a->page['end'] .= replace_macros($tpl, array(
                '$newpost' => 'true',
-               '$baseurl' => App::get_baseurl(true),
+               '$baseurl' => System::baseUrl(true),
                '$geotag' => $geotag,
                '$nickname' => $x['nickname'],
                '$ispublic' => t('Visible to <strong>everybody</strong>'),
@@ -1213,24 +1268,27 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
 
        // Private/public post links for the non-JS ACL form
        $private_post = 1;
-       if ($_REQUEST['public'])
+       if (x($_REQUEST, 'public')) {
                $private_post = 0;
+       }
 
        $query_str = $a->query_string;
-       if (strpos($query_str, 'public=1') !== false)
+       if (strpos($query_str, 'public=1') !== false) {
                $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
+       }
 
-       // I think $a->query_string may never have ? in it, but I could be wrong
-       // It looks like it's from the index.php?q=[etc] rewrite that the web
-       // server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
-       if (strpos($query_str, '?') === false)
+       /*
+        * I think $a->query_string may never have ? in it, but I could be wrong
+        * It looks like it's from the index.php?q=[etc] rewrite that the web
+        * server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
+        */
+       if (strpos($query_str, '?') === false) {
                $public_post_link = '?public=1';
-       else
+       } else {
                $public_post_link = '&public=1';
+       }
 
-
-
-//     $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+       // $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
        $tpl = get_markup_template("jot.tpl");
 
        $o .= replace_macros($tpl,array(
@@ -1254,14 +1312,14 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
                '$title' => $x['title'],
                '$placeholdertitle' => t('Set title'),
                '$category' => $x['category'],
-               '$placeholdercategory' => (feature_enabled(local_user(),'categories') ? t('Categories (comma-separated list)') : ''),
+               '$placeholdercategory' => (feature_enabled(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' => App::get_baseurl(true),
+               '$baseurl' => System::baseUrl(true),
                '$defloc' => $x['default_location'],
                '$visitor' => $x['visitor'],
                '$pvisit' => (($notes_cid) ? 'none' : $x['visitor']),
@@ -1292,9 +1350,8 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
        ));
 
 
-       if ($popup==true){
+       if ($popup == true) {
                $o = '<div id="jot-popup" style="display: none;">'.$o.'</div>';
-
        }
 
        return $o;
@@ -1306,18 +1363,18 @@ function get_item_children($arr, $parent) {
        $a = get_app();
        foreach ($arr as $item) {
                if ($item['id'] != $item['parent']) {
-                       if (get_config('system','thread_allow') && $a->theme_thread_allow) {
+                       if (get_config('system', 'thread_allow') && $a->theme_thread_allow) {
                                // Fallback to parent-uri if thr-parent is not set
                                $thr_parent = $item['thr-parent'];
-                               if ($thr_parent == '')
+                               if ($thr_parent == '') {
                                        $thr_parent = $item['parent-uri'];
+                               }
 
                                if ($thr_parent == $parent['uri']) {
                                        $item['children'] = get_item_children($arr, $item);
                                        $children[] = $item;
                                }
-                       }
-                       else if ($item['parent'] == $parent['id']) {
+                       } elseif ($item['parent'] == $parent['id']) {
                                $children[] = $item;
                        }
                }
@@ -1325,9 +1382,10 @@ function get_item_children($arr, $parent) {
        return $children;
 }
 
+/// @TODO Add type-hint
 function sort_item_children($items) {
        $result = $items;
-       usort($result,'sort_thr_created_rev');
+       usort($result, 'sort_thr_created_rev');
        foreach ($result as $k => $i) {
                if (count($result[$k]['children'])) {
                        $result[$k]['children'] = sort_item_children($result[$k]['children']);
@@ -1336,28 +1394,36 @@ function sort_item_children($items) {
        return $result;
 }
 
+/// @TODO Add type-hint
 function add_children_to_list($children, &$arr) {
        foreach ($children as $y) {
                $arr[] = $y;
-               if (count($y['children']))
+               if (count($y['children'])) {
                        add_children_to_list($y['children'], $arr);
+               }
        }
 }
 
-function conv_sort($arr,$order) {
+/// @TODO Add type-hint
+function conv_sort($arr, $order) {
 
-       if ((!(is_array($arr) && count($arr))))
+       if ((!(is_array($arr) && count($arr)))) {
                return array();
+       }
 
        $parents = array();
        $children = array();
        $newarr = array();
 
-       // This is a preparation for having two different items with the same uri in one thread
-       // This will otherwise lead to an endless loop.
-       foreach ($arr as $x)
-               if (!isset($newarr[$x['uri']]))
+       /*
+        * This is a preparation for having two different items with the same uri in one thread
+        * This will otherwise lead to an endless loop.
+        */
+       foreach ($arr as $x) {
+               if (!isset($newarr[$x['uri']])) {
                        $newarr[$x['uri']] = $x;
+               }
+       }
 
        $arr = $newarr;
 
@@ -1367,18 +1433,19 @@ function conv_sort($arr,$order) {
                }
        }
 
-       if (stristr($order,'created')) {
-               usort($parents,'sort_thr_created');
-       } elseif (stristr($order,'commented')) {
-               usort($parents,'sort_thr_commented');
+       if (stristr($order, 'created')) {
+               usort($parents, 'sort_thr_created');
+       } elseif (stristr($order, 'commented')) {
+               usort($parents, 'sort_thr_commented');
        }
 
        if (count($parents)) {
-               foreach($parents as $i=>$_x) {
+               foreach ($parents as $i => $_x) {
                        $parents[$i]['children'] = get_item_children($arr, $_x);
                }
        }
 
+       /// @TODO Old-lost code?
        /*foreach ($arr as $x) {
                if ($x['id'] != $x['parent']) {
                        $p = find_thread_parent_index($parents,$x);
@@ -1390,6 +1457,7 @@ function conv_sort($arr,$order) {
                foreach ($parents as $k => $v) {
                        if (count($parents[$k]['children'])) {
                                $parents[$k]['children'] = sort_item_children($parents[$k]['children']);
+                               /// @TODO Old-lost code?
                                /*$y = $parents[$k]['children'];
                                usort($y,'sort_thr_created_rev');
                                $parents[$k]['children'] = $y;*/
@@ -1401,30 +1469,35 @@ function conv_sort($arr,$order) {
        if (count($parents)) {
                foreach ($parents as $x) {
                        $ret[] = $x;
-                       if (count($x['children']))
+                       if (count($x['children'])) {
                                add_children_to_list($x['children'], $ret);
+                               /// @TODO Old-lost code?
                                /*foreach ($x['children'] as $y)
                                        $ret[] = $y;*/
+                       }
                }
        }
 
        return $ret;
 }
 
-
-function sort_thr_created($a,$b) {
-       return strcmp($b['created'],$a['created']);
+/// @TODO Add type-hint
+function sort_thr_created($a, $b) {
+       return strcmp($b['created'], $a['created']);
 }
 
-function sort_thr_created_rev($a,$b) {
-       return strcmp($a['created'],$b['created']);
+/// @TODO Add type-hint
+function sort_thr_created_rev($a, $b) {
+       return strcmp($a['created'], $b['created']);
 }
 
-function sort_thr_commented($a,$b) {
-       return strcmp($b['commented'],$a['commented']);
+/// @TODO Add type-hint
+function sort_thr_commented($a, $b) {
+       return strcmp($b['commented'], $a['commented']);
 }
 
-function find_thread_parent_index($arr,$x) {
+/// @TODO Add type-hint
+function find_thread_parent_index($arr, $x) {
        foreach ($arr as $k => $v) {
                if ($v['id'] == $x['parent']) {
                        return $k;
@@ -1433,21 +1506,25 @@ function find_thread_parent_index($arr,$x) {
        return false;
 }
 
+/// @TODO Add type-hint
 function render_location_dummy($item) {
-       if ($item['location'] != "")
+       if ($item['location'] != "") {
                return $item['location'];
+       }
 
-       if ($item['coord'] != "")
+       if ($item['coord'] != "") {
                return $item['coord'];
+       }
 }
 
-function get_responses($conv_responses,$response_verbs,$ob,$item) {
+/// @TODO Add type-hint
+function get_responses($conv_responses, $response_verbs, $ob, $item) {
        $ret = array();
        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]['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');
                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-'
@@ -1455,7 +1532,7 @@ function get_responses($conv_responses,$response_verbs,$ob,$item) {
                } else {
                        $ret[$v]['list_part'] = '';
                }
-               $ret[$v]['button'] = get_response_button_text($v,$ret[$v]['count']);
+               $ret[$v]['button'] = get_response_button_text($v, $ret[$v]['count']);
                $ret[$v]['title'] = $conv_responses[$v]['title'];
        }
 
@@ -1470,22 +1547,22 @@ function get_responses($conv_responses,$response_verbs,$ob,$item) {
        return $ret;
 }
 
-function get_response_button_text($v,$count) {
-       switch($v) {
+function get_response_button_text($v, $count) {
+       switch ($v) {
                case 'like':
-                       return tt('Like','Likes',$count,'noun');
+                       return tt('Like', 'Likes', $count, 'noun');
                        break;
                case 'dislike':
-                       return tt('Dislike','Dislikes',$count,'noun');
+                       return tt('Dislike', 'Dislikes', $count, 'noun');
                        break;
                case 'attendyes':
-                       return tt('Attending','Attending',$count,'noun');
+                       return tt('Attending', 'Attending', $count, 'noun');
                        break;
                case 'attendno':
-                       return tt('Not Attending','Not Attending',$count,'noun');
+                       return tt('Not Attending', 'Not Attending', $count, 'noun');
                        break;
                case 'attendmaybe':
-                       return tt('Undecided','Undecided',$count,'noun');
+                       return tt('Undecided', 'Undecided', $count, 'noun');
                        break;
        }
 }