]> git.mxchange.org Git - friendica.git/commitdiff
Merge develop-new into event-attendance-new
authorrabuzarus <trebor@central-unit>
Sun, 11 Oct 2015 17:39:55 +0000 (19:39 +0200)
committerrabuzarus <trebor@central-unit>
Sun, 11 Oct 2015 17:39:55 +0000 (19:39 +0200)
Conflicts:
include/conversation.php

1  2 
boot.php
include/conversation.php
include/features.php
include/items.php
mod/network.php
mod/photos.php
object/Item.php
view/theme/vier/style.css

diff --combined boot.php
index 875e5369ed3f486fd4bf57670727eb037da7683b,497a87ce9ee5dd543b23df2914bdc93147df3601..20c243c2406bdbf19646e7a11cc71ed7c1ae8fc1
+++ b/boot.php
@@@ -270,10 -270,6 +270,10 @@@ define ( 'NAMESPACE_ATOM1',           '
  
  define ( 'ACTIVITY_LIKE',        NAMESPACE_ACTIVITY_SCHEMA . 'like' );
  define ( 'ACTIVITY_DISLIKE',     NAMESPACE_DFRN            . '/dislike' );
 +define ( 'ACTIVITY_ATTEND',      NAMESPACE_ZOT             . '/activity/attendyes' );
 +define ( 'ACTIVITY_ATTENDNO',    NAMESPACE_ZOT             . '/activity/attendno' );
 +define ( 'ACTIVITY_ATTENDMAYBE', NAMESPACE_ZOT             . '/activity/attendmaybe' );
 +
  define ( 'ACTIVITY_OBJ_HEART',   NAMESPACE_DFRN            . '/heart' );
  
  define ( 'ACTIVITY_FRIEND',      NAMESPACE_ACTIVITY_SCHEMA . 'make-friend' );
@@@ -412,6 -408,7 +412,7 @@@ if(! class_exists('App')) 
                public  $videoheight = 350;
                public  $force_max_items = 0;
                public  $theme_thread_allow = true;
+               public  $theme_events_in_profile = true;
  
                // An array for all theme-controllable parameters
                // Mostly unimplemented yet. Only options 'stylesheet' and
@@@ -1661,7 -1658,7 +1662,7 @@@ if(! function_exists('load_contact_link
                if(! $uid || x($a->contacts,'empty'))
                        return;
  
-               $r = q("SELECT `id`,`network`,`url`,`thumb` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `thumb` != ''",
+               $r = q("SELECT `id`,`network`,`url`,`thumb`, `rel` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `thumb` != ''",
                                intval($uid)
                );
                if(count($r)) {
diff --combined include/conversation.php
index fd03f4b788dae02803d310a7f6277cc673df930f,107fb84ea94dd1e5cd092bb5581d8f598c9e07ac..7417dbf812b4ece2c95caa3fbc007a4a620bbbec
@@@ -100,11 -100,7 +100,11 @@@ function localize_item(&$item)
                $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)){
 +      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';",
                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)) {
 +                      $bodyverb = 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');
 +              }
 +              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);
  
        }
                // 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, "",""));
                $txt = str_replace( $poked_t, t($verb), $txt);
@@@ -354,15 -341,8 +354,15 @@@ function count_descendants($item) 
  
  function visible_activity($item) {
  
 -      if(activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE))
 -              return false;
 +      // 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)) {
 +                      return false;
 +              }
 +      }
  
        if(activity_match($item['verb'],ACTIVITY_FOLLOW) && $item['object-type'] === ACTIVITY_OBJ_NOTE) {
                if(! (($item['self']) && ($item['uid'] == local_user()))) {
@@@ -416,25 -396,25 +416,25 @@@ function conversation(&$a, $items, $mod
                $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 
+                       // 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'] 
+                               . "<script> var profile_uid = " . $_SESSION['uid']
                                . "; 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,'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";
                }
                                // 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'] 
+                                       . "<script> var profile_uid = " . $a->profile['profile_uid']
                                        . "; var netargs = '?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
                        }
                }
                $page_writeable = true;
                if(!$update) {
                        $live_update_div = '<div id="live-notes"></div>' . "\r\n"
-                               . "<script> var profile_uid = " . local_user() 
+                               . "<script> var profile_uid = " . local_user()
                                . "; var netargs = '/?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
                }
        }
        $cmnt_tpl    = get_markup_template('comment_item.tpl');
        $hide_comments_tpl = get_markup_template('hide_comments.tpl');
  
 -      $alike = array();
 -      $dlike = array();
 +      $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'))
 +      );
  
        // array with html for each thread (parent+comments)
        $threads = array();
                                        'name' => $profile_name_e,
                                        'sparkle' => $sparkle,
                                        'lock' => $lock,
-                                       'thumb' => proxy_url($profile_avatar),
+                                       'thumb' => proxy_url($profile_avatar, false, PROXY_SIZE_THUMB),
                                        'title' => $item['title_e'],
                                        'body' => $body_e,
                                        'tags' => $tags_e,
                                        'indent' => '',
                                        'owner_name' => $owner_name_e,
                                        'owner_url' => $owner_url,
-                                       'owner_photo' => proxy_url($owner_photo),
+                                       'owner_photo' => proxy_url($owner_photo, false, PROXY_SIZE_THUMB),
                                        'plink' => get_plink($item),
                                        'edpost' => false,
                                        'isstarred' => $isstarred,
  
  
                                // Can we put this after the visibility check?
 -                              like_puller($a,$item,$alike,'like');
 -                              like_puller($a,$item,$dlike,'dislike');
 +                              builtin_activity_puller($item, $conv_responses);
  
                                // Only add what is visible
                                if($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
                                }
                        }
  
 -                      $threads = $conv->get_template_data($alike, $dlike);
 +                      $threads = $conv->get_template_data($conv_responses);
  
                        if(!$threads) {
                                logger('[ERROR] conversation : Failed to get template data.', LOGGER_DEBUG);
@@@ -813,10 -792,16 +813,16 @@@ function best_link_url($item,&$sparkle,
                        if($a->contacts[$clean_url]['network'] === NETWORK_DFRN) {
                                $best_url = $a->get_baseurl($ssl_state) . '/redir/' . $a->contacts[$clean_url]['id'];
                                $sparkle = true;
-                       }
-                       else
+                       } else
                                $best_url = $a->contacts[$clean_url]['url'];
                }
+       } elseif (local_user()) {
+               $r = q("SELECT `id`, `network` FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `nurl` = '%s'",
+                       dbesc(NETWORK_DFRN), intval(local_user()), dbesc(normalise_link($clean_url)));
+               if ($r) {
+                       $best_url = $a->get_baseurl($ssl_state).'/redir/'.$r[0]['id'];
+                       $sparkle = true;
+               }
        }
        if(! $best_url) {
                if(strlen($item['author-link']))
@@@ -869,9 -854,17 +875,17 @@@ function item_photo_menu($item)
                $profile_link = zrl($profile_link);
                if(local_user() && local_user() == $item['uid'] && link_compare($item['url'],$item['author-link'])) {
                        $cid = $item['contact-id'];
-               }
-               else {
-                       $cid = 0;
+               } else {
+                       $r = q("SELECT `id`, `network` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' ORDER BY `uid` DESC LIMIT 1",
+                               intval(local_user()), dbesc(normalise_link($item['author-link'])));
+                       if ($r) {
+                               $cid = $r[0]["id"];
+                               if ($r[0]["network"] == NETWORK_DIASPORA)
+                                       $pm_url = $a->get_baseurl($ssl_state) . '/message/new/' . $cid;
+                       } else
+                               $cid = 0;
                }
        }
        if(($cid) && (! $item['self'])) {
  
        }
  
-       $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("Edit Contact") => $contact_url,
-               t("Send PM") => $pm_url,
-               t("Poke") => $poke_link
-       );
+       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("Edit Contact") => $contact_url,
+                       t("Send PM") => $pm_url
+               );
+               if ($a->contacts[$clean_url]['network'] === NETWORK_DFRN)
+                       $menu[t("Poke")] = $poke_link;
+               if ((($cid == 0) OR ($a->contacts[$clean_url]['rel'] == CONTACT_IS_FOLLOWER)) AND
+                       in_array($item['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA)))
+                       $menu[t("Connect/Follow")] = $a->get_baseurl($ssl_state)."/follow?url=".urlencode($item['author-link']);
+       } else
+               $menu = array(t("View Profile") => $item['author-link']);
  
        $args = array('item' => $item, 'menu' => $menu);
  
        return $o;
  }}
  
 -if(! function_exists('like_puller')) {
 -function like_puller($a,$item,&$arr,$mode) {
 -
 -      $url = '';
 -      $sparkle = '';
 -      $verb = (($mode === 'like') ? ACTIVITY_LIKE : ACTIVITY_DISLIKE);
 +/**
 + * @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.
 + *
 + * @param array $a (not used)
 + * @param array $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 = '';
  
 -      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']))) {
 -                      $url = $a->get_baseurl(true) . '/redir/' . $item['contact-id'];
 -                      $sparkle = ' class="sparkle" ';
 +              switch($mode) {
 +                      case 'like':
 +                              $verb = ACTIVITY_LIKE;
 +                              break;
 +                      case 'dislike':
 +                              $verb = ACTIVITY_DISLIKE;
 +                              break;
 +                      case 'attendyes':
 +                              $verb = ACTIVITY_ATTEND;
 +                              break;
 +                      case 'attendno':
 +                              $verb = ACTIVITY_ATTENDNO;
 +                              break;
 +                      case 'attendmaybe':
 +                              $verb = ACTIVITY_ATTENDMAYBE;
 +                              break;
 +                      default:
 +                              return;
 +                              break;
                }
 -              else
 -                      $url = zrl($url);
  
 -              if(! $item['thr-parent'])
 -                      $item['thr-parent'] = $item['parent-uri'];
 +              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']))) {
 +                              $url = z_root(true) . '/redir/' . $item['contact-id'];
 +                              $sparkle = ' class="sparkle" ';
 +                      }
 +                      else 
 +                              $url = zrl($url);
 +                      
 +                      $url = '<a href="'. $url . '"'. $sparkle .'>' . $item['author-name'] . '</a>';
  
 -              if(! ((isset($arr[$item['thr-parent'] . '-l'])) && (is_array($arr[$item['thr-parent'] . '-l']))))
 -                      $arr[$item['thr-parent'] . '-l'] = array();
 -              if(! isset($arr[$item['thr-parent']]))
 -                      $arr[$item['thr-parent']] = 1;
 -              else
 -                      $arr[$item['thr-parent']] ++;
 -              $arr[$item['thr-parent'] . '-l'][] = '<a href="'. $url . '"'. $sparkle .'>' . htmlentities($item['author-name']) . '</a>';
 +                      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']))))
 +                              $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']))
 +                              continue;
 +
 +                      if(! isset($conv_responses[$mode][$item['thr-parent']]))
 +                              $conv_responses[$mode][$item['thr-parent']] = 1;
 +                      else
 +                              $conv_responses[$mode][$item['thr-parent']] ++;
 +
 +                      $conv_responses[$mode][$item['thr-parent'] . '-l'][] = $url;
 +
 +                      // there can only be one activity verb per item so if we found anything, we can stop looking
 +                      return;
 +              }
        }
 -      return;
  }}
  
 -// Format the like/dislike text for a profile item
 -// $cnt = number of people who like/dislike the item
 +// 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'
 +// $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) {
        $o = '';
 +      $expanded = '';
 +
        if($cnt == 1)
 -              $o .= (($type === 'like') ? sprintf( t('%s likes this.'), $arr[0]) : sprintf( t('%s doesn\'t like this.'), $arr[0])) . EOL;
 -      else {
 -              $spanatts = "class=\"fakelink\" onclick=\"openClose('{$type}list-$id');\"";
 -              switch($type) {
 -                      case 'like':
 -                              $phrase = sprintf( t('<span  %1$s>%2$d people</span> like this'), $spanatts, $cnt);
 -                              break;
 -                      case 'dislike':
 -                              $phrase = sprintf( t('<span  %1$s>%2$d people</span> don\'t like this'), $spanatts, $cnt);
 -                              break;
 -              }
 -              $phrase .= EOL ;
 -              $o .= replace_macros(get_markup_template('voting_fakelink.tpl'), array(
 -                      '$phrase' => $phrase,
 -                      '$type' => $type,
 -                      '$id' => $id
 -              ));
 +              $likers = $arr[0];
  
 +      else {
                $total = count($arr);
                if($total >= MAX_LIKERS)
                        $arr = array_slice($arr, 0, MAX_LIKERS - 1);
                        $str = implode(', ', $arr);
                        $str .= sprintf( t(', and %d other people'), $total - MAX_LIKERS );
                }
 -              $str = (($type === 'like') ? sprintf( t('%s like this.'), $str) : sprintf( t('%s don\'t like this.'), $str));
 -              $o .= "\t" . '<div class="wall-item-' . $type . '-expanded" id="' . $type . 'list-' . $id . '" style="display: none;" >' . $str . '</div>';
 +
 +              $likers = $str;
 +      }
 +
 +      // Phrase if there is only one liker. In other cases it will be uses for the expanded
 +      // list which show all likers
 +      switch($type) {
 +              case 'like' :
 +                      $phrase = sprintf( t('%s likes this.'), $likers);
 +                      break;
 +              case 'dislike' :
 +                      $phrase = sprintf( t('%s doesn\'t like this.'), $likers);
 +                      break;
 +              case 'attendyes' :
 +                      $phrase = sprintf( t('%s attends.'), $likers);
 +                      break;
 +              case 'attendno' :
 +                      $phrase = sprintf( t('%s doesn\'t attend.'), $likers);
 +                      break;
 +              case 'attendmaybe' :
 +                      $phrase = sprintf( t('%s attends maybe.'), $likers);
 +                      break;
 +      }
 +
 +      if($cnt > 1) {
 +              $spanatts = "class=\"fakelink\" onclick=\"openClose('{$type}list-$id');\"";
 +              $expanded .= "\t" . '<div class="wall-item-' . $type . '-expanded" id="' . $type . 'list-' . $id . '" style="display: none;" >' . $phrase . EOL . '</div>';
 +              switch($type) {
 +                      case 'like':
 +                              $phrase = sprintf( t('<span  %1$s>%2$d people</span> like this'), $spanatts, $cnt);
 +                              break;
 +                      case 'dislike':
 +                              $phrase = sprintf( t('<span  %1$s>%2$d people</span> don\'t like this'), $spanatts, $cnt);
 +                              break;
 +                      case 'attendyes':
 +                              $phrase = sprintf( t('<span  %1$s>%2$d people</span> attend'), $spanatts, $cnt);
 +                              break;
 +                      case 'attendno':
 +                              $phrase = sprintf( t('<span  %1$s>%2$d people</span> don\'t attend'), $spanatts, $cnt);
 +                              break;
 +                      case 'attendmaybe':
 +                              $phrase = sprintf( t('<span  %1$s>%2$d people</span> anttend maybe'), $spanatts, $cnt);
 +                      case 'agree':
 +                              $phrase = sprintf( t('<span  %1$s>%2$d people</span> agree'), $spanatts, $cnt);
 +                              break;
 +                      case 'disagree':
 +                              $phrase = sprintf( t('<span  %1$s>%2$d people</span> don\'t agree'), $spanatts, $cnt);
 +                              break;
 +                      case 'abstain':
 +                              $phrase = sprintf( t('<span  %1$s>%2$d people</span> abstains'), $spanatts, $cnt);
 +              }
        }
 +
 +      $phrase .= EOL ;
 +      $o .= replace_macros(get_markup_template('voting_fakelink.tpl'), array(
 +              '$phrase' => $phrase,
 +              '$type' => $type,
 +              '$id' => $id
 +      ));
 +      $o .= $expanded;
 +
        return $o;
  }}
  
@@@ -1343,51 -1258,3 +1365,51 @@@ function render_location_dummy($item) 
        if ($item['coord'] != "")
                return $item['coord'];
  }
 +
 +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'] : '');
 +              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->get_id() : $item['id']) . '"><b>' . t('View all') . '</b></a>');
 +              }
 +              else {
 +                      $ret[$v]['list_part'] = '';
 +              }
 +              $ret[$v]['button'] = get_response_button_text($v,$ret[$v]['count']);
 +              $ret[$v]['title'] = $conv_responses[$v]['title'];
 +      }
 +
 +      $count = 0;
 +      foreach($ret as $key) {
 +              if ($key['count'] == true)
 +                      $count++;
 +      }
 +      $ret['count'] = $count;
 +
 +      return $ret;
 +}
 +
 +function get_response_button_text($v,$count) {
 +      switch($v) {
 +              case 'like':
 +                      return tt('Like','Likes',$count,'noun');
 +                      break;
 +              case 'dislike':
 +                      return tt('Dislike','Dislikes',$count,'noun');
 +                      break;
 +              case 'attendyes':
 +                      return tt('Attending','Attending',$count,'noun');
 +                      break;
 +              case 'attendno':
 +                      return tt('Not Attending','Not Attending',$count,'noun');
 +                      break;
 +              case 'attendmaybe':
 +                      return tt('Undecided','Undecided',$count,'noun');
 +                      break;
 +      }
 +}
diff --combined include/features.php
index cc26141ac3cf55402b25d7ef39bf5873d1b7ac38,5450c7fab02c70d845870a4933d8d4ca9097329b..1307132a64fce66236e08c5f599833f0ea144db0
@@@ -23,13 -23,14 +23,14 @@@ function get_features() 
                        t('General Features'),
                        //array('expire',         t('Content Expiration'),              t('Remove old posts/comments after a period of time')),
                        array('multi_profiles', t('Multiple Profiles'),                 t('Ability to create multiple profiles')),
+                       array('photo_location', t('Photo Location'),                    t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'),false),
                ),
  
                // Post composition
                'composition' => array(
                        t('Post Composition Features'),
                        array('richtext',       t('Richtext Editor'),                   t('Enable richtext editor')),
 -                      array('preview',        t('Post Preview'),                              t('Allow previewing posts and comments before publishing them')),
 +                      array('preview',        t('Post Preview'),                      t('Allow previewing posts and comments before publishing them')),
                        array('aclautomention', t('Auto-mention Forums'),               t('Add/remove mention when a fourm page is selected/deselected in ACL window.')),
                ),
  
diff --combined include/items.php
index ad41a0380ddc02f20c0d2950a164ab2f58e839d6,5c7aa52e6fa70df0822da0aa9eb873bd3f06826c..4e86a5200af6d3a74e2e1939c624d0bca07555da
@@@ -1239,10 -1239,10 +1239,10 @@@ function item_store($arr,$force_parent 
        $arr['guid']          = ((x($arr,'guid'))          ? notags(trim($arr['guid']))          : get_guid(32, $guid_prefix));
        $arr['uri']           = ((x($arr,'uri'))           ? notags(trim($arr['uri']))           : $arr['guid']);
        $arr['extid']         = ((x($arr,'extid'))         ? notags(trim($arr['extid']))         : '');
-       $arr['author-name']   = ((x($arr,'author-name'))   ? notags(trim($arr['author-name']))   : '');
+       $arr['author-name']   = ((x($arr,'author-name'))   ? trim($arr['author-name'])   : '');
        $arr['author-link']   = ((x($arr,'author-link'))   ? notags(trim($arr['author-link']))   : '');
        $arr['author-avatar'] = ((x($arr,'author-avatar')) ? notags(trim($arr['author-avatar'])) : '');
-       $arr['owner-name']    = ((x($arr,'owner-name'))    ? notags(trim($arr['owner-name']))    : '');
+       $arr['owner-name']    = ((x($arr,'owner-name'))    ? trim($arr['owner-name'])    : '');
        $arr['owner-link']    = ((x($arr,'owner-link'))    ? notags(trim($arr['owner-link']))    : '');
        $arr['owner-avatar']  = ((x($arr,'owner-avatar'))  ? notags(trim($arr['owner-avatar']))  : '');
        $arr['created']       = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC',$arr['created']) : datetime_convert());
        $arr['commented']     = ((x($arr,'commented')  !== false) ? datetime_convert('UTC','UTC',$arr['commented'])  : datetime_convert());
        $arr['received']      = ((x($arr,'received')  !== false) ? datetime_convert('UTC','UTC',$arr['received'])  : datetime_convert());
        $arr['changed']       = ((x($arr,'changed')  !== false) ? datetime_convert('UTC','UTC',$arr['changed'])  : datetime_convert());
-       $arr['title']         = ((x($arr,'title'))         ? notags(trim($arr['title']))         : '');
-       $arr['location']      = ((x($arr,'location'))      ? notags(trim($arr['location']))      : '');
+       $arr['title']         = ((x($arr,'title'))         ? trim($arr['title'])         : '');
+       $arr['location']      = ((x($arr,'location'))      ? trim($arr['location'])      : '');
        $arr['coord']         = ((x($arr,'coord'))         ? notags(trim($arr['coord']))         : '');
        $arr['last-child']    = ((x($arr,'last-child'))    ? intval($arr['last-child'])          : 0 );
        $arr['visible']       = ((x($arr,'visible') !== false) ? intval($arr['visible'])         : 1 );
        }
  
        if ($arr['network'] == "") {
-               $r = q("SELECT `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-                       intval($arr['contact-id']),
+               $r = q("SELECT `network` FROM `contact` WHERE `network` IN ('%s', '%s', '%s') AND `nurl` = '%s' AND `uid` = %d LIMIT 1",
+                       dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS),
+                       dbesc(normalise_link($arr['author-link'])),
                        intval($arr['uid'])
                );
  
+               if(!count($r))
+                       $r = q("SELECT `network` FROM `gcontact` WHERE `network` IN ('%s', '%s', '%s') AND `nurl` = '%s' LIMIT 1",
+                               dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS),
+                               dbesc(normalise_link($arr['author-link']))
+                       );
+               if(!count($r))
+                       $r = q("SELECT `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+                               intval($arr['contact-id']),
+                               intval($arr['uid'])
+                       );
                if(count($r))
                        $arr['network'] = $r[0]["network"];
  
        $arr = $unescaped;
  
        // find the item we just created
-       $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d ORDER BY `id` ASC ",
+       $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `network` = '%s' ORDER BY `id` ASC ",
                dbesc($arr['uri']),
-               intval($arr['uid'])
+               intval($arr['uid']),
+               dbesc($arr['network'])
        );
  
        if(count($r)) {
@@@ -2751,11 -2765,7 +2765,11 @@@ function consume_feed($xml,$importer,&$
                                $datarray['parent-uri'] = $parent_uri;
                                $datarray['uid'] = $importer['uid'];
                                $datarray['contact-id'] = $contact['id'];
 -                              if((activity_match($datarray['verb'],ACTIVITY_LIKE)) || (activity_match($datarray['verb'],ACTIVITY_DISLIKE))) {
 +                              if(($datarray['verb'] === ACTIVITY_LIKE)
 +                                      || ($datarray['verb'] === ACTIVITY_DISLIKE)
 +                                      || ($datarray['verb'] === ACTIVITY_ATTEND)
 +                                      || ($datarray['verb'] === ACTIVITY_ATTENDNO)
 +                                      || ($datarray['verb'] === ACTIVITY_ATTENDMAYBE)) {
                                        $datarray['type'] = 'activity';
                                        $datarray['gravity'] = GRAVITY_LIKE;
                                        // only one like or dislike per person
@@@ -3742,11 -3752,7 +3756,11 @@@ function local_delivery($importer,$data
                                $datarray['owner-avatar'] = $own[0]['thumb'];
                                $datarray['contact-id'] = $importer['id'];
  
 -                              if(($datarray['verb'] === ACTIVITY_LIKE) || ($datarray['verb'] === ACTIVITY_DISLIKE)) {
 +                              if(($datarray['verb'] === ACTIVITY_LIKE) 
 +                                      || ($datarray['verb'] === ACTIVITY_DISLIKE)
 +                                      || ($datarray['verb'] === ACTIVITY_ATTEND)
 +                                      || ($datarray['verb'] === ACTIVITY_ATTENDNO)
 +                                      || ($datarray['verb'] === ACTIVITY_ATTENDMAYBE)) {
                                        $is_like = true;
                                        $datarray['type'] = 'activity';
                                        $datarray['gravity'] = GRAVITY_LIKE;
                                $datarray['parent-uri'] = $parent_uri;
                                $datarray['uid'] = $importer['importer_uid'];
                                $datarray['contact-id'] = $importer['id'];
 -                              if(($datarray['verb'] == ACTIVITY_LIKE) || ($datarray['verb'] == ACTIVITY_DISLIKE)) {
 +                              if(($datarray['verb'] === ACTIVITY_LIKE) 
 +                                      || ($datarray['verb'] === ACTIVITY_DISLIKE)
 +                                      || ($datarray['verb'] === ACTIVITY_ATTEND)
 +                                      || ($datarray['verb'] === ACTIVITY_ATTENDNO)
 +                                      || ($datarray['verb'] === ACTIVITY_ATTENDMAYBE)) {
                                        $datarray['type'] = 'activity';
                                        $datarray['gravity'] = GRAVITY_LIKE;
                                        // only one like or dislike per person
diff --combined mod/network.php
index 9389c07e1b92e34732edce1c09523822b893b236,3d14455cdf634c8ba3c96da1429a3b31f1114705..dfd7c013007fbdb39618ee681764652df3252f29
@@@ -568,14 -568,14 +568,14 @@@ function network_content(&$a, $update 
                        intval($cid)
                );
                if(count($r)) {
-                       $sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item` 
-                                           WHERE 1 $sql_options AND `contact-id` = ".intval($cid)." and deleted = 0 
-                                           ORDER BY `item`.`received` DESC) AS `temp1` 
+                       $sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item`
+                                           WHERE 1 $sql_options AND `contact-id` = ".intval($cid)." and deleted = 0
+                                           ORDER BY `item`.`received` DESC) AS `temp1`
                                            ON $sql_table.$sql_parent = `temp1`.`parent` ";
                        $sql_extra = "";
  
                        $o = replace_macros(get_markup_template("section_title.tpl"),array(
-                               '$title' => sprintf( t('Contact: %s'), $r[0]['name'])
+                               '$title' => sprintf( t('Contact: %s'), htmlentities($r[0]['name']))
                        )) . $o;
  
                        if($r[0]['network'] === NETWORK_OSTATUS && $r[0]['writable'] && (! get_pconfig(local_user(),'system','nowarn_insecure'))) {
                // Fetch a page full of parent items for this page
                if($update) {
                        if (!get_config("system", "like_no_comment"))
 -                              $sql_extra4 = "(`item`.`deleted` = 0 OR `item`.`verb` = '".ACTIVITY_LIKE."' OR `item`.`verb` = '".ACTIVITY_DISLIKE."')";
 +                              $sql_extra4 = "(`item`.`deleted` = 0
 +                                              OR `item`.`verb` = '".ACTIVITY_LIKE."' OR `item`.`verb` = '".ACTIVITY_DISLIKE."'
 +                                              OR `item`.`verb` = '".ACTIVITY_ATTEND."' OR `item`.`verb` = '".ACTIVITY_ATTENDNO."'
 +                                              OR `item`.`verb` = '".ACTIVITY_ATTENDMAYBE."')";
                        else
                                $sql_extra4 = "`item`.`deleted` = 0 AND `item`.`verb` = '".ACTIVITY_POST."'";
  
diff --combined mod/photos.php
index ddfc1f345ac08ac65440e21fe9d266fef322ccc4,03021e55018ba678805c701d7065580b77e237ae..5ca973d16637d4db92434c2d43fbb6a1313827f9
@@@ -1,5 -1,6 +1,6 @@@
  <?php
  require_once('include/Photo.php');
+ require_once('include/photos.php');
  require_once('include/items.php');
  require_once('include/acl_selectors.php');
  require_once('include/bbcode.php');
@@@ -17,6 -18,8 +18,8 @@@ function photos_init(&$a) 
                return;
        }
  
+       nav_set_selected('home');
        $o = '';
  
        if($a->argc > 1) {
@@@ -198,6 -201,10 +201,10 @@@ function photos_post(&$a) 
                        goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
                }
  
+               /*
+                * RENAME photo album
+                */
                $newalbum = notags(trim($_POST['albumname']));
                if($newalbum != $album) {
                        q("UPDATE `photo` SET `album` = '%s' WHERE `album` = '%s' AND `uid` = %d",
                        return; // NOTREACHED
                }
  
+               /*
+                * DELETE photo album and all its photos
+                */
  
                if($_POST['dropalbum'] == t('Delete Album')) {
  
                                                        if(count($links)) {
                                                                foreach($links as $link) {
                                                                        if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
-                                                       $profile = $link['@attributes']['href'];
+                                                                               $profile = $link['@attributes']['href'];
                                                                        if($link['@attributes']['rel'] === 'salmon') {
                                                                                $salmon = '$url:' . str_replace(',','%sc',$link['@attributes']['href']);
                                                                                if(strlen($inform))
                killme();
        }
  
-       $ph->orient($src);
+       $exif = $ph->orient($src);
        @unlink($src);
  
        $max_length = get_config('system','max_image_length');
  
        // Create item container
  
+       $lat = $lon = null;
+       if($exif && $exif['GPS']) {
+               if(feature_enabled($channel_id,'photo_location')) {
+                       $lat = getGps($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']);
+                       $lon = getGps($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']);
+               }
+       }
        $arr = array();
  
+       if($lat && $lon)
+               $arr['coord'] = $lat . ' ' . $lon;
        $arr['uid']           = $page_owner_uid;
        $arr['uri']           = $uri;
        $arr['parent-uri']    = $uri;
@@@ -1066,10 -1088,9 +1088,9 @@@ function photos_content(&$a) 
        $is_owner = (local_user() && (local_user() == $owner_uid));
        $o .= profile_tabs($a,$is_owner, $a->data['user']['nickname']);
  
-       //
-       // dispatch request
-       //
+       /**
+        * Display upload form
+        */
  
        if($datatype === 'upload') {
                if(! ($can_post)) {
                return $o;
        }
  
+       /*
+        * Display a single photo album
+        */
        if($datatype === 'album') {
  
                $album = hex2bin($datum);
                        intval($a->pager['itemspage'])
                );
  
+               //edit album name
                if($cmd === 'edit') {
                        if(($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) {
                                if($can_post) {
  
        }
  
+       /** 
+        * Display one photo
+        */
  
        if($datatype === 'image') {
  
                //$o = '';
                // fetch image, item containing image, then comments
  
                $linked_items = q("SELECT * FROM `item` WHERE `resource-id` = '%s' $sql_extra LIMIT 1",
                        dbesc($datum)
                );
+               $map = null;
                if(count($linked_items)) {
                        $link_item = $linked_items[0];
                        $r = q("SELECT COUNT(*) AS `total`
                                );
                                update_thread($link_item['parent']);
                        }
+                       if($link_item['coord']) {
+                               $map = generate_map($link_item['coord']);
+                       }
                }
  
                $tags=Null;
                        $like = '';
                        $dislike = '';
  
 +                      $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'))
 +                      );
 +
  
  
                        // display comments
                        if(count($r)) {
  
                                foreach($r as $item) {
 -                                      like_puller($a,$item,$alike,'like');
 -                                      like_puller($a,$item,$dlike,'dislike');
 +                                      builtin_activity_puller($item, $conv_responses);
                                }
  
 -                              $like    = ((isset($alike[$link_item['id']])) ? format_like($alike[$link_item['id']],$alike[$link_item['id'] . '-l'],'like',$link_item['id']) : '');
 -                              $dislike = ((isset($dlike[$link_item['id']])) ? format_like($dlike[$link_item['id']],$dlike[$link_item['id'] . '-l'],'dislike',$link_item['id']) : '');
 +                              $like    = ((x($conv_responses['like'],$link_item['uri'])) ? format_like($conv_responses['like'][$link_item['uri']],$conv_responses['like'][$link_item['uri'] . '-l'],'like',$link_item['id']) : '');
 +                              $dislike = ((x($conv_responses['dislike'],$link_item['uri'])) ? format_like($conv_responses['dislike'][$link_item['uri']],$conv_responses['dislike'][$link_item['uri'] . '-l'],'dislike',$link_item['id']) : '');
  
  
  
                        $paginate = paginate($a);
                }
  
 +
 +              $response_verbs = array('like');
 +              if(feature_enabled($owner_uid,'dislike'))
 +                      $response_verbs[] = 'dislike';
 +              $responses = get_responses($conv_responses,$response_verbs,'',$link_item);
 +
                $photo_tpl = get_markup_template('photo_view.tpl');
  
                if($a->theme['template_engine'] === 'internal') {
                        '$desc' => $ph[0]['desc'],
                        '$tags' => $tags_e,
                        '$edit' => $edit,
+                       '$map' => $map,
+                       '$map_text' => t('Map'),
                        '$likebuttons' => $likebuttons,
                        '$like' => $like_e,
                        '$dislike' => $dikslike_e,
 +                      'responses' => $responses,
                        '$comments' => $comments,
                        '$paginate' => $paginate,
                ));
diff --combined object/Item.php
index 283745d34d017edaf519810d52fd320b09321aef,63fa43d3e25eb2feb41e78f8cab56a84bb2432d7..3050365f921fd23ad463ccf354a3cdae9bbab71e
@@@ -81,7 -81,7 +81,7 @@@ class Item extends BaseObject 
         *      _ The data requested on success
         *      _ false on failure
         */
 -      public function get_template_data($alike, $dlike, $thread_level=1) {
 +      public function get_template_data($conv_responses, $thread_level=1) {
                require_once("mod/proxy.php");
  
                $result = array();
                $filer = (($conv->get_profile_owner() == local_user()) ? t("save to folder") : false);
  
                $diff_author    = ((link_compare($item['url'],$item['author-link'])) ? false : true);
-               $profile_name   = (((strlen($item['author-name']))   && $diff_author) ? $item['author-name']   : $item['name']);
+               $profile_name   = htmlentities(((strlen($item['author-name']))   && $diff_author) ? $item['author-name']   : $item['name']);
                if($item['author-link'] && (! $item['author-name']))
                        $profile_name = $item['author-link'];
  
                        }
                }*/
  
 -              $like    = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : '');
 -              $dislike = ((x($dlike,$item['uri'])) ? format_like($dlike[$item['uri']],$dlike[$item['uri'] . '-l'],'dislike',$item['uri']) : '');
 +              // process action responses - e.g. like/dislike/attend/agree/whatever
 +              $response_verbs = array('like');
 +              if(feature_enabled($conv->get_profile_owner(),'dislike'))
 +                      $response_verbs[] = 'dislike';
 +              if($item['object-type'] === ACTIVITY_OBJ_EVENT) {
 +                      $response_verbs[] = 'attendyes';
 +                      $response_verbs[] = 'attendno';
 +                      $response_verbs[] = 'attendmaybe';
 +                      if($conv->is_writable()) {
 +                              $isevent = true;
 +                              $attend = array( t('I will attend'), t('I will not attend'), t('I might attend'));
 +                      }
 +              }
 +
 +              $responses = get_responses($conv_responses,$response_verbs,$this,$item);
 +
 +              foreach ($response_verbs as $value=>$verbs) {
 +                      $responses[$verbs][output]  = ((x($conv_responses[$verbs],$item['uri'])) ? format_like($conv_responses[$verbs][$item['uri']],$conv_responses[$verbs][$item['uri'] . '-l'],$verbs,$item['uri']) : '');
 +
 +              }
  
                /*
                 * We should avoid doing this all the time, but it depends on the conversation mode
                        if ($shareable) $buttons['share'] = array( t('Share this'), t('share'));
                }
  
+               $comment = $this->get_comment_box($indent);
                if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0){
                        $shiny = 'shiny';
                }
  
                // Disable features that aren't available in several networks
                if (($item["item_network"] != NETWORK_DFRN) AND isset($buttons["dislike"])) {
 -                      unset($buttons["dislike"]);
 +                      unset($buttons["dislike"],$isevent);
                        $tagger = '';
                }
  
                        !diaspora_is_redmatrix($item["owner-link"]) AND isset($buttons["like"]))
                        unset($buttons["like"]);
  
+               // Diaspora doesn't has multithreaded comments
+               if (($item["item_network"] == NETWORK_DIASPORA) AND ($indent == 'comment'))
+                       unset($comment);
                // Facebook can like comments - but it isn't programmed in the connector yet.
                if (($item["item_network"] == NETWORK_FACEBOOK) AND ($indent == 'comment') AND isset($buttons["like"]))
                        unset($buttons["like"]);
                        'text' => $text_e,
                        'id' => $this->get_id(),
                        'guid' => urlencode($item['guid']),
 +                      'isevent' => $isevent,
 +                      'attend' => $attend,
                        'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
-                       'olinktitle' => sprintf( t('View %s\'s profile @ %s'), $this->get_owner_name(), ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])),
+                       'olinktitle' => sprintf( t('View %s\'s profile @ %s'), htmlentities($this->get_owner_name()), ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])),
                        'to' => t('to'),
                        'via' => t('via'),
                        'wall' => t('Wall-to-Wall'),
                        'profile_url' => $profile_link,
                        'item_photo_menu' => item_photo_menu($item),
                        'name' => $name_e,
-                       'thumb' => proxy_url($profile_avatar),
+                       'thumb' => proxy_url($profile_avatar, false, PROXY_SIZE_THUMB),
                        'osparkle' => $osparkle,
                        'sparkle' => $sparkle,
                        'title' => $title_e,
                        'indent' => $indent,
                        'shiny' => $shiny,
                        'owner_url' => $this->get_owner_url(),
-                       'owner_photo' => proxy_url($this->get_owner_photo()),
-                       'owner_name' => $owner_name_e,
+                       'owner_photo' => proxy_url($this->get_owner_photo(), false, PROXY_SIZE_THUMB),
+                       'owner_name' => htmlentities($owner_name_e),
                        'plink' => get_plink($item),
                        'edpost'    => ((feature_enabled($conv->get_profile_owner(),'edit_posts')) ? $edpost : ''),
                        'isstarred' => $isstarred,
                        'filer'     => ((feature_enabled($conv->get_profile_owner(),'filing')) ? $filer : ''),
                        'drop' => $drop,
                        'vote' => $buttons,
 -                      'like' => $like,
 -                        'dislike'   => $dislike,
 +                      'like' => $responses['like']['output'],
 +                      'dislike'   => $responses['dislike']['output'],
 +                      'responses' => $responses,
                        'switchcomment' => t('Comment'),
-                       'comment' => $this->get_comment_box($indent),
+                       'comment' => $comment,
                        'previewing' => ($conv->is_preview() ? ' preview ' : ''),
                        'wait' => t('Please wait'),
                        'thread_level' => $thread_level,
 -                        'postopts' => $langstr,
 -                        'edited' => $edited,
 +                      'postopts' => $langstr,
 +                      'edited' => $edited,
                        'network' => $item["item_network"],
                        'network_name' => network_to_name($item['item_network'], $profile_link),
                );
                $nb_children = count($children);
                if($nb_children > 0) {
                        foreach($children as $child) {
 -                              $result['children'][] = $child->get_template_data($alike, $dlike, $thread_level + 1);
 +                              $result['children'][] = $child->get_template_data($conv_responses, $thread_level + 1);
                        }
                        // Collapse
                        if(($nb_children > 2) || ($thread_level > 1)) {
         */
        public function set_conversation($conv) {
                $previous_mode = ($this->conversation ? $this->conversation->get_mode() : '');
-               
                $this->conversation = $conv;
  
                // Set it on our children too
                if(!$this->is_toplevel() && !(get_config('system','thread_allow') && $a->theme_thread_allow)) {
                        return '';
                }
-               
                $comment_box = '';
                $conv = $this->get_conversation();
                $template = get_markup_template($this->get_comment_box_template());
index 2fc68dbb05107261780bedd0510e43bb44c9be6e,d6d13b9d3c9b88b12f556cb815b67c43f23c4677..1c03edc6bfbce09d10a962e2a3de3d84bb07327a
@@@ -375,7 -375,7 +375,7 @@@ code 
  .tool a {
  /*  color: #000; */
  }
- .tool a:hover, .widget a:hover, #nets-sidear a:hover, #hide-forum-list:hover, .admin.link a:hover, aside h4 a:hover {
+ .tool a:hover, .widget a:hover, #nets-sidear a:hover, #hide-forum-list:hover, .admin.link a:hover, aside h4 a:hover, right_aside h4 a:hover {
    /* text-decoration: underline; */
    text-decoration: none;
    color: black;
  }
  
  .sidebar-group-li:hover, #sidebar-new-group:hover, #hide-forum-list:hover,
- #sidebar-ungrouped:hover, .side-link:hover, .nets-ul li:hover, #forum-list div:hover,
- .nets-all:hover, .saved-search-li:hover, li.tool:hover, .admin.link:hover, aside h4 a:hover, #message-new:hover {
+ #sidebar-ungrouped:hover, .side-link:hover, .nets-ul li:hover, #forum-list div:hover, #forum-list-right div:hover,
+ .nets-all:hover, .saved-search-li:hover, li.tool:hover, .admin.link:hover, aside h4 a:hover, right_aside h4 a:hover, #message-new:hover {
    /* background-color: #ddd; */
  /*  background-color: #e5e5e5; */
    background-color: #F5F5F5;
    font-weight: bold;
  }
  
- #sidebar-new-group, #hide-forum-list, #forum-list, #sidebar-ungrouped,
+ #sidebar-new-group, #hide-forum-list, #forum-list, #forum-list-right, #sidebar-ungrouped,
  .side-link, #peoplefind-desc, #connect-desc, .nets-all, .admin.link, #message-new {
    padding-left: 10px;
    padding-top: 3px;
    display: block;
  }
  
- a.nets-link, .side-link a, #sidebar-new-group a, a.savedsearchterm, a.fileas-link, aside h4 a {
+ a.nets-link, .side-link a, #sidebar-new-group a, a.savedsearchterm, a.fileas-link, aside h4 a, right_aside h4 a {
    display: block;
    color: #737373;
  }
@@@ -445,11 -445,11 +445,11 @@@ a.sidebar-group-element 
    color: black;
  }
  
- #forum-list a, .tool a, .admin.link a {
+ #forum-list a, #forum-list-right a, .tool a, .admin.link a {
    color: #737373;
  }
  
- #forum-list {
+ #forum-list, #forum-list-right {
    margin-top: 2px;
  }
  
@@@ -874,7 -874,7 +874,7 @@@ ul.menu-popup .empty 
  right_aside {
    width: 0px;
    top: 32px;
-   display: block;
+   display: none;
  }
  
  /* aside */
@@@ -970,7 -970,7 +970,7 @@@ aside #profiles-menu 
    left: 10px;
  }
  
- aside #search-text, aside #side-follow-url, aside #side-peoplefind-url {
+ aside #search-text, aside #side-follow-url, aside #side-peoplefind-url, right_aside input {
    width: 140px;
    height: 17px;
    padding-left: 10px;
    -moz-border-right-colors: #dbdbdb;*/
  }
  
- aside h4 {
+ aside h4, right_aside h4 {
    margin-bottom: 0px;
    margin-top: 0px;
    font-size: 1.17em;
@@@ -1347,13 -1347,11 +1347,13 @@@ section.minimal 
    width: 100%;
    margin-bottom: 0.3em;
  }
 -.wall-item-container .wall-item-actions-social {
 +.wall-item-container .wall-item-actions-social, 
 +.wall-item-container .wall-item-actions-isevent {
    float: left;
    margin-bottom: 1px;
  }
 -.wall-item-container .wall-item-actions-social a {
 +.wall-item-container .wall-item-actions-social a, 
 +.wall-item-container .wall-item-actions-isevent a {
    float: left;
    margin-right: 1em;
    cursor: pointer;