From 997e94555b1511b907662f688207f17d4ad868e2 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Mon, 27 Feb 2017 21:46:37 +0000
Subject: [PATCH 01/21] The old pager is removed

---
 include/Contact.php           | 30 ++----------------------------
 mod/admin.php                 |  3 ---
 mod/community.php             | 27 +--------------------------
 mod/network.php               | 19 +------------------
 mod/profile.php               | 25 ++-----------------------
 view/templates/admin_site.tpl |  1 -
 6 files changed, 6 insertions(+), 99 deletions(-)

diff --git a/include/Contact.php b/include/Contact.php
index 2aab828f8a..9e3e6e010d 100644
--- a/include/Contact.php
+++ b/include/Contact.php
@@ -675,15 +675,6 @@ function posts_from_gcontact(App $a, $gcontact_id) {
 	else
 		$sql = "`item`.`uid` = %d";
 
-	if(get_config('system', 'old_pager')) {
-		$r = q("SELECT COUNT(*) AS `total` FROM `item`
-			WHERE `gcontact-id` = %d and $sql",
-			intval($gcontact_id),
-			intval(local_user()));
-
-		$a->set_pager_total($r[0]['total']);
-	}
-
 	$r = q("SELECT `item`.`uri`, `item`.*, `item`.`id` AS `item_id`,
 			`author-name` AS `name`, `owner-avatar` AS `photo`,
 			`owner-link` AS `url`, `owner-avatar` AS `thumb`
@@ -699,11 +690,7 @@ function posts_from_gcontact(App $a, $gcontact_id) {
 
 	$o = conversation($a,$r,'community',false);
 
-	if(!get_config('system', 'old_pager')) {
-		$o .= alt_pager($a,count($r));
-	} else {
-		$o .= paginate($a);
-	}
+	$o .= alt_pager($a,count($r));
 
 	return $o;
 }
@@ -736,15 +723,6 @@ function posts_from_contact_url(App $a, $contact_url) {
 
 	$author_id = intval($r[0]["author-id"]);
 
-	if (get_config('system', 'old_pager')) {
-		$r = q("SELECT COUNT(*) AS `total` FROM `item`
-			WHERE `author-id` = %d and $sql",
-			intval($author_id),
-			intval(local_user()));
-
-		$a->set_pager_total($r[0]['total']);
-	}
-
 	$r = q(item_query()." AND `item`.`author-id` = %d AND ".$sql.
 		" ORDER BY `item`.`created` DESC LIMIT %d, %d",
 		intval($author_id),
@@ -755,11 +733,7 @@ function posts_from_contact_url(App $a, $contact_url) {
 
 	$o = conversation($a,$r,'community',false);
 
-	if (!get_config('system', 'old_pager')) {
-		$o .= alt_pager($a,count($r));
-	} else {
-		$o .= paginate($a);
-	}
+	$o .= alt_pager($a,count($r));
 
 	return $o;
 }
diff --git a/mod/admin.php b/mod/admin.php
index 1475130834..d91b2d0a5f 100644
--- a/mod/admin.php
+++ b/mod/admin.php
@@ -662,7 +662,6 @@ function admin_page_site_post(App $a) {
 	$basepath		=	((x($_POST,'basepath'))			? notags(trim($_POST['basepath']))		: '');
 	$singleuser		=	((x($_POST,'singleuser'))		? notags(trim($_POST['singleuser']))		: '');
 	$proxy_disabled		=	((x($_POST,'proxy_disabled'))		? True						: False);
-	$old_pager		=	((x($_POST,'old_pager'))		? True						: False);
 	$only_tag_search	=	((x($_POST,'only_tag_search'))		? True						: False);
 	$rino			=	((x($_POST,'rino'))			? intval($_POST['rino'])			: 0);
 	$embedly		=	((x($_POST,'embedly'))			? notags(trim($_POST['embedly']))		: '');
@@ -815,7 +814,6 @@ function admin_page_site_post(App $a) {
 	set_config('system','temppath', $temppath);
 	set_config('system','basepath', $basepath);
 	set_config('system','proxy_disabled', $proxy_disabled);
-	set_config('system','old_pager', $old_pager);
 	set_config('system','only_tag_search', $only_tag_search);
 	set_config('system','worker', $worker);
 	set_config('system','worker_queues', $worker_queues);
@@ -1061,7 +1059,6 @@ function admin_page_site(App $a) {
 		'$temppath'		=> array('temppath', t("Temp path"), get_config('system','temppath'), t("If you have a restricted system where the webserver can't access the system temp path, enter another path here.")),
 		'$basepath'		=> array('basepath', t("Base path to installation"), get_config('system','basepath'), t("If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot.")),
 		'$proxy_disabled'	=> array('proxy_disabled', t("Disable picture proxy"), get_config('system','proxy_disabled'), t("The picture proxy increases performance and privacy. It shouldn't be used on systems with very low bandwith.")),
-		'$old_pager'		=> array('old_pager', t("Enable old style pager"), get_config('system','old_pager'), t("The old style pager has page numbers but slows down massively the page speed.")),
 		'$only_tag_search'	=> array('only_tag_search', t("Only search in tags"), get_config('system','only_tag_search'), t("On large systems the text search can slow down the system extremely.")),
 
 		'$relocate_url'		=> array('relocate_url', t("New base url"), App::get_baseurl(), t("Change base url for this server. Sends relocate message to all DFRN contacts of all users.")),
diff --git a/mod/community.php b/mod/community.php
index 7c92ff462f..91b09bba9a 100644
--- a/mod/community.php
+++ b/mod/community.php
@@ -48,27 +48,6 @@ function community_content(App $a, $update = 0) {
 	// Only public posts can be shown
 	// OR your own posts if you are a logged in member
 
-	if(get_config('system', 'old_pager')) {
-		$r = qu("SELECT COUNT(distinct(`item`.`uri`)) AS `total`
-			FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
-			AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
-			INNER JOIN `user` ON `user`.`uid` = `item`.`uid` AND `user`.`hidewall` = 0
-			WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 and `item`.`moderated` = 0
-			AND `item`.`allow_cid` = ''  AND `item`.`allow_gid` = ''
-			AND `item`.`deny_cid`  = '' AND `item`.`deny_gid`  = ''
-			AND `item`.`private` = 0 AND `item`.`wall` = 1"
-		);
-
-		if (dbm::is_result($r))
-			$a->set_pager_total($r[0]['total']);
-
-		if(! $r[0]['total']) {
-			info( t('No results.') . EOL);
-			return $o;
-		}
-
-	}
-
 	$r = community_getitems($a->pager['start'], $a->pager['itemspage']);
 
 	if (! dbm::is_result($r)) {
@@ -107,11 +86,7 @@ function community_content(App $a, $update = 0) {
 
 	$o .= conversation($a,$s,'community',$update);
 
-	if(!get_config('system', 'old_pager')) {
-	        $o .= alt_pager($a,count($r));
-	} else {
-	        $o .= paginate($a);
-	}
+        $o .= alt_pager($a,count($r));
 
 	return $o;
 }
diff --git a/mod/network.php b/mod/network.php
index 23cf098b65..284bf3d961 100644
--- a/mod/network.php
+++ b/mod/network.php
@@ -599,21 +599,6 @@ function network_content(App $a, $update = 0) {
 		$pager_sql = '';
 
 	} else {
-		if(get_config('system', 'old_pager')) {
-			$r = qu("SELECT COUNT(*) AS `total`
-				FROM $sql_table $sql_post_table INNER JOIN `contact` ON `contact`.`id` = $sql_table.`contact-id`
-				AND (NOT `contact`.`blocked` OR `contact`.`pending`)
-				WHERE $sql_table.`uid` = %d AND $sql_table.`visible` AND NOT $sql_table.`deleted`
-				$sql_extra2 $sql_extra3
-				$sql_extra $sql_nets ",
-				intval($_SESSION['uid'])
-			);
-
-			if (dbm::is_result($r)) {
-				$a->set_pager_total($r[0]['total']);
-			}
-		}
-
 		//  check if we serve a mobile device and get the user settings
 		//  accordingly
 		if ($a->is_mobile) {
@@ -793,10 +778,8 @@ function network_content(App $a, $update = 0) {
 	if (!$update) {
 		if (get_pconfig(local_user(),'system','infinite_scroll')) {
 			$o .= scroll_loader();
-		} elseif (!get_config('system', 'old_pager')) {
-			$o .= alt_pager($a,count($items));
 		} else {
-			$o .= paginate($a);
+			$o .= alt_pager($a,count($items));
 		}
 	}
 
diff --git a/mod/profile.php b/mod/profile.php
index 5dd8293c7f..ab7b7cff76 100644
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -240,23 +240,6 @@ function profile_content(App $a, $update = 0) {
 			$sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2))));
 		}
 
-		if(get_config('system', 'old_pager')) {
-		    $r = q("SELECT COUNT(*) AS `total`
-			    FROM `thread` INNER JOIN `item` ON `item`.`id` = `thread`.`iid`
-			    $sql_post_table INNER JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
-			    AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
-			    WHERE `thread`.`uid` = %d AND `thread`.`visible` = 1 AND `thread`.`deleted` = 0
-			    and `thread`.`moderated` = 0
-			    AND `thread`.`wall` = 1
-			    $sql_extra $sql_extra2 ",
-			    intval($a->profile['profile_uid'])
-			);
-
-			if (dbm::is_result($r)) {
-				$a->set_pager_total($r[0]['total']);
-			}
-		}
-
 		//  check if we serve a mobile device and get the user settings
 		//  accordingly
 		if ($a->is_mobile) {
@@ -328,12 +311,8 @@ function profile_content(App $a, $update = 0) {
 
 	$o .= conversation($a,$items,'profile',$update);
 
-	if(! $update) {
-		if(!get_config('system', 'old_pager')) {
-			$o .= alt_pager($a,count($items));
-		} else {
-			$o .= paginate($a);
-		}
+	if (!$update) {
+		$o .= alt_pager($a,count($items));
 	}
 
 	return $o;
diff --git a/view/templates/admin_site.tpl b/view/templates/admin_site.tpl
index 2edfddb885..7434993705 100644
--- a/view/templates/admin_site.tpl
+++ b/view/templates/admin_site.tpl
@@ -153,7 +153,6 @@
 	{{include file="field_input.tpl" field=$itemcache_duration}}
 	{{include file="field_input.tpl" field=$max_comments}}
 	{{include file="field_checkbox.tpl" field=$proxy_disabled}}
-	{{include file="field_checkbox.tpl" field=$old_pager}}
 	<div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div>
 
 	<h3>{{$worker_title}}</h3>

From a3cd804ff12e4cca5e2adc2b750378007bca4146 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <ben.lort@gmail.com>
Date: Wed, 1 Mar 2017 23:23:14 -0500
Subject: [PATCH 02/21] Fix default paginate.tpl

Adding missing curly braces
---
 view/templates/paginate.tpl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/view/templates/paginate.tpl b/view/templates/paginate.tpl
index 21d56509aa..fcd580b071 100644
--- a/view/templates/paginate.tpl
+++ b/view/templates/paginate.tpl
@@ -2,7 +2,7 @@
 	{{if $pager}}
 	{{if $pager.prev}}<span class="pager_prev {{$pager.prev.class}}"><a href="{{$pager.prev.url}}">{{$pager.prev.text}}</a></span>{{/if}}
 
-	{{if $pager.first}}<span class="pager_first $pager.first.class"><a href="{{$pager.first.url}}">{{$pager.first.text}}</a></span>{{/if}}
+	{{if $pager.first}}<span class="pager_first {{$pager.first.class}}"><a href="{{$pager.first.url}}">{{$pager.first.text}}</a></span>{{/if}}
 
 	{{foreach $pager.pages as $p}}<span class="pager_{{$p.class}}"><a href="{{$p.url}}">{{$p.text}}</a></span>{{/foreach}}
 

From 07aefe61bfeab5046f74a7f7940963011c81baf5 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <ben.lort@gmail.com>
Date: Wed, 1 Mar 2017 23:26:49 -0500
Subject: [PATCH 03/21] Update paginate_data()

- Formatting: Normalize quotes, spaces, braces
- Add "disabled" CSS class to links previously ommitted
- Add "previous" and "next" CSS classes to minimal pager links
- Add main pager CSS class depending on type
---
 include/text.php | 89 ++++++++++++++++++++++++------------------------
 1 file changed, 44 insertions(+), 45 deletions(-)

diff --git a/include/text.php b/include/text.php
index 11248902ba..580bd95fc7 100644
--- a/include/text.php
+++ b/include/text.php
@@ -268,90 +268,89 @@ function hex2bin($s) {
 }}
 
 
-if(! function_exists('paginate_data')) {
 /**
- * Automatica pagination data.
+ * @brief Paginator function. Pushes relevant links in a pager array structure.
+ *
+ * Links are generated depending on the current page and the total number of items.
+ * Inactive links (like "first" and "prev" on page 1) are given the "disabled" class.
+ * Current page link is given the "active" CSS class
  *
  * @param App $a App instance
- * @param int $count [optional] item count (used with alt pager)
+ * @param int $count [optional] item count (used with minimal pager)
  * @return Array data for pagination template
  */
-function paginate_data(App $a, $count=null) {
-	$stripped = preg_replace('/([&?]page=[0-9]*)/','',$a->query_string);
+function paginate_data(App $a, $count = null) {
+	$stripped = preg_replace('/([&?]page=[0-9]*)/', '', $a->query_string);
 
-	$stripped = str_replace('q=','',$stripped);
-	$stripped = trim($stripped,'/');
+	$stripped = str_replace('q=', '', $stripped);
+	$stripped = trim($stripped, '/');
 	$pagenum = $a->pager['page'];
 
-	if (($a->page_offset != "") AND !preg_match('/[?&].offset=/', $stripped))
-		$stripped .= "&offset=".urlencode($a->page_offset);
+	if (($a->page_offset != '') AND !preg_match('/[?&].offset=/', $stripped)) {
+		$stripped .= '&offset=' . urlencode($a->page_offset);
+	}
 
 	$url = $stripped;
 
 	$data = array();
-	function _l(&$d, $name, $url, $text, $class="") {
-		if (!strpos($url, "?")) {
-			if ($pos = strpos($url, "&"))
-				$url = substr($url, 0, $pos)."?".substr($url, $pos + 1);
+	function _l(&$d, $name, $url, $text, $class = '') {
+		if (strpos($url, '?') === false && ($pos = strpos($url, '&')) !== false) {
+			$url = substr($url, 0, $pos) . '?' . substr($url, $pos + 1);
 		}
 
-		$d[$name] = array('url'=>$url, 'text'=>$text, 'class'=>$class);
+		$d[$name] = array('url' => $url, 'text' => $text, 'class' => $class);
 	}
 
-	if (!is_null($count)){
-		// alt pager
-		if($a->pager['page']>1)
-			_l($data,  "prev", $url.'&page='.($a->pager['page'] - 1), t('newer'));
-		if($count>0)
-			_l($data,  "next", $url.'&page='.($a->pager['page'] + 1), t('older'));
+	if (!is_null($count)) {
+		// minimal pager (newer / older)
+		$data['class'] = 'pager';
+		_l($data, 'prev', $url . '&page=' . ($a->pager['page'] - 1), t('newer'), 'previous' . ($a->pager['page'] == 1 ? ' disabled' : ''));
+		_l($data, 'next', $url . '&page=' . ($a->pager['page'] + 1), t('older'), 'next' . ($count <= 0 ? ' disabled' : ''));
 	} else {
-		// full pager
-		if($a->pager['total'] > $a->pager['itemspage']) {
-			if($a->pager['page'] != 1)
-				_l($data,  "prev", $url.'&page='.($a->pager['page'] - 1), t('prev'));
-
-			_l($data, "first", $url."&page=1",  t('first'));
-
+		// full pager (first / prev / 1 / 2 / ... / 14 / 15 / next / last)
+		$data['class'] = 'pagination';
+		if ($a->pager['total'] > $a->pager['itemspage']) {
+			_l($data, 'first', $url . '&page=1',  t('first'), $a->pager['page'] == 1 ? 'disabled' : '');
+			_l($data, 'prev', $url . '&page=' . ($a->pager['page'] - 1), t('prev'), $a->pager['page'] == 1 ? 'disabled' : '');
 
 			$numpages = $a->pager['total'] / $a->pager['itemspage'];
 
 			$numstart = 1;
 			$numstop = $numpages;
 
-			if($numpages > 14) {
+			if ($numpages > 14) {
 				$numstart = (($pagenum > 7) ? ($pagenum - 7) : 1);
 				$numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 14));
 			}
 
 			$pages = array();
 
-			for($i = $numstart; $i <= $numstop; $i++){
-				if($i == $a->pager['page'])
-					_l($pages, $i, "#",  $i, "current");
-				else
-					_l($pages, $i, $url."&page=$i", $i, "n");
+			for ($i = $numstart; $i <= $numstop; $i++) {
+				if ($i == $a->pager['page']) {
+					_l($pages, $i, '#',  $i, 'current active');
+				} else {
+					_l($pages, $i, $url . '&page='. $i, $i, 'n');
+				}
 			}
 
-			if(($a->pager['total'] % $a->pager['itemspage']) != 0) {
-				if($i == $a->pager['page'])
-					_l($pages, $i, "#",  $i, "current");
-				else
-					_l($pages, $i, $url."&page=$i", $i, "n");
+			if (($a->pager['total'] % $a->pager['itemspage']) != 0) {
+				if ($i == $a->pager['page']) {
+					_l($pages, $i, '#',  $i, 'current active');
+				} else {
+					_l($pages, $i, $url . '&page=' . $i, $i, 'n');
+				}
 			}
 
 			$data['pages'] = $pages;
 
 			$lastpage = (($numpages > intval($numpages)) ? intval($numpages)+1 : $numpages);
-			_l($data, "last", $url."&page=$lastpage", t('last'));
-
-			if(($a->pager['total'] - ($a->pager['itemspage'] * $a->pager['page'])) > 0)
-				_l($data, "next", $url."&page=".($a->pager['page'] + 1), t('next'));
-
+			_l($data, 'next', $url . '&page=' . ($a->pager['page'] + 1), t('next'), $a->pager['page'] == $lastpage ? 'disabled' : '');
+			_l($data, 'last', $url . '&page=' . $lastpage, t('last'), $a->pager['page'] == $lastpage ? 'disabled' : '');
 		}
 	}
-	return $data;
 
-}}
+	return $data;
+}
 
 if(! function_exists('paginate')) {
 /**

From 21cad46d19f4a049b9d4d69a0a569e023c652b6d Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <ben.lort@gmail.com>
Date: Wed, 1 Mar 2017 23:40:34 -0500
Subject: [PATCH 04/21] Backward compatibility for theme other than frio

- Add .pager .disabled CSS rule
---
 view/theme/duepuntozero/style.css  | 3 +++
 view/theme/frost-mobile/style.css  | 3 +++
 view/theme/frost/style.css         | 3 +++
 view/theme/quattro/green/style.css | 3 +++
 view/theme/quattro/lilac/style.css | 3 +++
 view/theme/quattro/quattro.less    | 3 +++
 view/theme/smoothly/style.css      | 4 ++++
 view/theme/vier/style.css          | 4 ++++
 8 files changed, 26 insertions(+)

diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css
index c1e8067443..8e2c5d4478 100644
--- a/view/theme/duepuntozero/style.css
+++ b/view/theme/duepuntozero/style.css
@@ -1552,6 +1552,9 @@ blockquote.shared_content {
   clear:left;
 }
 
+.pager .disabled {
+	display: none;
+}
 
 .pager_first,
 .pager_last,
diff --git a/view/theme/frost-mobile/style.css b/view/theme/frost-mobile/style.css
index c005e838f1..7c5d2c7609 100644
--- a/view/theme/frost-mobile/style.css
+++ b/view/theme/frost-mobile/style.css
@@ -1909,6 +1909,9 @@ input#profile-jot-email {
 	-webkit-border-radius: 10px;
 }
 
+.pager .disabled {
+	display: none;
+}
 
 .pager_first,
 .pager_last,
diff --git a/view/theme/frost/style.css b/view/theme/frost/style.css
index 46eb650ec1..9b65da9c8c 100644
--- a/view/theme/frost/style.css
+++ b/view/theme/frost/style.css
@@ -1866,6 +1866,9 @@ input#dfrn-url {
 	-webkit-border-radius: 10px;
 }
 
+.pager .disabled {
+	display: none;
+}
 
 .pager_first,
 .pager_last,
diff --git a/view/theme/quattro/green/style.css b/view/theme/quattro/green/style.css
index 8eba0e4cf7..af5cfcedf0 100644
--- a/view/theme/quattro/green/style.css
+++ b/view/theme/quattro/green/style.css
@@ -2481,6 +2481,9 @@ footer {
   margin-top: 25px;
   clear: both;
 }
+.pager .disabled {
+	display: none;
+}
 /**
  * ADMIN
  */
diff --git a/view/theme/quattro/lilac/style.css b/view/theme/quattro/lilac/style.css
index b424534206..0c17b00331 100644
--- a/view/theme/quattro/lilac/style.css
+++ b/view/theme/quattro/lilac/style.css
@@ -2481,6 +2481,9 @@ footer {
   margin-top: 25px;
   clear: both;
 }
+.pager .disabled {
+	display: none;
+}
 /**
  * ADMIN
  */
diff --git a/view/theme/quattro/quattro.less b/view/theme/quattro/quattro.less
index 6c01986888..53bb7e38a6 100644
--- a/view/theme/quattro/quattro.less
+++ b/view/theme/quattro/quattro.less
@@ -1675,6 +1675,9 @@ footer { height: 100px; display: table-row; }
         margin-top: 25px;
         clear: both;
 }
+.pager .disabled {
+	display: none;
+}
 
 /**
  * ADMIN
diff --git a/view/theme/smoothly/style.css b/view/theme/smoothly/style.css
index e91eccfe17..ec52277bdd 100644
--- a/view/theme/smoothly/style.css
+++ b/view/theme/smoothly/style.css
@@ -396,6 +396,10 @@ ul.menu-popup li a:hover {
 	margin: 4px;
 }
 
+.pager .disabled {
+	display: none;
+}
+
 .pager_current {
 	background-color: #1873a2;
 	color: #ffffff;
diff --git a/view/theme/vier/style.css b/view/theme/vier/style.css
index 8454c7e0ae..32617867cb 100644
--- a/view/theme/vier/style.css
+++ b/view/theme/vier/style.css
@@ -247,6 +247,10 @@ div.pager {
   float: left;
 }
 
+.pager .disabled {
+	display: none;
+}
+
 .hide-comments-outer {
   margin-left: 80px;
   margin-bottom: 5px;

From 57ce6cf5daaff5d1d4433b9a8059f5dea7b68bf5 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <ben.lort@gmail.com>
Date: Wed, 1 Mar 2017 23:41:54 -0500
Subject: [PATCH 05/21] Improve pagination on frio theme

- Add pager class discrimination
- Change links order to first / prev / 1 / ... / 10 / next / last
- Enable dynamic pagination coloring
- Prevent click on disabled links
---
 view/theme/frio/css/style.css          | 20 ++++++++++++++++++++
 view/theme/frio/templates/paginate.tpl | 13 +++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 view/theme/frio/templates/paginate.tpl

diff --git a/view/theme/frio/css/style.css b/view/theme/frio/css/style.css
index df9585d070..ea4db0d532 100644
--- a/view/theme/frio/css/style.css
+++ b/view/theme/frio/css/style.css
@@ -2515,3 +2515,23 @@ body .tread-wrapper .hovercard:hover .hover-card-content a {
 section .profile-match-wrapper {
     float: left;
 }
+
+/* Pagination improvements */
+
+.pagination > li > a,
+.pagination > li > span {
+	color: $link_color;
+}
+.pagination>.active>a,
+.pagination>.active>a:focus,
+.pagination>.active>a:hover,
+.pagination>.active>span,
+.pagination>.active>span:focus,
+.pagination>.active>span:hover {
+	background-color: $link_color;
+    border-color: $link_color;
+}
+
+.disabled > a {
+	pointer-events: none;
+}
\ No newline at end of file
diff --git a/view/theme/frio/templates/paginate.tpl b/view/theme/frio/templates/paginate.tpl
new file mode 100644
index 0000000000..a9c3ae480d
--- /dev/null
+++ b/view/theme/frio/templates/paginate.tpl
@@ -0,0 +1,13 @@
+{{if $pager}}
+<div class="{{$pager.class}}">
+	{{if $pager.first}}<li class="pager_first {{$pager.first.class}}"><a href="{{$pager.first.url}}">{{$pager.first.text}}</a></li>{{/if}}
+
+	{{if $pager.prev}}<li class="pager_prev {{$pager.prev.class}}"><a href="{{$pager.prev.url}}">{{$pager.prev.text}}</a></li>{{/if}}
+
+	{{foreach $pager.pages as $p}}<li class="pager_{{$p.class}}"><a href="{{$p.url}}">{{$p.text}}</a></li>{{/foreach}}
+
+	{{if $pager.next}}<li class="pager_next {{$pager.next.class}}"><a href="{{$pager.next.url}}">{{$pager.next.text}}</a></li>{{/if}}
+
+	{{if $pager.last}}&nbsp;<li class="pager_last {{$pager.last.class}}"><a href="{{$pager.last.url}}">{{$pager.last.text}}</a></li>{{/if}}
+</div>
+{{/if}}

From ebdc9667f796de83c6b4da2247d11f8658725a1b Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <mrpetovan@gmail.com>
Date: Thu, 2 Mar 2017 11:30:41 -0500
Subject: [PATCH 06/21] Improve readability

- Move CSS block above the temporary block
- Add template description
---
 view/theme/frio/css/style.css          | 20 +++++++++-----------
 view/theme/frio/templates/paginate.tpl |  1 +
 2 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/view/theme/frio/css/style.css b/view/theme/frio/css/style.css
index ea4db0d532..34bcb833db 100644
--- a/view/theme/frio/css/style.css
+++ b/view/theme/frio/css/style.css
@@ -2508,16 +2508,7 @@ body .tread-wrapper .hovercard:hover .hover-card-content a {
     color: $link_color !important;
 }
 
-/*
- * some temporary workarounds until this will solved
- * elsewhere (e.g. new templates)
- */
-section .profile-match-wrapper {
-    float: left;
-}
-
 /* Pagination improvements */
-
 .pagination > li > a,
 .pagination > li > span {
 	color: $link_color;
@@ -2531,7 +2522,14 @@ section .profile-match-wrapper {
 	background-color: $link_color;
     border-color: $link_color;
 }
-
 .disabled > a {
 	pointer-events: none;
-}
\ No newline at end of file
+}
+
+/*
+ * some temporary workarounds until this will solved
+ * elsewhere (e.g. new templates)
+ */
+section .profile-match-wrapper {
+    float: left;
+}
diff --git a/view/theme/frio/templates/paginate.tpl b/view/theme/frio/templates/paginate.tpl
index a9c3ae480d..ab65cdd406 100644
--- a/view/theme/frio/templates/paginate.tpl
+++ b/view/theme/frio/templates/paginate.tpl
@@ -1,3 +1,4 @@
+{{* Pager template, uses output of paginate_data() in include/text.php *}}
 {{if $pager}}
 <div class="{{$pager.class}}">
 	{{if $pager.first}}<li class="pager_first {{$pager.first.class}}"><a href="{{$pager.first.url}}">{{$pager.first.text}}</a></li>{{/if}}

From 024908a3ece9f94c615072dd026b6ec1b5cda6e3 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <ben.lort@gmail.com>
Date: Thu, 2 Mar 2017 19:00:22 -0500
Subject: [PATCH 07/21] Delete frio obsolete Colors.php library

---
 view/theme/frio/php/Colors.php | 292 ---------------------------------
 1 file changed, 292 deletions(-)
 delete mode 100644 view/theme/frio/php/Colors.php

diff --git a/view/theme/frio/php/Colors.php b/view/theme/frio/php/Colors.php
deleted file mode 100644
index d6ba15fbc1..0000000000
--- a/view/theme/frio/php/Colors.php
+++ /dev/null
@@ -1,292 +0,0 @@
-<?php
-
-class colors {
-
-/* Convert hexdec color string to rgb(a) string */
- 
-	function hex2rgba($color, $opacity = false) {
-
-		$default = 'rgb(0,0,0)';
-
-		//Return default if no color provided
-		if(empty($color))
-		  return $default; 
-
-		//Sanitize $color if "#" is provided 
-		if ($color[0] == '#' ) {
-			$color = substr( $color, 1 );
-		}
-
-		//Check if color has 6 or 3 characters and get values
-		if (strlen($color) == 6) {
-			$hex = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5] );
-		} elseif ( strlen( $color ) == 3 ) {
-			$hex = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] );
-		} else {
-			return $default;
-		}
-
-		//Convert hexadec to rgb
-		$rgb =  array_map('hexdec', $hex);
-
-		//Check if opacity is set(rgba or rgb)
-		if($opacity){
-			if(abs($opacity) > 1)
-				$opacity = 1.0;
-			$output = 'rgba('.implode(",",$rgb).','.$opacity.')';
-		} else {
-			$output = 'rgb('.implode(",",$rgb).')';
-		}
-
-		//Return rgb(a) color string
-		return $output;
-	}
-
-	function hex2rgb( $colour ) {
-		if ( $colour[0] == '#' ) {
-			$colour = substr( $colour, 1 );
-		}
-		if ( strlen( $colour ) == 6 ) {
-			list( $r, $g, $b ) = array( $colour[0] . $colour[1], $colour[2] . $colour[3], $colour[4] . $colour[5] );
-		} elseif ( strlen( $colour ) == 3 ) {
-			list( $r, $g, $b ) = array( $colour[0] . $colour[0], $colour[1] . $colour[1], $colour[2] . $colour[2] );
-		} else {
-			return false;
-		}
-		$r = hexdec( $r );
-		$g = hexdec( $g );
-		$b = hexdec( $b );
-		return array( 'red' => $r, 'green' => $g, 'blue' => $b );
-	}
-
-
-	function rgbToHsl( $r, $g, $b ) {
-		$oldR = $r;
-		$oldG = $g;
-		$oldB = $b;
-		$r /= 255;
-		$g /= 255;
-		$b /= 255;
-		$max = max( $r, $g, $b );
-		$min = min( $r, $g, $b );
-		$h;
-		$s;
-		$l = ( $max + $min ) / 2;
-		$d = $max - $min;
-
-		if( $d == 0 ){
-			$h = $s = 0; // achromatic
-		} else {
-			$s = $d / ( 1 - abs( 2 * $l - 1 ) );
-			switch( $max ){
-				case $r:
-					$h = 60 * fmod( ( ( $g - $b ) / $d ), 6 ); 
-					if ($b > $g) {
-						$h += 360;
-					}
-					break;
-				case $g: 
-					$h = 60 * ( ( $b - $r ) / $d + 2 ); 
-					break;
-				case $b: 
-					$h = 60 * ( ( $r - $g ) / $d + 4 ); 
-					break;
-			}
-		}
-
-		return array( round( $h, 2 ), round( $s, 2 ), round( $l, 2 ) );
-	}
-	function hslToRgb( $h, $s, $l ){
-		$r = ""; 
-		$g = ""; 
-		$b = "";
-
-		$c = ( 1 - abs( 2 * $l - 1 ) ) * $s;
-		$x = $c * ( 1 - abs( fmod( ( $h / 60 ), 2 ) - 1 ) );
-		$m = $l - ( $c / 2 );
-		if ( $h < 60 ) {
-			$r = $c;
-			$g = $x;
-			$b = 0;
-		} else if ( $h < 120 ) {
-			$r = $x;
-			$g = $c;
-			$b = 0;
-		} else if ( $h < 180 ) {
-			$r = 0;
-			$g = $c;
-			$b = $x;
-		} else if ( $h < 240 ) {
-			$r = 0;
-			$g = $x;
-			$b = $c;
-		} else if ( $h < 300 ) {
-			$r = $x;
-			$g = 0;
-			$b = $c;
-		} else {
-			$r = $c;
-			$g = 0;
-			$b = $x;
-		}
-
-		$r = ( $r + $m ) * 255;
-		$g = ( $g + $m ) * 255;
-		$b = ( $b + $m  ) * 255;
-
-		return array( floor( $r ), floor( $g ), floor( $b ) );
-	}
-
-	/*
-	 * Som more example code - this needs to be deletet if we don't need it in
-	 * the future
-	 */
-
-	  function HTMLToRGB($htmlCode)
-	  {
-	    if($htmlCode[0] == '#')
-	      $htmlCode = substr($htmlCode, 1);
-
-	    if (strlen($htmlCode) == 3)
-	    {
-	      $htmlCode = $htmlCode[0] . $htmlCode[0] . $htmlCode[1] . $htmlCode[1] . $htmlCode[2] . $htmlCode[2];
-	    }
-
-	    $r = hexdec($htmlCode[0] . $htmlCode[1]);
-	    $g = hexdec($htmlCode[2] . $htmlCode[3]);
-	    $b = hexdec($htmlCode[4] . $htmlCode[5]);
-
-	    return $b + ($g << 0x8) + ($r << 0x10);
-	  }
-
-	  function RGBToHTML($RGB)
-	  {
-	    $r = 0xFF & ($RGB >> 0x10);
-	    $g = 0xFF & ($RGB >> 0x8);
-	    $b = 0xFF & $RGB;
-
-	    $r = dechex($r);
-	    $g = dechex($g);
-	    $b = dechex($b);
-
-	    return "#" . str_pad($r, 2, "0", STR_PAD_LEFT) . str_pad($g, 2, "0", STR_PAD_LEFT) . str_pad($b, 2, "0", STR_PAD_LEFT);
-	  }
-
-	  function ChangeLuminosity($RGB, $LuminosityPercent)
-	  {
-	    $HSL = RGBToHSL($RGB);
-	    $NewHSL = (int)(((float)$LuminosityPercent / 100) * 255) + (0xFFFF00 & $HSL);
-	    return HSLToRGB($NewHSL);
-	  }
-
-	  function RGBToHSL($RGB)
-	  {
-	    $r = 0xFF & ($RGB >> 0x10);
-	    $g = 0xFF & ($RGB >> 0x8);
-	    $b = 0xFF & $RGB;
-
-	    $r = ((float)$r) / 255.0;
-	    $g = ((float)$g) / 255.0;
-	    $b = ((float)$b) / 255.0;
-
-	    $maxC = max($r, $g, $b);
-	    $minC = min($r, $g, $b);
-
-	    $l = ($maxC + $minC) / 2.0;
-
-	    if($maxC == $minC)
-	    {
-	      $s = 0;
-	      $h = 0;
-	    }
-	    else
-	    {
-	      if($l < .5)
-	      {
-		$s = ($maxC - $minC) / ($maxC + $minC);
-	      }
-	      else
-	      {
-		$s = ($maxC - $minC) / (2.0 - $maxC - $minC);
-	      }
-	      if($r == $maxC)
-		$h = ($g - $b) / ($maxC - $minC);
-	      if($g == $maxC)
-		$h = 2.0 + ($b - $r) / ($maxC - $minC);
-	      if($b == $maxC)
-		$h = 4.0 + ($r - $g) / ($maxC - $minC);
-
-	      $h = $h / 6.0; 
-	    }
-
-	    $h = (int)round(255.0 * $h);
-	    $s = (int)round(255.0 * $s);
-	    $l = (int)round(255.0 * $l);
-
-	    $HSL = $l + ($s << 0x8) + ($h << 0x10);
-	    return $HSL;
-	  }
-
-	  function HSLToRGB($HSL)
-	  {
-	    $h = 0xFF & ($HSL >> 0x10);
-	    $s = 0xFF & ($HSL >> 0x8);
-	    $l = 0xFF & $HSL;
-
-	    $h = ((float)$h) / 255.0;
-	    $s = ((float)$s) / 255.0;
-	    $l = ((float)$l) / 255.0;
-
-	    if($s == 0)
-	    {
-	      $r = $l;
-	      $g = $l;
-	      $b = $l;
-	    }
-	    else
-	    {
-	      if($l < .5)
-	      {
-		$t2 = $l * (1.0 + $s);
-	      }
-	      else
-	      {
-		$t2 = ($l + $s) - ($l * $s);
-	      }
-	      $t1 = 2.0 * $l - $t2;
-
-	      $rt3 = $h + 1.0/3.0;
-	      $gt3 = $h;
-	      $bt3 = $h - 1.0/3.0;
-
-	      if($rt3 < 0) $rt3 += 1.0;
-	      if($rt3 > 1) $rt3 -= 1.0;
-	      if($gt3 < 0) $gt3 += 1.0;
-	      if($gt3 > 1) $gt3 -= 1.0;
-	      if($bt3 < 0) $bt3 += 1.0;
-	      if($bt3 > 1) $bt3 -= 1.0;
-
-	      if(6.0 * $rt3 < 1) $r = $t1 + ($t2 - $t1) * 6.0 * $rt3;
-	      elseif(2.0 * $rt3 < 1) $r = $t2;
-	      elseif(3.0 * $rt3 < 2) $r = $t1 + ($t2 - $t1) * ((2.0/3.0) - $rt3) * 6.0;
-	      else $r = $t1;
-
-	      if(6.0 * $gt3 < 1) $g = $t1 + ($t2 - $t1) * 6.0 * $gt3;
-	      elseif(2.0 * $gt3 < 1) $g = $t2;
-	      elseif(3.0 * $gt3 < 2) $g = $t1 + ($t2 - $t1) * ((2.0/3.0) - $gt3) * 6.0;
-	      else $g = $t1;
-
-	      if(6.0 * $bt3 < 1) $b = $t1 + ($t2 - $t1) * 6.0 * $bt3;
-	      elseif(2.0 * $bt3 < 1) $b = $t2;
-	      elseif(3.0 * $bt3 < 2) $b = $t1 + ($t2 - $t1) * ((2.0/3.0) - $bt3) * 6.0;
-	      else $b = $t1;
-	    }
-
-	    $r = (int)round(255.0 * $r);
-	    $g = (int)round(255.0 * $g);
-	    $b = (int)round(255.0 * $b);
-
-	    $RGB = $b + ($g << 0x8) + ($r << 0x10);
-	    return $RGB;
-	  }
-}
\ No newline at end of file

From da5bbe8b50226435a1ec7dc34cd4c40c8d024e5e Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <ben.lort@gmail.com>
Date: Mon, 6 Mar 2017 05:06:05 -0500
Subject: [PATCH 08/21] Add public_contact() function

- Add function to retrieve the public contact id (uid = 0) of the
current logged-in user
---
 boot.php | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/boot.php b/boot.php
index b8e9267070..a5774aaad8 100644
--- a/boot.php
+++ b/boot.php
@@ -1889,11 +1889,35 @@ function goaway($s) {
  * @return int|bool user id or false
  */
 function local_user() {
-	if((x($_SESSION,'authenticated')) && (x($_SESSION,'uid')))
+	if (x($_SESSION, 'authenticated') && x($_SESSION, 'uid')) {
 		return intval($_SESSION['uid']);
+	}
 	return false;
 }
 
+/**
+ * @brief Returns the public contact id of logged in user or false.
+ *
+ * @return int|bool public contact id or false
+ */
+function public_contact() {
+	static $public_contact_id = false;
+
+	if (!$public_contact_id && x($_SESSION, 'authenticated')) {
+		if (x($_SESSION, 'my_address')) {
+			// Local user
+			$public_contact_id = intval(get_contact($_SESSION['my_address'], 0));
+		} else if (x($_SESSION, 'visitor_home')) {
+			// Remote user
+			$public_contact_id = intval(get_contact($_SESSION['visitor_home'], 0));
+		}
+	} else if (!x($_SESSION, 'authenticated')) {
+		$public_contact_id = false;
+	}
+
+	return $public_contact_id;
+}
+
 /**
  * @brief Returns contact id of authenticated site visitor or false
  *

From 67ae0fed7fac98b71076e501bf6595cf917d3b13 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <ben.lort@gmail.com>
Date: Mon, 6 Mar 2017 05:07:17 -0500
Subject: [PATCH 09/21] Fix response "self" assigment

- Switch from unreliable `uid` matching to `author-id` using
public_contact()
---
 include/conversation.php | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/include/conversation.php b/include/conversation.php
index a1d086cb9d..93c42cd7b1 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -416,8 +416,8 @@ These Fields are not added below (yet). They are here to for bug search.
 `item`.`shadow`,
 */
 
-	return "`item`.`author-link`, `item`.`author-name`, `item`.`author-avatar`,
-		`item`.`owner-link`, `item`.`owner-name`, `item`.`owner-avatar`,
+	return "`item`.`author-id`, `item`.`author-link`, `item`.`author-name`, `item`.`author-avatar`,
+		`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`,
@@ -1066,8 +1066,9 @@ function builtin_activity_puller($item, &$conv_responses) {
 			else
 				$conv_responses[$mode][$item['thr-parent']] ++;
 
-			if((local_user()) && (local_user() == $item['uid']) && ($item['self']))
+			if (public_contact() == $item['author-id']) {
 				$conv_responses[$mode][$item['thr-parent'] . '-self'] = 1;
+			}
 
 			$conv_responses[$mode][$item['thr-parent'] . '-l'][] = $url;
 

From 4931ecafbb2bd3cd18a44d3a366c1051f64a08e0 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <ben.lort@gmail.com>
Date: Mon, 6 Mar 2017 05:28:01 -0500
Subject: [PATCH 10/21] Rewriting of do_like()

- Fix behavior where event actions had to be performed twice to switch
from one to another
- Simplify the contact data retrieval
- Make sure contact-id, owner-id and author-id are correctly set
---
 include/like.php | 264 +++++++++++++++++++++++------------------------
 1 file changed, 130 insertions(+), 134 deletions(-)

diff --git a/include/like.php b/include/like.php
index 210bde6906..a53b90c039 100644
--- a/include/like.php
+++ b/include/like.php
@@ -18,155 +18,169 @@ require_once("include/diaspora.php");
 function do_like($item_id, $verb) {
 	$a = get_app();
 
-	if(! local_user() && ! remote_user()) {
+	if (! local_user() && ! remote_user()) {
 		return false;
 	}
 
-	switch($verb) {
+	switch ($verb) {
 		case 'like':
+			$bodyverb = t('%1$s likes %2$s\'s %3$s');
+			$activity = ACTIVITY_LIKE;
+			break;
 		case 'unlike':
+			$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
 			$activity = ACTIVITY_LIKE;
 			break;
 		case 'dislike':
 		case 'undislike':
+			$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
 			$activity = ACTIVITY_DISLIKE;
 			break;
 		case 'attendyes':
 		case 'unattendyes':
+			$bodyverb = t('%1$s is attending %2$s\'s %3$s');
 			$activity = ACTIVITY_ATTEND;
 			break;
 		case 'attendno':
 		case 'unattendno':
+			$bodyverb = t('%1$s is not attending %2$s\'s %3$s');
 			$activity = ACTIVITY_ATTENDNO;
 			break;
 		case 'attendmaybe':
 		case 'unattendmaybe':
+			$bodyverb = t('%1$s may attend %2$s\'s %3$s');
 			$activity = ACTIVITY_ATTENDMAYBE;
 			break;
 		default:
+			logger('like: unknown verb ' . $verb . ' for item ' . $item_id);
 			return false;
-			break;
 	}
 
+	// Enable activity toggling instead of on/off
+	$event_verb_flag = $activity === ACTIVITY_ATTEND || $activity === ACTIVITY_ATTENDNO || $activity === ACTIVITY_ATTENDMAYBE;
+
 	logger('like: verb ' . $verb . ' item ' . $item_id);
 
-	$r = q("SELECT * FROM `item` WHERE `id` = '%s' OR `uri` = '%s' LIMIT 1",
+	// Retrieve item
+	$items = q("SELECT * FROM `item` WHERE `id` = '%s' OR `uri` = '%s' LIMIT 1",
 		dbesc($item_id),
 		dbesc($item_id)
 	);
 
-	if(! $item_id || (! dbm::is_result($r))) {
-		logger('like: no item ' . $item_id);
+	if (! $item_id || ! dbm::is_result($items)) {
+		logger('like: unknown item ' . $item_id);
 		return false;
 	}
 
-	$item = $r[0];
+	$item = $items[0];
 
-	$owner_uid = $item['uid'];
-
-	if (! can_write_wall($a,$owner_uid)) {
+	if (! can_write_wall($a, $item['uid'])) {
+		logger('like: unable to write on wall ' . $item['uid']);
 		return false;
 	}
 
-	$remote_owner = null;
+	// Retrieves the local post owner
+	$owners = q("SELECT `contact`.* FROM `contact`
+		WHERE `contact`.`self` = 1
+		AND `contact`.`uid` = %d",
+		intval($item['uid'])
+	);
+	if (dbm::is_result($owners)) {
+		$owner_self_contact = $owners[0];
+	} else {
+		logger('like: unknown owner ' . $item['uid']);
+		return false;
+	}
 
-	if(! $item['wall']) {
-		// The top level post may have been written by somebody on another system
-		$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-			intval($item['contact-id']),
-			intval($item['uid'])
+	// Retrieve the current logged in user's public contact
+	$author_id = public_contact();
+
+	$contacts = q("SELECT * FROM `contact` WHERE `id` = %d",
+		intval($author_id)
+	);
+	if (dbm::is_result($contacts)) {
+		$author_contact = $contacts[0];
+	} else {
+		logger('like: unknown author ' . $author_id);
+		return false;
+	}
+
+	// Contact-id is the uid-dependant author contact
+	if (local_user() == $item['uid']) {
+		$item_contact_id = $owner_self_contact['id'];
+		$item_contact = $owner_self_contact;
+	} else {
+		$item_contact_id = get_contact($author_contact['url'], $item['uid']);
+
+		$contacts = q("SELECT * FROM `contact` WHERE `id` = %d",
+			intval($item_contact_id)
 		);
-		if (! dbm::is_result($r)) {
+		if (dbm::is_result($contacts)) {
+			$item_contact = $contacts[0];
+		} else {
+			logger('like: unknown item contact ' . $item_contact_id);
 			return false;
 		}
-		if (! $r[0]['self']) {
-			$remote_owner = $r[0];
-		}
 	}
 
-	// this represents the post owner on this system.
-
-	$r = q("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid`
-		WHERE `contact`.`self` = 1 AND `contact`.`uid` = %d LIMIT 1",
-		intval($owner_uid)
-	);
-	if (dbm::is_result($r)) {
-		$owner = $r[0];
-	}
-
-	if (! $owner) {
-		logger('like: no owner');
-		return false;
-	}
-
-	if (! $remote_owner) {
-		$remote_owner = $owner;
-	}
-
-	// This represents the person posting
-
-	if ((local_user()) && (local_user() == $owner_uid)) {
-		$contact = $owner;
-	} else {
-		$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-			intval($_SESSION['visitor_id']),
-			intval($owner_uid)
-		);
-		if (dbm::is_result($r)) {
-			$contact = $r[0];
-		}
-	}
-	if (! $contact) {
-		return false;
-	}
-
-
-	$verbs = " '".dbesc($activity)."' ";
-
+	// Look for an existing verb row
 	// event participation are essentially radio toggles. If you make a subsequent choice,
 	// we need to eradicate your first choice.
-	if ($activity === ACTIVITY_ATTEND || $activity === ACTIVITY_ATTENDNO || $activity === ACTIVITY_ATTENDMAYBE) {
-		$verbs = " '" . dbesc(ACTIVITY_ATTEND) . "','" . dbesc(ACTIVITY_ATTENDNO) . "','" . dbesc(ACTIVITY_ATTENDMAYBE) . "' ";
+	if ($event_verb_flag) {
+		$verbs = "'" . dbesc(ACTIVITY_ATTEND) . "', '" . dbesc(ACTIVITY_ATTENDNO) . "', '" . dbesc(ACTIVITY_ATTENDMAYBE) . "'";
+	} else {
+		$verbs = "'".dbesc($activity)."'";
 	}
 
-	$r = q("SELECT `id`, `guid` FROM `item` WHERE `verb` IN ( $verbs ) AND `deleted` = 0
-		AND `contact-id` = %d AND `uid` = %d
-		AND (`parent` = '%s' OR `parent-uri` = '%s' OR `thr-parent` = '%s') LIMIT 1",
-		intval($contact['id']), intval($owner_uid),
+	$existing_like = q("SELECT `id`, `guid`, `verb` FROM `item`
+		WHERE `verb` IN ($verbs)
+		AND `deleted` = 0
+		AND `author-id` = %d
+		AND `uid` = %d
+		AND (`parent` = '%s' OR `parent-uri` = '%s' OR `thr-parent` = '%s')
+		LIMIT 1",
+		intval($author_contact['id']),
+		intval($item['uid']),
 		dbesc($item_id), dbesc($item_id), dbesc($item['uri'])
 	);
 
-	if (dbm::is_result($r)) {
-		$like_item = $r[0];
+	// If it exists, mark it as deleted
+	if (dbm::is_result($existing_like)) {
+		$like_item = $existing_like[0];
 
 		// Already voted, undo it
-		$r = q("UPDATE `item` SET `deleted` = 1, `unseen` = 1, `changed` = '%s' WHERE `id` = %d",
+		q("UPDATE `item` SET `deleted` = 1, `unseen` = 1, `changed` = '%s' WHERE `id` = %d",
 			dbesc(datetime_convert()),
 			intval($like_item['id'])
 		);
 
-
 		// Clean up the Diaspora signatures for this like
 		// Go ahead and do it even if Diaspora support is disabled. We still want to clean up
 		// if it had been enabled in the past
-		$r = q("DELETE FROM `sign` WHERE `iid` = %d",
+		q("DELETE FROM `sign` WHERE `iid` = %d",
 			intval($like_item['id'])
 		);
 
 		$like_item_id = $like_item['id'];
 		proc_run(PRIORITY_HIGH, "include/notifier.php", "like", $like_item_id);
 
+		if (!$event_verb_flag || $like_item['verb'] == $activity) {
+			return true;
+		}
+	}
+
+	// Verb is "un-something", just trying to delete existing entries
+	if (strpos($verb, 'un') === 0) {
 		return true;
 	}
 
-	$uri = item_new_uri($a->get_hostname(),$owner_uid);
-
+	// Else or if event verb different from existing row, create a new item row
 	$post_type = (($item['resource-id']) ? t('photo') : t('status'));
 	if ($item['object-type'] === ACTIVITY_OBJ_EVENT) {
 		$post_type = t('event');
 	}
-	$objtype = (($item['resource-id']) ? ACTIVITY_OBJ_IMAGE : ACTIVITY_OBJ_NOTE );
-	$link = xmlify('<link rel="alternate" type="text/html" href="' . App::get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . '" />' . "\n") ;
+	$objtype = $item['resource-id'] ? ACTIVITY_OBJ_IMAGE : ACTIVITY_OBJ_NOTE ;
+	$link = xmlify('<link rel="alternate" type="text/html" href="' . App::get_baseurl() . '/display/' . $owner_self_contact['nick'] . '/' . $item['id'] . '" />' . "\n") ;
 	$body = $item['body'];
 
 	$obj = <<< EOT
@@ -180,80 +194,62 @@ function do_like($item_id, $verb) {
 		<content>$body</content>
 	</object>
 EOT;
-	if ($verb === 'like') {
-		$bodyverb = t('%1$s likes %2$s\'s %3$s');
-	}
-	if ($verb === 'dislike') {
-		$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
-	}
-	if ($verb === 'attendyes') {
-		$bodyverb = t('%1$s is attending %2$s\'s %3$s');
-	}
-	if ($verb === 'attendno') {
-		$bodyverb = t('%1$s is not attending %2$s\'s %3$s');
-	}
-	if ($verb === 'attendmaybe') {
-		$bodyverb = t('%1$s may attend %2$s\'s %3$s');
-	}
 
-	if (! isset($bodyverb)) {
-		return false;
-	}
-
-	$ulink = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
+	$ulink = '[url=' . $author_contact['url'] . ']' . $author_contact['name'] . '[/url]';
 	$alink = '[url=' . $item['author-link'] . ']' . $item['author-name'] . '[/url]';
-	$plink = '[url=' . App::get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . ']' . $post_type . '[/url]';
+	$plink = '[url=' . App::get_baseurl() . '/display/' . $owner_self_contact['nick'] . '/' . $item['id'] . ']' . $post_type . '[/url]';
 
-	/// @TODO Or rewrite this to multi-line initialization of the array?
-	$arr = array();
+	$new_item = array(
+		'guid'          => get_guid(32),
+		'uri'           => item_new_uri($a->get_hostname(), $item['uid']),
+		'uid'           => $item['uid'],
+		'contact-id'    => $item_contact_id,
+		'type'          => 'activity',
+		'wall'          => $item['wall'],
+		'origin'        => 1,
+		'gravity'       => GRAVITY_LIKE,
+		'parent'        => $item['id'],
+		'parent-uri'    => $item['uri'],
+		'thr-parent'    => $item['uri'],
+		'owner-id'      => $item['owner-id'],
+		'owner-name'    => $item['owner-name'],
+		'owner-link'    => $item['owner-link'],
+		'owner-avatar'  => $item['owner-avatar'],
+		'author-id'     => $author_contact['id'],
+		'author-name'   => $author_contact['name'],
+		'author-link'   => $author_contact['url'],
+		'author-avatar' => $author_contact['thumb'],
+		'body'          => sprintf($bodyverb, $ulink, $alink, $plink),
+		'verb'          => $activity,
+		'object-type'   => $objtype,
+		'object'        => $obj,
+		'allow_cid'     => $item['allow_cid'],
+		'allow_gid'     => $item['allow_gid'],
+		'deny_cid'      => $item['deny_cid'],
+		'deny_gid'      => $item['deny_gid'],
+		'visible'       => 1,
+		'unseen'        => 1,
+		'last-child'    => 0
+	);
 
-	$arr['guid'] = get_guid(32);
-	$arr['uri'] = $uri;
-	$arr['uid'] = $owner_uid;
-	$arr['contact-id'] = $contact['id'];
-	$arr['type'] = 'activity';
-	$arr['wall'] = $item['wall'];
-	$arr['origin'] = 1;
-	$arr['gravity'] = GRAVITY_LIKE;
-	$arr['parent'] = $item['id'];
-	$arr['parent-uri'] = $item['uri'];
-	$arr['thr-parent'] = $item['uri'];
-	$arr['owner-name'] = $remote_owner['name'];
-	$arr['owner-link'] = $remote_owner['url'];
-	$arr['owner-avatar'] = $remote_owner['thumb'];
-	$arr['author-name'] = $contact['name'];
-	$arr['author-link'] = $contact['url'];
-	$arr['author-avatar'] = $contact['thumb'];
-	$arr['body'] =  sprintf( $bodyverb, $ulink, $alink, $plink );
-	$arr['verb'] = $activity;
-	$arr['object-type'] = $objtype;
-	$arr['object'] = $obj;
-	$arr['allow_cid'] = $item['allow_cid'];
-	$arr['allow_gid'] = $item['allow_gid'];
-	$arr['deny_cid'] = $item['deny_cid'];
-	$arr['deny_gid'] = $item['deny_gid'];
-	$arr['visible'] = 1;
-	$arr['unseen'] = 1;
-	$arr['last-child'] = 0;
-
-	$post_id = item_store($arr);
+	$new_item_id = item_store($new_item);
 
+	// @todo: Explain this block
 	if (! $item['visible']) {
-		$r = q("UPDATE `item` SET `visible` = 1 WHERE `id` = %d AND `uid` = %d",
+		q("UPDATE `item` SET `visible` = 1 WHERE `id` = %d AND `uid` = %d",
 			intval($item['id']),
-			intval($owner_uid)
+			intval($item['uid'])
 		);
 	}
 
-
 	// Save the author information for the like in case we need to relay to Diaspora
-	Diaspora::store_like_signature($contact, $post_id);
+	Diaspora::store_like_signature($item_contact, $new_item_id);
 
-	$arr['id'] = $post_id;
+	$new_item['id'] = $new_item_id;
 
-	call_hooks('post_local_end', $arr);
+	call_hooks('post_local_end', $new_item);
 
-	proc_run(PRIORITY_HIGH, "include/notifier.php", "like", $post_id);
+	proc_run(PRIORITY_HIGH, "include/notifier.php", "like", $new_item_id);
 
 	return true;
 }

From df6304cc423db5efceedfa4a523425e011f65d96 Mon Sep 17 00:00:00 2001
From: Sandro Santilli <strk@kbt.io>
Date: Sun, 12 Mar 2017 01:11:35 +0100
Subject: [PATCH 11/21] Fix "remember me" cookie for OpenID logins

Closes #2432

NOTE: in order to obtain the same "cookie hash" it was required
to include unneeded fields in the user record structure, this would
be good to change in the future...
---
 include/auth.php     | 48 ++-------------------------------------
 include/security.php | 54 ++++++++++++++++++++++++++++++++++++++++++++
 mod/openid.php       |  2 +-
 3 files changed, 57 insertions(+), 47 deletions(-)

diff --git a/include/auth.php b/include/auth.php
index e3c8d92eeb..62ca3563a4 100644
--- a/include/auth.php
+++ b/include/auth.php
@@ -125,6 +125,7 @@ if (isset($_SESSION) && x($_SESSION,'authenticated') && (!x($_POST,'auth-params'
 				$openid = new LightOpenID;
 				$openid->identity = $openid_url;
 				$_SESSION['openid'] = $openid_url;
+				$_SESSION['remember'] = $_POST['remember'];
 				$openid->returnUrl = App::get_baseurl(true).'/openid';
 				goaway($openid->authUrl());
 			} catch (Exception $e) {
@@ -178,17 +179,8 @@ if (isset($_SESSION) && x($_SESSION,'authenticated') && (!x($_POST,'auth-params'
 			goaway(z_root());
 		}
 
-		// If the user specified to remember the authentication, then set a cookie
-		// that expires after one week (the default is when the browser is closed).
-		// The cookie will be renewed automatically.
-		// The week ensures that sessions will expire after some inactivity.
-		if ($_POST['remember'])
-			new_cookie(604800, $r[0]);
-		else
-			new_cookie(0); // 0 means delete on browser exit
-
 		// if we haven't failed up this point, log them in.
-
+		$_SESSION['remember'] = $_POST['remember'];
 		$_SESSION['last_login_date'] = datetime_convert('UTC','UTC');
 		authenticate_success($record, true, true);
 	}
@@ -203,39 +195,3 @@ function nuke_session() {
 	session_unset();
 	session_destroy();
 }
-
-/**
- * @brief Calculate the hash that is needed for the "Friendica" cookie
- *
- * @param array $user Record from "user" table
- *
- * @return string Hashed data
- */
-function cookie_hash($user) {
-	return(hash("sha256", get_config("system", "site_prvkey").
-				$user["uprvkey"].
-				$user["password"]));
-}
-
-/**
- * @brief Set the "Friendica" cookie
- *
- * @param int $time
- * @param array $user Record from "user" table
- */
-function new_cookie($time, $user = array()) {
-
-	if ($time != 0)
-		$time = $time + time();
-
-	if ($user)
-		$value = json_encode(array("uid" => $user["uid"],
-					"hash" => cookie_hash($user),
-					"ip" => $_SERVER['REMOTE_ADDR']));
-	else
-		$value = "";
-
-	setcookie("Friendica", $value, $time, "/", "",
-		(get_config('system', 'ssl_policy') == SSL_POLICY_FULL), true);
-
-}
diff --git a/include/security.php b/include/security.php
index c379518562..93df6ff255 100644
--- a/include/security.php
+++ b/include/security.php
@@ -1,5 +1,41 @@
 <?php
 
+/**
+ * @brief Calculate the hash that is needed for the "Friendica" cookie
+ *
+ * @param array $user Record from "user" table
+ *
+ * @return string Hashed data
+ */
+function cookie_hash($user) {
+	return(hash("sha256", get_config("system", "site_prvkey").
+				$user["uprvkey"].
+				$user["password"]));
+}
+
+/**
+ * @brief Set the "Friendica" cookie
+ *
+ * @param int $time
+ * @param array $user Record from "user" table
+ */
+function new_cookie($time, $user = array()) {
+
+	if ($time != 0)
+		$time = $time + time();
+
+	if ($user)
+		$value = json_encode(array("uid" => $user["uid"],
+					"hash" => cookie_hash($user),
+					"ip" => $_SERVER['REMOTE_ADDR']));
+	else
+		$value = "";
+
+	setcookie("Friendica", $value, $time, "/", "",
+		(get_config('system', 'ssl_policy') == SSL_POLICY_FULL), true);
+
+}
+
 function authenticate_success($user_record, $login_initial = false, $interactive = false, $login_refresh = false) {
 
 	$a = get_app();
@@ -94,6 +130,24 @@ function authenticate_success($user_record, $login_initial = false, $interactive
 
 
 	}
+
+	if ($login_initial) {
+		// If the user specified to remember the authentication, then set a cookie
+		// that expires after one week (the default is when the browser is closed).
+		// The cookie will be renewed automatically.
+		// The week ensures that sessions will expire after some inactivity.
+		if ($_SESSION['remember']) {
+			logger('Injecting cookie for remembered user '. $_SESSION['remember_user']['nickname']);
+			new_cookie(604800, $user_record);
+			unset($_SESSION['remember']);
+		}
+		else {
+			new_cookie(0); // 0 means delete on browser exit
+		}
+	}
+
+
+
 	if ($login_initial) {
 		call_hooks('logged_in', $a->user);
 
diff --git a/mod/openid.php b/mod/openid.php
index 59a7530140..b45cd97975 100644
--- a/mod/openid.php
+++ b/mod/openid.php
@@ -30,7 +30,7 @@ function openid_content(App $a) {
 			//       mod/settings.php in 8367cad so it might have left mixed
 			//       records in the user table
 			//
-			$r = q("SELECT * FROM `user`
+			$r = q("SELECT *, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey` FROM `user`
 				WHERE ( `openid` = '%s' OR `openid` = '%s' )
 				AND `blocked` = 0 AND `account_expired` = 0
 				AND `account_removed` = 0 AND `verified` = 1

From 80e58964ceac470b2571e542e53de2558b3fb499 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Mon, 13 Mar 2017 00:09:32 +0000
Subject: [PATCH 12/21] Standard stuff

---
 include/Contact.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/Contact.php b/include/Contact.php
index 3d4d6ded7f..85dc1008eb 100644
--- a/include/Contact.php
+++ b/include/Contact.php
@@ -717,7 +717,7 @@ function posts_from_gcontact(App $a, $gcontact_id) {
 
 	$o = conversation($a,$r,'community',false);
 
-	$o .= alt_pager($a,count($r));
+	$o .= alt_pager($a, count($r));
 
 	return $o;
 }
@@ -760,7 +760,7 @@ function posts_from_contact_url(App $a, $contact_url) {
 
 	$o = conversation($a,$r,'community',false);
 
-	$o .= alt_pager($a,count($r));
+	$o .= alt_pager($a, count($r));
 
 	return $o;
 }

From eb6a6228f752d56e20b897dec8b9525281363ef0 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Mon, 13 Mar 2017 05:57:37 +0000
Subject: [PATCH 13/21] more spaces

---
 include/Contact.php | 4 ++--
 mod/community.php   | 4 ++--
 mod/network.php     | 6 +++---
 mod/profile.php     | 4 ++--
 4 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/include/Contact.php b/include/Contact.php
index 85dc1008eb..9fd61f8d5e 100644
--- a/include/Contact.php
+++ b/include/Contact.php
@@ -715,7 +715,7 @@ function posts_from_gcontact(App $a, $gcontact_id) {
 		intval($a->pager['itemspage'])
 	);
 
-	$o = conversation($a,$r,'community',false);
+	$o = conversation($a, $r, 'community', false);
 
 	$o .= alt_pager($a, count($r));
 
@@ -758,7 +758,7 @@ function posts_from_contact_url(App $a, $contact_url) {
 		intval($a->pager['itemspage'])
 	);
 
-	$o = conversation($a,$r,'community',false);
+	$o = conversation($a, $r, 'community', false);
 
 	$o .= alt_pager($a, count($r));
 
diff --git a/mod/community.php b/mod/community.php
index 91b09bba9a..1743304010 100644
--- a/mod/community.php
+++ b/mod/community.php
@@ -84,9 +84,9 @@ function community_content(App $a, $update = 0) {
 
 	// we behave the same in message lists as the search module
 
-	$o .= conversation($a,$s,'community',$update);
+	$o .= conversation($a, $s, 'community', $update);
 
-        $o .= alt_pager($a,count($r));
+        $o .= alt_pager($a, count($r));
 
 	return $o;
 }
diff --git a/mod/network.php b/mod/network.php
index 284bf3d961..a1181a74cb 100644
--- a/mod/network.php
+++ b/mod/network.php
@@ -773,13 +773,13 @@ function network_content(App $a, $update = 0) {
 
 	$mode = (($nouveau) ? 'network-new' : 'network');
 
-	$o .= conversation($a,$items,$mode,$update);
+	$o .= conversation($a, $items, $mode, $update);
 
 	if (!$update) {
-		if (get_pconfig(local_user(),'system','infinite_scroll')) {
+		if (get_pconfig(local_user(), 'system', 'infinite_scroll')) {
 			$o .= scroll_loader();
 		} else {
-			$o .= alt_pager($a,count($items));
+			$o .= alt_pager($a, count($items));
 		}
 	}
 
diff --git a/mod/profile.php b/mod/profile.php
index 93f2602e23..fbce509d29 100644
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -318,10 +318,10 @@ function profile_content(App $a, $update = 0) {
 		);
 	}
 
-	$o .= conversation($a,$items,'profile',$update);
+	$o .= conversation($a, $items, 'profile', $update);
 
 	if (!$update) {
-		$o .= alt_pager($a,count($items));
+		$o .= alt_pager($a, count($items));
 	}
 
 	return $o;

From cbaf196f509cc5b21f04574cbf80ddd3ecf9f8db Mon Sep 17 00:00:00 2001
From: Sandro Santilli <strk@kbt.io>
Date: Mon, 13 Mar 2017 11:57:10 +0100
Subject: [PATCH 14/21] Only remove the "remember me" cookie at submitting the
 auth form

Fixes loss of remember (Friendica) cookie on switching Managed accounts
---
 include/auth.php     | 4 ++++
 include/security.php | 3 ---
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/include/auth.php b/include/auth.php
index 62ca3563a4..8512abe486 100644
--- a/include/auth.php
+++ b/include/auth.php
@@ -179,6 +179,10 @@ if (isset($_SESSION) && x($_SESSION,'authenticated') && (!x($_POST,'auth-params'
 			goaway(z_root());
 		}
 
+		if ( ! $_POST['remember']) {
+			new_cookie(0); // 0 means delete on browser exit
+		}
+
 		// if we haven't failed up this point, log them in.
 		$_SESSION['remember'] = $_POST['remember'];
 		$_SESSION['last_login_date'] = datetime_convert('UTC','UTC');
diff --git a/include/security.php b/include/security.php
index 93df6ff255..23fc400b3a 100644
--- a/include/security.php
+++ b/include/security.php
@@ -141,9 +141,6 @@ function authenticate_success($user_record, $login_initial = false, $interactive
 			new_cookie(604800, $user_record);
 			unset($_SESSION['remember']);
 		}
-		else {
-			new_cookie(0); // 0 means delete on browser exit
-		}
 	}
 
 

From f2a0c9fad16286c4471fe1bffb2775eb2f3f5116 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <mrpetovan@gmail.com>
Date: Mon, 13 Mar 2017 12:10:03 -0400
Subject: [PATCH 15/21] Fix scrollToItem breaking dropItem functionality

- Add doc
- Refactor function by removing double jQuery wrapping
---
 view/theme/frio/js/theme.js               | 27 ++++++++++++++---------
 view/theme/frio/templates/wall_thread.tpl |  4 ++--
 2 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/view/theme/frio/js/theme.js b/view/theme/frio/js/theme.js
index b4ba2fd357..62cd85df9b 100644
--- a/view/theme/frio/js/theme.js
+++ b/view/theme/frio/js/theme.js
@@ -573,31 +573,38 @@ String.prototype.rtrim = function() {
 	return trimmed;
 };
 
-// Scroll to a specific item and highlight it
-// Note: jquery.color.js is needed
-function scrollToItem(itemID) {
-	if( typeof itemID === "undefined")
+/**
+ * Scroll the screen to the item element whose id is provided, then highlights it
+ *
+ * Note: jquery.color.js is required
+ *
+ * @param {string} elementId The item element id
+ * @returns {undefined}
+ */
+function scrollToItem(elementId) {
+	if (typeof elementId === "undefined") {
 		return;
+	}
 
-	var elm = $('#'+itemID);
+	var $el = $(document.getElementById(elementId));
 	// Test if the Item exists
-	if(!elm.length)
+	if (!$el.length) {
 		return;
+	}
 
 	// Define the colors which are used for highlighting
 	var colWhite = {backgroundColor:'#F5F5F5'};
 	var colShiny = {backgroundColor:'#FFF176'};
 
-	// Get the Item Position (we need to substract 100 to match
-	// correct position
-	var itemPos = $(elm).offset().top - 100;
+	// Get the Item Position (we need to substract 100 to match correct position
+	var itemPos = $el.offset().top - 100;
 
 	// Scroll to the DIV with the ID (GUID)
 	$('html, body').animate({
 		scrollTop: itemPos
 	}, 400, function() {
 		// Highlight post/commenent with ID  (GUID)
-		$(elm).animate(colWhite, 1000).animate(colShiny).animate(colWhite, 600);
+		$el.animate(colWhite, 1000).animate(colShiny).animate(colWhite, 600);
 	});
 }
 
diff --git a/view/theme/frio/templates/wall_thread.tpl b/view/theme/frio/templates/wall_thread.tpl
index 1977f541c2..e71dc7b84c 100644
--- a/view/theme/frio/templates/wall_thread.tpl
+++ b/view/theme/frio/templates/wall_thread.tpl
@@ -68,9 +68,9 @@ as the value of $top_child_total (this is done at the end of this file)
 
 {{* Use a different div container in dependence max thread-level = 7 *}}
 {{if $item.thread_level<7}}
-<div class="wall-item-container {{$item.indent}} {{$item.shiny}} {{$item.network}} thread_level_{{$item.thread_level}} {{if $item.thread_level==1}}panel-body h-entry{{else}}u-comment h-cite{{/if}}" id="item-{{$item.guid|regex_replace:'/%.*/':''}}"><!-- wall-item-container -->
+<div class="wall-item-container {{$item.indent}} {{$item.shiny}} {{$item.network}} thread_level_{{$item.thread_level}} {{if $item.thread_level==1}}panel-body h-entry{{else}}u-comment h-cite{{/if}}" id="item-{{$item.guid}}"><!-- wall-item-container -->
 {{else}}
-<div class="wall-item-container {{$item.indent}} {{$item.shiny}} {{$item.network}} thread_level_7 u-comment h-cite" id="item-{{$item.guid|regex_replace:'/%.*/':''}}">
+<div class="wall-item-container {{$item.indent}} {{$item.shiny}} {{$item.network}} thread_level_7 u-comment h-cite" id="item-{{$item.guid}}">
  {{/if}}
 	<div class="media">
 		{{* Put addional actions in a top-right dropdown menu *}}

From 327b00117defd8b233ef86667733729b8292e1e9 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <mrpetovan@gmail.com>
Date: Mon, 13 Mar 2017 12:12:13 -0400
Subject: [PATCH 16/21] Improve dropItem() functionality

- Drop the obsolete `#` char
- Add error case when deleting item
- Add item drop support to search items
- Add doc
---
 view/theme/frio/js/textedit.js            | 32 ++++++++++++++---------
 view/theme/frio/templates/search_item.tpl |  4 +--
 view/theme/frio/templates/wall_thread.tpl |  2 +-
 3 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/view/theme/frio/js/textedit.js b/view/theme/frio/js/textedit.js
index 9226646b7b..02191f33de 100644
--- a/view/theme/frio/js/textedit.js
+++ b/view/theme/frio/js/textedit.js
@@ -162,21 +162,29 @@ function qCommentInsert(obj,id) {
 
 function confirmDelete() { return confirm(aStr.delitem); }
 
-function dropItem(url, object) {
+/**
+ * Hide and removes an item element from the DOM after the deletion url is
+ * successful, restore it else.
+ *
+ * @param {string} url The item removal URL
+ * @param {string} elementId The DOM id of the item element
+ * @returns {undefined}
+ */
+function dropItem(url, elementId) {
 	var confirm = confirmDelete();
 
-	//if the first character of the object is #, remove it because
-	// we use getElementById which don't need the #
-	// getElementByID selects elements even if there are special characters
-	// in the ID (like %) which won't work with jQuery
-	/// @todo ceck if we can solve this in the template
-	object = object.indexOf('#') == 0 ? object.substring(1) : object;
-
-	if(confirm) {
+	if (confirm) {
 		$('body').css('cursor', 'wait');
-		$(document.getElementById(object)).fadeTo('fast', 0.33, function () {
-			$.get(url).done(function() {
-				$(document.getElementById(object)).remove();
+
+		var $el = $(document.getElementById(elementId));
+
+		$el.fadeTo('fast', 0.33, function () {
+			$.get(url).then(function() {
+				$el.remove();
+			}).error(function() {
+				// @todo Show related error message
+				$el.show();
+			}).always(function() {
 				$('body').css('cursor', 'auto');
 			});
 		});
diff --git a/view/theme/frio/templates/search_item.tpl b/view/theme/frio/templates/search_item.tpl
index 90fbe03bbc..0a6eca0c27 100644
--- a/view/theme/frio/templates/search_item.tpl
+++ b/view/theme/frio/templates/search_item.tpl
@@ -7,7 +7,7 @@
 <!-- ./TODO => Unknow block -->
 
 
-<div class="panel">
+<div class="panel" id="item-{{$item.guid}}">
 	<div class="wall-item-container panel-body{{$item.indent}} {{$item.shiny}} {{$item.previewing}}" >
 		<div class="media">
 			{{* Put additional actions in a top-right dropdown menu *}}
@@ -54,7 +54,7 @@
 						{{if $item.drop.dropping}}
 						<li role="separator" class="divider"></li>
 						<li role="menuitem">
-							<a class="navicon delete" onclick="dropItem('item/drop/{{$item.id}}', '#item-{{$item.guid}}'); return false;" title="{{$item.drop.delete}}"><i class="fa fa-trash"></i> {{$item.drop.delete}}</a>
+							<a class="navicon delete" onclick="dropItem('item/drop/{{$item.id}}', 'item-{{$item.guid}}'); return false;" title="{{$item.drop.delete}}"><i class="fa fa-trash"></i> {{$item.drop.delete}}</a>
 						</li>
 						{{/if}}
 					</ul>
diff --git a/view/theme/frio/templates/wall_thread.tpl b/view/theme/frio/templates/wall_thread.tpl
index e71dc7b84c..85091cf1c6 100644
--- a/view/theme/frio/templates/wall_thread.tpl
+++ b/view/theme/frio/templates/wall_thread.tpl
@@ -129,7 +129,7 @@ as the value of $top_child_total (this is done at the end of this file)
 
 					{{if $item.drop.dropping}}
 					<li role="menuitem">
-						<a class="navicon delete" onclick="dropItem('item/drop/{{$item.id}}', '#item-{{$item.guid}}'); return false;" title="{{$item.drop.delete}}"><i class="fa fa-trash"></i> {{$item.drop.delete}}</a>
+						<a class="navicon delete" onclick="dropItem('item/drop/{{$item.id}}', 'item-{{$item.guid}}'); return false;" title="{{$item.drop.delete}}"><i class="fa fa-trash"></i> {{$item.drop.delete}}</a>
 					</li>
 					{{/if}}
 				</ul>

From 8517ba1fab5257fbd3e5cb99677797b5dd9ed69e Mon Sep 17 00:00:00 2001
From: Sandro Santilli <strk@kbt.io>
Date: Mon, 13 Mar 2017 23:08:03 +0100
Subject: [PATCH 17/21] Remove extra space after open parentheses

---
 include/auth.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/auth.php b/include/auth.php
index 8512abe486..57e9d9bf61 100644
--- a/include/auth.php
+++ b/include/auth.php
@@ -179,7 +179,7 @@ if (isset($_SESSION) && x($_SESSION,'authenticated') && (!x($_POST,'auth-params'
 			goaway(z_root());
 		}
 
-		if ( ! $_POST['remember']) {
+		if (! $_POST['remember']) {
 			new_cookie(0); // 0 means delete on browser exit
 		}
 

From 0b46a5f935e7e3a669e68455dce294dc70a94182 Mon Sep 17 00:00:00 2001
From: Sandro Santilli <strk@kbt.io>
Date: Mon, 13 Mar 2017 23:09:09 +0100
Subject: [PATCH 18/21] Standards: add braces

(thanks @Hypolite)
---
 include/security.php | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/include/security.php b/include/security.php
index 23fc400b3a..afb37a72d8 100644
--- a/include/security.php
+++ b/include/security.php
@@ -21,15 +21,18 @@ function cookie_hash($user) {
  */
 function new_cookie($time, $user = array()) {
 
-	if ($time != 0)
+	if ($time != 0) {
 		$time = $time + time();
+	}
 
-	if ($user)
+	if ($user) {
 		$value = json_encode(array("uid" => $user["uid"],
 					"hash" => cookie_hash($user),
 					"ip" => $_SERVER['REMOTE_ADDR']));
-	else
+	}
+	else {
 		$value = "";
+	}
 
 	setcookie("Friendica", $value, $time, "/", "",
 		(get_config('system', 'ssl_policy') == SSL_POLICY_FULL), true);

From 0143369e54bb8a0c7b6c9b970ffcde1fd60171ff Mon Sep 17 00:00:00 2001
From: rabuzarus <trebor@central-unit>
Date: Tue, 14 Mar 2017 18:31:03 +0100
Subject: [PATCH 19/21] limit pagination page buttons to  max 10

---
 include/text.php                       |  9 +++--
 view/theme/frio/css/style.css          | 52 +++++++++++++++++++++-----
 view/theme/frio/templates/paginate.tpl | 16 ++++----
 3 files changed, 56 insertions(+), 21 deletions(-)

diff --git a/include/text.php b/include/text.php
index 580bd95fc7..6619dec93a 100644
--- a/include/text.php
+++ b/include/text.php
@@ -291,8 +291,8 @@ function paginate_data(App $a, $count = null) {
 	}
 
 	$url = $stripped;
-
 	$data = array();
+
 	function _l(&$d, $name, $url, $text, $class = '') {
 		if (strpos($url, '?') === false && ($pos = strpos($url, '&')) !== false) {
 			$url = substr($url, 0, $pos) . '?' . substr($url, $pos + 1);
@@ -318,9 +318,10 @@ function paginate_data(App $a, $count = null) {
 			$numstart = 1;
 			$numstop = $numpages;
 
-			if ($numpages > 14) {
-				$numstart = (($pagenum > 7) ? ($pagenum - 7) : 1);
-				$numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 14));
+			// Limit the number of displayed page number buttons.
+			if ($numpages > 8) {
+				$numstart = (($pagenum > 4) ? ($pagenum - 4) : 1);
+				$numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 8));
 			}
 
 			$pages = array();
diff --git a/view/theme/frio/css/style.css b/view/theme/frio/css/style.css
index 34bcb833db..8d7a5f7696 100644
--- a/view/theme/frio/css/style.css
+++ b/view/theme/frio/css/style.css
@@ -2509,21 +2509,53 @@ body .tread-wrapper .hovercard:hover .hover-card-content a {
 }
 
 /* Pagination improvements */
+.pagination {
+    text-align: center;
+    display: block;
+}
 .pagination > li > a,
 .pagination > li > span {
-	color: $link_color;
+    color: $link_color;
+    float: none;
 }
-.pagination>.active>a,
-.pagination>.active>a:focus,
-.pagination>.active>a:hover,
-.pagination>.active>span,
-.pagination>.active>span:focus,
-.pagination>.active>span:hover {
-	background-color: $link_color;
+.pagination>li>a:hover,
+.pagination>li>span:hover {
+    color: $link_hover_color;
+}
+.pagination > .active > a,
+.pagination > .active > a:focus,
+.pagination > .active > a:hover,
+.pagination > .active > span,
+.pagination > .active > span:focus,
+.pagination > .active > span:hover {
+    background-color: $link_color;
     border-color: $link_color;
+    border-radius: 3px;
 }
-.disabled > a {
-	pointer-events: none;
+.pagination li.pager_n a {
+    margin-left: 3px;
+    border-radius: 3px;
+}
+.pagination .pager_prev a {
+    margin-left: -5px;
+    margin-right: 4px;
+    border-top-right-radius: 3px;
+    border-bottom-right-radius: 3px;
+}
+.pagination .pager_next a {
+    margin-left: 4px;
+    margin-right: -5px;
+    border-top-left-radius: 3px;
+    border-bottom-left-radius: 3px;
+}
+.pager .next > a,
+.pager .previous > a {
+    float: none;
+    border-radius: 3px;
+}
+.pagination .disabled > a,
+.pager .disabled > a {
+    display: none;
 }
 
 /*
diff --git a/view/theme/frio/templates/paginate.tpl b/view/theme/frio/templates/paginate.tpl
index ab65cdd406..252dd7e5b0 100644
--- a/view/theme/frio/templates/paginate.tpl
+++ b/view/theme/frio/templates/paginate.tpl
@@ -1,14 +1,16 @@
+
 {{* Pager template, uses output of paginate_data() in include/text.php *}}
+
 {{if $pager}}
-<div class="{{$pager.class}}">
-	{{if $pager.first}}<li class="pager_first {{$pager.first.class}}"><a href="{{$pager.first.url}}">{{$pager.first.text}}</a></li>{{/if}}
+<ul class="{{$pager.class}} pagination-sm">
+	{{if $pager.first}}<li class="pager_first {{$pager.first.class}}"><a href="{{$pager.first.url}}" title="{{$pager.first.text}}">&#8739;&lt;</a></li>{{/if}}
 
-	{{if $pager.prev}}<li class="pager_prev {{$pager.prev.class}}"><a href="{{$pager.prev.url}}">{{$pager.prev.text}}</a></li>{{/if}}
+	{{if $pager.prev}}<li class="pager_prev {{$pager.prev.class}}"><a href="{{$pager.prev.url}}" title="{{$pager.prev.text}}">&lt;</a></li>{{/if}}
 
-	{{foreach $pager.pages as $p}}<li class="pager_{{$p.class}}"><a href="{{$p.url}}">{{$p.text}}</a></li>{{/foreach}}
+	{{foreach $pager.pages as $p}}<li class="pager_{{$p.class}} hidden-xs hidden-sm"><a href="{{$p.url}}">{{$p.text}}</a></li>{{/foreach}}
 
-	{{if $pager.next}}<li class="pager_next {{$pager.next.class}}"><a href="{{$pager.next.url}}">{{$pager.next.text}}</a></li>{{/if}}
+	{{if $pager.next}}<li class="pager_next {{$pager.next.class}}"><a href="{{$pager.next.url}}" title="{{$pager.next.text}}">&gt;</a></li>{{/if}}
 
-	{{if $pager.last}}&nbsp;<li class="pager_last {{$pager.last.class}}"><a href="{{$pager.last.url}}">{{$pager.last.text}}</a></li>{{/if}}
-</div>
+	{{if $pager.last}}<li class="pager_last {{$pager.last.class}}"><a href="{{$pager.last.url}}" title="{{$pager.last.text}}">&gt;&#8739;</a></li>{{/if}}
+</ul>
 {{/if}}

From 35ec1c8f266d944f1b4d0359cd80a35c2f120ffa Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Tue, 14 Mar 2017 21:14:09 +0000
Subject: [PATCH 20/21] Bugfix for pull request 3216 - feed items were mixed

---
 include/feed.php | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/feed.php b/include/feed.php
index e0fef50dbb..13833d22ef 100644
--- a/include/feed.php
+++ b/include/feed.php
@@ -177,6 +177,10 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 	foreach (array_reverse($entrylist) AS $entry) {
 		$item = array_merge($header, $author);
 
+		$alternate = $xpath->query("atom:link[@rel='alternate']", $entry)->item(0)->attributes;
+		if (!is_object($alternate))
+			$alternate = $xpath->query("atom:link", $entry)->item(0)->attributes;
+
 		if (is_object($alternate))
 			foreach($alternate AS $attributes)
 				if ($attributes->name == "href")
@@ -217,10 +221,6 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 		if ($item["title"] == "")
 			$item["title"] = $xpath->evaluate('rss:title/text()', $entry)->item(0)->nodeValue;
 
-		$alternate = $xpath->query("atom:link[@rel='alternate']", $entry)->item(0)->attributes;
-		if (!is_object($alternate))
-			$alternate = $xpath->query("atom:link", $entry)->item(0)->attributes;
-
 		$published = $xpath->query('atom:published/text()', $entry)->item(0)->nodeValue;
 
 		if ($published == "")

From dc3fcf0487f67c50e19d166a64229f63e577c42a Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Wed, 15 Mar 2017 06:00:22 +0000
Subject: [PATCH 21/21] Standard stuff

---
 include/feed.php | 203 +++++++++++++++++++++++++----------------------
 1 file changed, 108 insertions(+), 95 deletions(-)

diff --git a/include/feed.php b/include/feed.php
index 13833d22ef..2959933703 100644
--- a/include/feed.php
+++ b/include/feed.php
@@ -17,11 +17,11 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 
 	$a = get_app();
 
-	if (!$simulate)
+	if (!$simulate) {
 		logger("Import Atom/RSS feed '".$contact["name"]."' (Contact ".$contact["id"].") for user ".$importer["uid"], LOGGER_DEBUG);
-	else
+	} else {
 		logger("Test Atom/RSS feed", LOGGER_DEBUG);
-
+	}
 	if ($xml == "") {
 		logger('XML is empty.', LOGGER_DEBUG);
 		return;
@@ -45,63 +45,69 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 		$author["author-link"] = $xpath->evaluate('/rdf:RDF/rss:channel/rss:link/text()')->item(0)->nodeValue;
 		$author["author-name"] = $xpath->evaluate('/rdf:RDF/rss:channel/rss:title/text()')->item(0)->nodeValue;
 
-		if ($author["author-name"] == "")
+		if ($author["author-name"] == "") {
 			$author["author-name"] = $xpath->evaluate('/rdf:RDF/rss:channel/rss:description/text()')->item(0)->nodeValue;
-
+		}
 		$entries = $xpath->query('/rdf:RDF/rss:item');
 	}
 
 	// Is it Atom?
 	if ($xpath->query('/atom:feed')->length > 0) {
 		$alternate = $xpath->query("atom:link[@rel='alternate']")->item(0)->attributes;
-		if (is_object($alternate))
-			foreach($alternate AS $attributes)
-				if ($attributes->name == "href")
+		if (is_object($alternate)) {
+			foreach($alternate AS $attributes) {
+				if ($attributes->name == "href") {
 					$author["author-link"] = $attributes->textContent;
-
-		if ($author["author-link"] == "")
-			$author["author-link"] = $author["author-id"];
-
-		if ($author["author-link"] == "") {
-			$self = $xpath->query("atom:link[@rel='self']")->item(0)->attributes;
-			if (is_object($self))
-				foreach($self AS $attributes)
-					if ($attributes->name == "href")
-						$author["author-link"] = $attributes->textContent;
+				}
+			}
 		}
 
-		if ($author["author-link"] == "")
-			$author["author-link"] = $xpath->evaluate('/atom:feed/atom:id/text()')->item(0)->nodeValue;
+		if ($author["author-link"] == "") {
+			$author["author-link"] = $author["author-id"];
+		}
+		if ($author["author-link"] == "") {
+			$self = $xpath->query("atom:link[@rel='self']")->item(0)->attributes;
+			if (is_object($self)) {
+				foreach($self AS $attributes) {
+					if ($attributes->name == "href") {
+						$author["author-link"] = $attributes->textContent;
+					}
+				}
+			}
+		}
 
+		if ($author["author-link"] == "") {
+			$author["author-link"] = $xpath->evaluate('/atom:feed/atom:id/text()')->item(0)->nodeValue;
+		}
 		$author["author-avatar"] = $xpath->evaluate('/atom:feed/atom:logo/text()')->item(0)->nodeValue;
 
 		$author["author-name"] = $xpath->evaluate('/atom:feed/atom:title/text()')->item(0)->nodeValue;
 
-		if ($author["author-name"] == "")
+		if ($author["author-name"] == "") {
 			$author["author-name"] = $xpath->evaluate('/atom:feed/atom:subtitle/text()')->item(0)->nodeValue;
-
-		if ($author["author-name"] == "")
+		}
+		if ($author["author-name"] == "") {
 			$author["author-name"] = $xpath->evaluate('/atom:feed/atom:author/atom:name/text()')->item(0)->nodeValue;
-
+		}
 		$value = $xpath->evaluate('atom:author/poco:displayName/text()')->item(0)->nodeValue;
-		if ($value != "")
+		if ($value != "") {
 			$author["author-name"] = $value;
-
+		}
 		if ($simulate) {
 			$author["author-id"] = $xpath->evaluate('/atom:feed/atom:author/atom:uri/text()')->item(0)->nodeValue;
 
 			$value = $xpath->evaluate('atom:author/poco:preferredUsername/text()')->item(0)->nodeValue;
-			if ($value != "")
+			if ($value != "") {
 				$author["author-nick"] = $value;
-
+			}
 			$value = $xpath->evaluate('atom:author/poco:address/poco:formatted/text()', $context)->item(0)->nodeValue;
-			if ($value != "")
+			if ($value != "") {
 				$author["author-location"] = $value;
-
+			}
 			$value = $xpath->evaluate('atom:author/poco:note/text()')->item(0)->nodeValue;
-			if ($value != "")
+			if ($value != "") {
 				$author["author-about"] = $value;
-
+			}
 		}
 
 		$author["edited"] = $author["created"] = $xpath->query('/atom:feed/atom:updated/text()')->item(0)->nodeValue;
@@ -118,12 +124,12 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 		$author["author-name"] = $xpath->evaluate('/rss/channel/title/text()')->item(0)->nodeValue;
 		$author["author-avatar"] = $xpath->evaluate('/rss/channel/image/url/text()')->item(0)->nodeValue;
 
-		if ($author["author-name"] == "")
+		if ($author["author-name"] == "") {
 			$author["author-name"] = $xpath->evaluate('/rss/channel/copyright/text()')->item(0)->nodeValue;
-
-		if ($author["author-name"] == "")
+		}
+		if ($author["author-name"] == "") {
 			$author["author-name"] = $xpath->evaluate('/rss/channel/description/text()')->item(0)->nodeValue;
-
+		}
 		$author["edited"] = $author["created"] = $xpath->query('/rss/channel/pubDate/text()')->item(0)->nodeValue;
 
 		$author["app"] = $xpath->evaluate('/rss/channel/generator/text()')->item(0)->nodeValue;
@@ -134,9 +140,9 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 	if (!$simulate) {
 		$author["author-link"] = $contact["url"];
 
-		if ($author["author-name"] == "")
+		if ($author["author-name"] == "") {
 			$author["author-name"] = $contact["name"];
-
+		}
 		$author["author-avatar"] = $contact["thumb"];
 
 		$author["owner-link"] = $contact["url"];
@@ -171,37 +177,39 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 
 	$entrylist = array();
 
-	foreach ($entries AS $entry)
+	foreach ($entries AS $entry) {
 		$entrylist[] = $entry;
-
+	}
 	foreach (array_reverse($entrylist) AS $entry) {
 		$item = array_merge($header, $author);
 
 		$alternate = $xpath->query("atom:link[@rel='alternate']", $entry)->item(0)->attributes;
-		if (!is_object($alternate))
+		if (!is_object($alternate)) {
 			$alternate = $xpath->query("atom:link", $entry)->item(0)->attributes;
-
-		if (is_object($alternate))
-			foreach($alternate AS $attributes)
-				if ($attributes->name == "href")
+		}
+		if (is_object($alternate)) {
+			foreach($alternate AS $attributes) {
+				if ($attributes->name == "href") {
 					$item["plink"] = $attributes->textContent;
-
-		if ($item["plink"] == "")
+				}
+			}
+		}
+		if ($item["plink"] == "") {
 			$item["plink"] = $xpath->evaluate('link/text()', $entry)->item(0)->nodeValue;
-
-		if ($item["plink"] == "")
+		}
+		if ($item["plink"] == "") {
 			$item["plink"] = $xpath->evaluate('rss:link/text()', $entry)->item(0)->nodeValue;
-
+		}
 		$item["plink"] = original_url($item["plink"]);
 
 		$item["uri"] = $xpath->evaluate('atom:id/text()', $entry)->item(0)->nodeValue;
 
-		if ($item["uri"] == "")
+		if ($item["uri"] == "") {
 			$item["uri"] = $xpath->evaluate('guid/text()', $entry)->item(0)->nodeValue;
-
-		if ($item["uri"] == "")
+		}
+		if ($item["uri"] == "") {
 			$item["uri"] = $item["plink"];
-
+		}
 		$item["parent-uri"] = $item["uri"];
 
 		if (!$simulate) {
@@ -215,50 +223,50 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 
 		$item["title"] = $xpath->evaluate('atom:title/text()', $entry)->item(0)->nodeValue;
 
-		if ($item["title"] == "")
+		if ($item["title"] == "") {
 			$item["title"] = $xpath->evaluate('title/text()', $entry)->item(0)->nodeValue;
-
-		if ($item["title"] == "")
+		}
+		if ($item["title"] == "") {
 			$item["title"] = $xpath->evaluate('rss:title/text()', $entry)->item(0)->nodeValue;
-
+		}
 		$published = $xpath->query('atom:published/text()', $entry)->item(0)->nodeValue;
 
-		if ($published == "")
+		if ($published == "") {
 			$published = $xpath->query('pubDate/text()', $entry)->item(0)->nodeValue;
-
-		if ($published == "")
+		}
+		if ($published == "") {
 			$published = $xpath->query('dc:date/text()', $entry)->item(0)->nodeValue;
-
+		}
 		$updated = $xpath->query('atom:updated/text()', $entry)->item(0)->nodeValue;
 
-		if ($updated == "")
+		if ($updated == "") {
 			$updated = $published;
-
-		if ($published != "")
+		}
+		if ($published != "") {
 			$item["created"] = $published;
-
-		if ($updated != "")
+		}
+		if ($updated != "") {
 			$item["edited"] = $updated;
-
+		}
 		$creator = $xpath->query('author/text()', $entry)->item(0)->nodeValue;
 
-		if ($creator == "")
+		if ($creator == "") {
 			$creator = $xpath->query('atom:author/atom:name/text()', $entry)->item(0)->nodeValue;
-
-		if ($creator == "")
+		}
+		if ($creator == "") {
 			$creator = $xpath->query('dc:creator/text()', $entry)->item(0)->nodeValue;
-
-		if ($creator != "")
+		}
+		if ($creator != "") {
 			$item["author-name"] = $creator;
-
-		if ($pubDate != "")
+		}
+		if ($pubDate != "") {
 			$item["edited"] = $item["created"] = $pubDate;
-
+		}
 		$creator = $xpath->query('dc:creator/text()', $entry)->item(0)->nodeValue;
 
-		if ($creator != "")
+		if ($creator != "") {
 			$item["author-name"] = $creator;
-
+		}
 		/// @TODO ?
 		// <category>Ausland</category>
 		// <media:thumbnail width="152" height="76" url="http://www.taz.de/picture/667875/192/14388767.jpg"/>
@@ -273,12 +281,13 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 			$title = "";
 
 			foreach($enclosure->attributes AS $attributes) {
-				if ($attributes->name == "url")
+				if ($attributes->name == "url") {
 					$href = $attributes->textContent;
-				elseif ($attributes->name == "length")
+				} elseif ($attributes->name == "length") {
 					$length = $attributes->textContent;
-				elseif ($attributes->name == "type")
+				} elseif ($attributes->name == "type") {
 					$type = $attributes->textContent;
+				}
 			}
 			if(strlen($item["attach"]))
 				$item["attach"] .= ',';
@@ -292,9 +301,11 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 			$preview = "";
 
 			// Handle enclosures and treat them as preview picture
-			foreach ($attachments AS $attachment)
-				if ($attachment["type"] == "image/jpeg")
+			foreach ($attachments AS $attachment) {
+				if ($attachment["type"] == "image/jpeg") {
 					$preview = $attachment["link"];
+				}
+			}
 
 			$item["body"] = $item["title"].add_page_info($item["plink"], false, $preview, ($contact["fetch_further_information"] == 2), $contact["ffi_keyword_blacklist"]);
 			$item["tag"] = add_page_keywords($item["plink"], false, $preview, ($contact["fetch_further_information"] == 2), $contact["ffi_keyword_blacklist"]);
@@ -304,20 +315,20 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 		} else {
 			$body = trim($xpath->evaluate('atom:content/text()', $entry)->item(0)->nodeValue);
 
-			if ($body == "")
+			if ($body == "") {
 				$body = trim($xpath->evaluate('content:encoded/text()', $entry)->item(0)->nodeValue);
-
-			if ($body == "")
+			}
+			if ($body == "") {
 				$body = trim($xpath->evaluate('description/text()', $entry)->item(0)->nodeValue);
-
-			if ($body == "")
+			}
+			if ($body == "") {
 				$body = trim($xpath->evaluate('atom:summary/text()', $entry)->item(0)->nodeValue);
-
+			}
 			// remove the content of the title if it is identically to the body
 			// This helps with auto generated titles e.g. from tumblr
-			if (title_is_body($item["title"], $body))
+			if (title_is_body($item["title"], $body)) {
 				$item["title"] = "";
-
+			}
 			$item["body"] = html2bbcode($body);
 		}
 
@@ -336,14 +347,16 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
 			$id = item_store($item, false, $notify);
 
 			logger("Feed for contact ".$contact["url"]." stored under id ".$id);
-		} else
+		} else {
 			$items[] = $item;
-
-		if ($simulate)
+		}
+		if ($simulate) {
 			break;
+		}
 	}
 
-	if ($simulate)
+	if ($simulate) {
 		return array("header" => $author, "items" => $items);
+	}
 }
 ?>