From dd61bdb9c6b5f99611ee01f73c24cbade3687a2c Mon Sep 17 00:00:00 2001
From: barisusakli <barisusakli@gmail.com>
Date: Wed, 22 Apr 2015 13:47:41 -0400
Subject: [PATCH] closes #3038

---
 public/src/client/account/favourites.js |  6 +++--
 public/src/client/account/posts.js      |  6 +++--
 public/src/client/account/topics.js     |  6 +++--
 public/src/client/account/watched.js    |  6 +++--
 public/src/client/category.js           |  3 +--
 public/src/client/recent.js             |  2 +-
 public/src/client/tag.js                |  2 +-
 src/controllers/accounts.js             | 36 +++++++++++++++++++++----
 src/pagination.js                       |  2 +-
 9 files changed, 51 insertions(+), 18 deletions(-)

diff --git a/public/src/client/account/favourites.js b/public/src/client/account/favourites.js
index 1e6e77e20b..30a6d29a7e 100644
--- a/public/src/client/account/favourites.js
+++ b/public/src/client/account/favourites.js
@@ -10,7 +10,9 @@ define('forum/account/favourites', ['forum/account/header', 'forum/infinitescrol
 
 		$('.user-favourite-posts img').addClass('img-responsive');
 
-		infinitescroll.init(loadMore);
+		if (!config.usePagination) {
+			infinitescroll.init(loadMore);
+		}
 	};
 
 	function loadMore(direction) {
@@ -24,10 +26,10 @@ define('forum/account/favourites', ['forum/account/header', 'forum/infinitescrol
 		}, function(data, done) {
 			if (data.posts && data.posts.length) {
 				onPostsLoaded(data.posts, done);
-				$('.user-favourite-posts').attr('data-nextstart', data.nextStart);
 			} else {
 				done();
 			}
+			$('.user-favourite-posts').attr('data-nextstart', data.nextStart);
 		});
 	}
 
diff --git a/public/src/client/account/posts.js b/public/src/client/account/posts.js
index c4759b9016..9b04cdc67a 100644
--- a/public/src/client/account/posts.js
+++ b/public/src/client/account/posts.js
@@ -10,7 +10,9 @@ define('forum/account/posts', ['forum/account/header', 'forum/infinitescroll'],
 
 		$('.user-favourite-posts img').addClass('img-responsive');
 
-		infinitescroll.init(loadMore);
+		if (!config.usePagination) {
+			infinitescroll.init(loadMore);
+		}
 	};
 
 	function loadMore(direction) {
@@ -24,10 +26,10 @@ define('forum/account/posts', ['forum/account/header', 'forum/infinitescroll'],
 		}, function(data, done) {
 			if (data.posts && data.posts.length) {
 				onPostsLoaded(data.posts, done);
-				$('.user-favourite-posts').attr('data-nextstart', data.nextStart);
 			} else {
 				done();
 			}
+			$('.user-favourite-posts').attr('data-nextstart', data.nextStart);
 		});
 	}
 
diff --git a/public/src/client/account/topics.js b/public/src/client/account/topics.js
index c6c93f4262..3242f0395e 100644
--- a/public/src/client/account/topics.js
+++ b/public/src/client/account/topics.js
@@ -8,7 +8,9 @@ define('forum/account/topics', ['forum/account/header', 'forum/infinitescroll'],
 	AccountTopics.init = function() {
 		header.init();
 
-		infinitescroll.init(loadMore);
+		if (!config.usePagination) {
+			infinitescroll.init(loadMore);
+		}
 	};
 
 	function loadMore(direction) {
@@ -23,10 +25,10 @@ define('forum/account/topics', ['forum/account/header', 'forum/infinitescroll'],
 
 			if (data.topics && data.topics.length) {
 				onTopicsLoaded(data.topics, done);
-				$('[component="category"]').attr('data-nextstart', data.nextStart);
 			} else {
 				done();
 			}
+			$('[component="category"]').attr('data-nextstart', data.nextStart);
 		});
 	}
 
diff --git a/public/src/client/account/watched.js b/public/src/client/account/watched.js
index 08feb89344..b9f7fcc5f7 100644
--- a/public/src/client/account/watched.js
+++ b/public/src/client/account/watched.js
@@ -7,7 +7,9 @@ define('forum/account/watched', ['forum/account/header', 'forum/infinitescroll']
 	AccountWatched.init = function() {
 		header.init();
 
-		infinitescroll.init(loadMore);
+		if (!config.usePagination) {
+			infinitescroll.init(loadMore);
+		}
 	};
 
 	function loadMore(direction) {
@@ -21,10 +23,10 @@ define('forum/account/watched', ['forum/account/header', 'forum/infinitescroll']
 		}, function(data, done) {
 			if (data.topics && data.topics.length) {
 				onTopicsLoaded(data.topics, done);
-				$('[component="category"]').attr('data-nextstart', data.nextStart);
 			} else {
 				done();
 			}
+			$('[component="category"]').attr('data-nextstart', data.nextStart);
 		});
 	}
 
diff --git a/public/src/client/category.js b/public/src/client/category.js
index 5e64f4fc56..777d3f808a 100644
--- a/public/src/client/category.js
+++ b/public/src/client/category.js
@@ -342,17 +342,16 @@ define('forum/category', [
 			after: after,
 			author: utils.params().author
 		}, function (data, done) {
-
 			if (data.topics && data.topics.length) {
 				Category.onTopicsLoaded(data, function() {
 					done();
 					callback();
 				});
-				$('[component="category"]').attr('data-nextstart', data.nextStart);
 			} else {
 				done();
 			}
 
+			$('[component="category"]').attr('data-nextstart', data.nextStart);
 			$(window).trigger('action:categories.loaded');
 		});
 	}
diff --git a/public/src/client/recent.js b/public/src/client/recent.js
index dc4a949c4d..fc55ee9b08 100644
--- a/public/src/client/recent.js
+++ b/public/src/client/recent.js
@@ -93,10 +93,10 @@ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinite
 		}, function(data, done) {
 			if (data.topics && data.topics.length) {
 				Recent.onTopicsLoaded('recent', data.topics, false, done);
-				$('[component="category"]').attr('data-nextstart', data.nextStart);
 			} else {
 				done();
 			}
+			$('[component="category"]').attr('data-nextstart', data.nextStart);
 		});
 	};
 
diff --git a/public/src/client/tag.js b/public/src/client/tag.js
index 7328934e2d..d2e6dd30b7 100644
--- a/public/src/client/tag.js
+++ b/public/src/client/tag.js
@@ -29,11 +29,11 @@ define('forum/tag', ['forum/recent', 'forum/infinitescroll'], function(recent, i
 			}, function(data, done) {
 				if (data.topics && data.topics.length) {
 					recent.onTopicsLoaded('tag', data.topics, false, done);
-					$('[component="category"]').attr('data-nextstart', data.nextStart);
 				} else {
 					done();
 					$('#load-more-btn').hide();
 				}
+				$('[component="category"]').attr('data-nextstart', data.nextStart);
 			});
 		}
 	};
diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js
index 536241dba1..71a208ba06 100644
--- a/src/controllers/accounts.js
+++ b/src/controllers/accounts.js
@@ -255,22 +255,48 @@ accountsController.getGroups = function(req, res, next) {
 };
 
 function getFromUserSet(tpl, set, method, type, req, res, next) {
-	accountsController.getBaseUser(req.params.userslug, req.uid, function(err, userData) {
+	async.parallel({
+		settings: function(next) {
+			user.getSettings(req.uid, next);
+		},
+		userData: function(next) {
+			accountsController.getBaseUser(req.params.userslug, req.uid, next);
+		}
+	}, function(err, results) {
 		if (err) {
 			return next(err);
 		}
-
+		var userData = results.userData;
 		if (!userData) {
 			return helpers.notFound(req, res);
 		}
 
-		method('uid:' + userData.uid + ':' + set, req.uid, 0, 19, function(err, data) {
+		var setName = 'uid:' + userData.uid + ':' + set;
+
+		var page = Math.max(1, parseInt(req.query.page, 10) || 1);
+		var itemsPerPage = (tpl === 'account/topics' || tpl === 'account/watched') ? results.settings.topicsPerPage : results.settings.postsPerPage;
+		itemsPerPage = parseInt(itemsPerPage, 10);
+
+		async.parallel({
+			count: function(next) {
+				db.sortedSetCard(setName, next);
+			},
+			data: function(next) {
+				var start = (page - 1) * itemsPerPage;
+				var stop = start + itemsPerPage;
+				method(setName, req.uid, start, stop, next);
+			}
+		}, function(err, results) {
 			if (err) {
 				return next(err);
 			}
 
-			userData[type] = data[type];
-			userData.nextStart = data.nextStart;
+			userData[type] = results.data[type];
+			userData.nextStart = results.data.nextStart;
+			var pageCount = Math.ceil(results.count / itemsPerPage);
+
+			var pagination = require('../pagination');
+			userData.pagination = pagination.create(page, pageCount);
 
 			res.render(tpl, userData);
 		});
diff --git a/src/pagination.js b/src/pagination.js
index 58aac68f8f..58813c391b 100644
--- a/src/pagination.js
+++ b/src/pagination.js
@@ -13,7 +13,7 @@ pagination.create = function(currentPage, pageCount, queryObj) {
 			pages: []
 		};
 	}
-
+	pageCount = parseInt(pageCount, 10);
 	var pagesToShow = [1, 2, pageCount - 1, pageCount];
 
 	currentPage = parseInt(currentPage, 10) || 1;