Browse Source

Blog posts paging

HelloZeroNet 8 years ago
parent
commit
455e9c8243
6 changed files with 215 additions and 150 deletions
  1. 142 130
      content.json
  2. 8 0
      css/ZeroBlog.css
  3. 9 1
      css/all.css
  4. 6 1
      index.html
  5. 19 6
      js/ZeroBlog.coffee
  6. 31 12
      js/all.js

+ 142 - 130
content.json

@@ -1,132 +1,144 @@
 {
-  "address": "1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8", 
-  "background-color": "white", 
-  "cloneable": true, 
-  "description": "Blogging platform Demo", 
-  "domain": "Blog.ZeroNetwork.bit", 
-  "files": {
-    "css/all.css": {
-      "sha512": "9170b737d6ed8d3f606cd3b649af202f40c0d90141cf358164627f40028f83c3", 
-      "size": 112756
-    }, 
-    "data-default/data.json": {
-      "sha512": "aff6accbac7e950ff567105666ddf29b70ca7c2dcd9d90f9a969509a42a9b195", 
-      "size": 352
-    }, 
-    "data-default/users/content-default.json": {
-      "sha512": "0603ce08f7abb92b3840ad0cf40e95ea0b3ed3511b31524d4d70e88adba83daa", 
-      "size": 679
-    }, 
-    "data/data.json": {
-      "sha512": "2650ec3c79e3180fafc0e04990865bf198a84481a4a00ea58dd6e3e12265bf90", 
-      "size": 54272
-    }, 
-    "data/img/autoupdate.png": {
-      "sha512": "d2b4dc8e0da2861ea051c0c13490a4eccf8933d77383a5b43de447c49d816e71", 
-      "size": 24460
-    }, 
-    "data/img/clone.png": {
-      "sha512": "b60362ebb7744cd3fe07d25e2f29df246cb359da7f613ba8612649593f28d74e", 
-      "size": 4547
-    }, 
-    "data/img/direct_domains.png": {
-      "sha512": "5f14b30c1852735ab329b22496b1e2ea751cb04704789443ad73a70587c59719", 
-      "size": 16185
-    }, 
-    "data/img/domain.png": {
-      "sha512": "ce87e0831f4d1e95a95d7120ca4d33f8273c6fce9f5bbedf7209396ea0b57b6a", 
-      "size": 11881
-    }, 
-    "data/img/memory.png": {
-      "sha512": "dd56515085b4a79b5809716f76f267ec3a204be3ee0d215591a77bf0f390fa4e", 
-      "size": 12775
-    }, 
-    "data/img/multiuser.png": {
-      "sha512": "88e3f795f9b86583640867897de6efc14e1aa42f93e848ed1645213e6cc210c6", 
-      "size": 29480
-    }, 
-    "data/img/progressbar.png": {
-      "sha512": "23d592ae386ce14158cec34d32a3556771725e331c14d5a4905c59e0fe980ebf", 
-      "size": 13294
-    }, 
-    "data/img/slides.png": {
-      "sha512": "1933db3b90ab93465befa1bd0843babe38173975e306286e08151be9992f767e", 
-      "size": 14439
-    }, 
-    "data/img/slots_memory.png": {
-      "sha512": "82a250e6da909d7f66341e5b5c443353958f86728cd3f06e988b6441e6847c29", 
-      "size": 9488
-    }, 
-    "data/img/trayicon.png": {
-      "sha512": "e7ae65bf280f13fb7175c1293dad7d18f1fcb186ebc9e1e33850cdaccb897b8f", 
-      "size": 19040
-    }, 
-    "data/img/tutorial-1.png": {
-      "sha512": "885d322f4e189775cbacb6e7d4f9ee89554d5709077e3777f0d382b0e9d315f1", 
-      "size": 18729
-    }, 
-    "data/img/uipassword.png": {
-      "sha512": "2f7ddb406cb318da51c36dc4e30e79aca17ef6730b9ba1fa5a9768127d3d0f02", 
-      "size": 5383
-    }, 
-    "data/img/zeroblog-comments.png": {
-      "sha512": "efe4e815a260e555303e5c49e550a689d27a8361f64667bd4a91dbcccb83d2b4", 
-      "size": 24001
-    }, 
-    "data/img/zeroid.png": {
-      "sha512": "b46d541a9e51ba2ddc8a49955b7debbc3b45fd13467d3c20ef104e9d938d052b", 
-      "size": 18875
-    }, 
-    "data/img/zeroname.png": {
-      "sha512": "bab45a1bb2087b64e4f69f756b2ffa5ad39b7fdc48c83609cdde44028a7a155d", 
-      "size": 36031
-    }, 
-    "data/img/zerotalk-mark.png": {
-      "sha512": "a335b2fedeb8d291ca68d3091f567c180628e80f41de4331a5feb19601d078af", 
-      "size": 44862
-    }, 
-    "data/img/zerotalk-upvote.png": {
-      "sha512": "b1ffd7f948b4f99248dde7efe256c2efdfd997f7e876fb9734f986ef2b561732", 
-      "size": 41092
-    }, 
-    "data/img/zerotalk.png": {
-      "sha512": "54d10497a1ffca9a4780092fd1bd158c15f639856d654d2eb33a42f9d8e33cd8", 
-      "size": 26606
-    }, 
-    "dbschema.json": {
-      "sha512": "7b756e8e475d4d6b345a24e2ae14254f5c6f4aa67391a94491a026550fe00df8", 
-      "size": 1529
-    }, 
-    "img/loading.gif": {
-      "sha512": "8a42b98962faea74618113166886be488c09dad10ca47fe97005edc5fb40cc00", 
-      "size": 723
-    }, 
-    "index.html": {
-      "sha512": "0a8db2fd761d9b6192d841e5763c33f80dce646b9d289a367ba8af99f72e34de", 
-      "size": 4643
-    }, 
-    "js/all.js": {
-      "sha512": "c2a06fc33137e8d1a285513c381ae78c4c285f74f9b141eec2b371d8b3afbdd9", 
-      "size": 201621
-    }
-  }, 
-  "ignore": "((js|css)/(?!all.(js|css))|data/.*db|data/users/.*/.*)", 
-  "includes": {
-    "data/users/content.json": {
-      "signers": [], 
-      "signers_required": 1
-    }
-  }, 
-  "modified": 1438815770.321, 
-  "sign": [
-    110256115178284525706565442636490562453617991761595731102420529416264516316446, 
-    13485347502115536516285375329146331372195652223210495825472270466787601612047
-  ], 
-  "signers_sign": "G7W/oNvczE5nPTFYVOqv8+GOpQd23LS/Dc1Q6xQ1NRDDHlYzmoSE63UQ7Za05kD0rwIYXbuUSr8z8p6RhZmnUs8=", 
-  "signs": {
-    "1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8": "G1WpLw9E70zkJa4BxmZhy1UwED1KL88X1rIzRqiUXMv5SUsKc4euWAUwvcIQePxV62DUkv0PDlTsWZ8MDqwMy5g="
-  }, 
-  "signs_required": 1, 
-  "title": "ZeroBlog", 
-  "zeronet_version": "0.3.1"
+ "address": "1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8", 
+ "background-color": "white", 
+ "cloneable": true, 
+ "description": "Blogging platform Demo", 
+ "domain": "Blog.ZeroNetwork.bit", 
+ "files": {
+  "css/all.css": {
+   "sha512": "ccdbbce8efef58f5259b97d7e79b35b3270bed909a2232e4bd09c2be7c387c83", 
+   "size": 113347
+  }, 
+  "data-default/data.json": {
+   "sha512": "aff6accbac7e950ff567105666ddf29b70ca7c2dcd9d90f9a969509a42a9b195", 
+   "size": 352
+  }, 
+  "data-default/users/content-default.json": {
+   "sha512": "0603ce08f7abb92b3840ad0cf40e95ea0b3ed3511b31524d4d70e88adba83daa", 
+   "size": 679
+  }, 
+  "data/data.json": {
+   "sha512": "615fbd9b4427627528d1c5cf8fc9041991192b3f5bd51c71eec9c36410d6fa97", 
+   "size": 60327
+  }, 
+  "data/img/autoupdate.png": {
+   "sha512": "d2b4dc8e0da2861ea051c0c13490a4eccf8933d77383a5b43de447c49d816e71", 
+   "size": 24460
+  }, 
+  "data/img/clone.png": {
+   "sha512": "b60362ebb7744cd3fe07d25e2f29df246cb359da7f613ba8612649593f28d74e", 
+   "size": 4547
+  }, 
+  "data/img/direct_domains.png": {
+   "sha512": "5f14b30c1852735ab329b22496b1e2ea751cb04704789443ad73a70587c59719", 
+   "size": 16185
+  }, 
+  "data/img/domain.png": {
+   "sha512": "ce87e0831f4d1e95a95d7120ca4d33f8273c6fce9f5bbedf7209396ea0b57b6a", 
+   "size": 11881
+  }, 
+  "data/img/memory.png": {
+   "sha512": "dd56515085b4a79b5809716f76f267ec3a204be3ee0d215591a77bf0f390fa4e", 
+   "size": 12775
+  }, 
+  "data/img/multiuser.png": {
+   "sha512": "88e3f795f9b86583640867897de6efc14e1aa42f93e848ed1645213e6cc210c6", 
+   "size": 29480
+  }, 
+  "data/img/new_zeronet_logos.png": {
+   "sha512": "a8685d5d8d9d84a83710a1316ee7b8f998f14918cef32e14217d5e45f156aa20", 
+   "size": 59816
+  }, 
+  "data/img/progressbar.png": {
+   "sha512": "23d592ae386ce14158cec34d32a3556771725e331c14d5a4905c59e0fe980ebf", 
+   "size": 13294
+  }, 
+  "data/img/sidebar.png": {
+   "sha512": "e5fdafcc7226f830eb27a1296236aa985625e27480e6829660db978ceae0bba9", 
+   "size": 98641
+  }, 
+  "data/img/slides.png": {
+   "sha512": "1933db3b90ab93465befa1bd0843babe38173975e306286e08151be9992f767e", 
+   "size": 14439
+  }, 
+  "data/img/slots_memory.png": {
+   "sha512": "82a250e6da909d7f66341e5b5c443353958f86728cd3f06e988b6441e6847c29", 
+   "size": 9488
+  }, 
+  "data/img/trayicon.png": {
+   "sha512": "e7ae65bf280f13fb7175c1293dad7d18f1fcb186ebc9e1e33850cdaccb897b8f", 
+   "size": 19040
+  }, 
+  "data/img/tutorial-1.png": {
+   "sha512": "885d322f4e189775cbacb6e7d4f9ee89554d5709077e3777f0d382b0e9d315f1", 
+   "size": 18729
+  }, 
+  "data/img/uipassword.png": {
+   "sha512": "2f7ddb406cb318da51c36dc4e30e79aca17ef6730b9ba1fa5a9768127d3d0f02", 
+   "size": 5383
+  }, 
+  "data/img/zeroblog-comments.png": {
+   "sha512": "efe4e815a260e555303e5c49e550a689d27a8361f64667bd4a91dbcccb83d2b4", 
+   "size": 24001
+  }, 
+  "data/img/zeroid.png": {
+   "sha512": "b46d541a9e51ba2ddc8a49955b7debbc3b45fd13467d3c20ef104e9d938d052b", 
+   "size": 18875
+  }, 
+  "data/img/zeroname.png": {
+   "sha512": "bab45a1bb2087b64e4f69f756b2ffa5ad39b7fdc48c83609cdde44028a7a155d", 
+   "size": 36031
+  }, 
+  "data/img/zerotalk-mark.png": {
+   "sha512": "a335b2fedeb8d291ca68d3091f567c180628e80f41de4331a5feb19601d078af", 
+   "size": 44862
+  }, 
+  "data/img/zerotalk-upvote.png": {
+   "sha512": "b1ffd7f948b4f99248dde7efe256c2efdfd997f7e876fb9734f986ef2b561732", 
+   "size": 41092
+  }, 
+  "data/img/zerotalk.png": {
+   "sha512": "54d10497a1ffca9a4780092fd1bd158c15f639856d654d2eb33a42f9d8e33cd8", 
+   "size": 26606
+  }, 
+  "data/pdf/zeronet_presentation.pdf": {
+   "sha512": "556d7294d964badd0fa6191984a0525f70c8821ec6473c7487684259e88f688a", 
+   "size": 477911
+  }, 
+  "dbschema.json": {
+   "sha512": "7b756e8e475d4d6b345a24e2ae14254f5c6f4aa67391a94491a026550fe00df8", 
+   "size": 1529
+  }, 
+  "img/loading.gif": {
+   "sha512": "8a42b98962faea74618113166886be488c09dad10ca47fe97005edc5fb40cc00", 
+   "size": 723
+  }, 
+  "index.html": {
+   "sha512": "ecaabb6d144dcbb84f1754b92110df1a834551309500d2e4421df9baca47a7ad", 
+   "size": 5081
+  }, 
+  "js/all.js": {
+   "sha512": "57c730d07735b1a39c8a62bcb9447c506f518ccae079fccf862d1f4ce1d8ea5d", 
+   "size": 204752
+  }
+ }, 
+ "ignore": "((js|css)/(?!all.(js|css))|data/.*db|data/users/.*/.*)", 
+ "includes": {
+  "data/users/content.json": {
+   "signers": [], 
+   "signers_required": 1
+  }
+ }, 
+ "modified": 1446168994.624, 
+ "sign": [
+  96030868191800162957176973774699323652832370569335334056060165593728652091118, 
+  46783872076653677099073354530208373704913656113742582268614963747636587368554
+ ], 
+ "signers_sign": "G7W/oNvczE5nPTFYVOqv8+GOpQd23LS/Dc1Q6xQ1NRDDHlYzmoSE63UQ7Za05kD0rwIYXbuUSr8z8p6RhZmnUs8=", 
+ "signs": {
+  "1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8": "Gxi4vVB8ZW+RAnSP33s8eohudGR2BP/2QAtvFVJ9EEV6ic6EMxxLIb1kzZIHK/zBrHlL3Std9KPI/SHSuIOQrCE="
+ }, 
+ "signs_required": 1, 
+ "title": "ZeroBlog", 
+ "zeronet_version": "0.3.2"
 }

+ 8 - 0
css/ZeroBlog.css

@@ -142,3 +142,11 @@ blockquote { border-left: 3px solid #333; margin-left: 0px; padding-left: 1em }
 .post .more .readmore {  }
 .post .more:hover { color: white; box-shadow: inset 150px 0px 0px 0px #333; }
 .post .more:active { color: white; box-shadow: inset 150px 0px 0px 0px #AF3BFF; transition: none; border-color: #AF3BFF }
+
+.pager { margin-bottom: 200px }
+.pager a { border: 2px solid #333; padding: 10px 20px; font-size: 15px; display: none; transition: all 0.3s }
+.pager a:hover { color: white; box-shadow: inset 150px 0px 0px 0px #333; }
+.pager a:active { color: white; box-shadow: inset 150px 0px 0px 0px #AF3BFF; transition: none; border-color: #AF3BFF }
+.pager .next { float: right }
+.pager .prev:hover { box-shadow: inset -150px 0px 0px 0px #333; }
+.pager .prev:active { box-shadow: inset -150px 0px 0px 0px #AF3BFF; }

+ 9 - 1
css/all.css

@@ -61,7 +61,7 @@ input.text:focus, textarea:focus { border-color: #5FC0EA; outline: none; backgro
 
 /* Design based on medium */
 
-body { background-color: white; color: #333332; margin: 10px; padding: 0px; font-family: 'Roboto', sans-serif; height: 15000px; overflow: hidden; backface-visibility: hidden }
+body { background-color: white; color: #333332; margin: 10px; padding: 0px; font-family: 'Roboto', sans-serif; height: 15000px; overflow: hidden; -webkit-backface-visibility: hidden ; -moz-backface-visibility: hidden ; -o-backface-visibility: hidden ; -ms-backface-visibility: hidden ; backface-visibility: hidden  }
 body.loaded { height: auto; overflow: auto }
 h1, h2, h3, h4 { font-family: 'Roboto', sans-serif; font-weight: normal; margin: 0px; padding: 0px }
 h1 { font-size: 32px; line-height: 1.2em; font-weight: bold; letter-spacing: -0.5px; margin-bottom: 5px }
@@ -204,6 +204,14 @@ blockquote { border-left: 3px solid #333; margin-left: 0px; padding-left: 1em }
 .post .more:hover { color: white; -webkit-box-shadow: inset 150px 0px 0px 0px #333; -moz-box-shadow: inset 150px 0px 0px 0px #333; -o-box-shadow: inset 150px 0px 0px 0px #333; -ms-box-shadow: inset 150px 0px 0px 0px #333; box-shadow: inset 150px 0px 0px 0px #333 ; }
 .post .more:active { color: white; -webkit-box-shadow: inset 150px 0px 0px 0px #AF3BFF; -moz-box-shadow: inset 150px 0px 0px 0px #AF3BFF; -o-box-shadow: inset 150px 0px 0px 0px #AF3BFF; -ms-box-shadow: inset 150px 0px 0px 0px #AF3BFF; box-shadow: inset 150px 0px 0px 0px #AF3BFF ; -webkit-transition: none; -moz-transition: none; -o-transition: none; -ms-transition: none; transition: none ; border-color: #AF3BFF }
 
+.pager { margin-bottom: 200px }
+.pager a { border: 2px solid #333; padding: 10px 20px; font-size: 15px; display: none; -webkit-transition: all 0.3s ; -moz-transition: all 0.3s ; -o-transition: all 0.3s ; -ms-transition: all 0.3s ; transition: all 0.3s  }
+.pager a:hover { color: white; -webkit-box-shadow: inset 150px 0px 0px 0px #333; -moz-box-shadow: inset 150px 0px 0px 0px #333; -o-box-shadow: inset 150px 0px 0px 0px #333; -ms-box-shadow: inset 150px 0px 0px 0px #333; box-shadow: inset 150px 0px 0px 0px #333 ; }
+.pager a:active { color: white; -webkit-box-shadow: inset 150px 0px 0px 0px #AF3BFF; -moz-box-shadow: inset 150px 0px 0px 0px #AF3BFF; -o-box-shadow: inset 150px 0px 0px 0px #AF3BFF; -ms-box-shadow: inset 150px 0px 0px 0px #AF3BFF; box-shadow: inset 150px 0px 0px 0px #AF3BFF ; -webkit-transition: none; -moz-transition: none; -o-transition: none; -ms-transition: none; transition: none ; border-color: #AF3BFF }
+.pager .next { float: right }
+.pager .prev:hover { -webkit-box-shadow: inset -150px 0px 0px 0px #333; -moz-box-shadow: inset -150px 0px 0px 0px #333; -o-box-shadow: inset -150px 0px 0px 0px #333; -ms-box-shadow: inset -150px 0px 0px 0px #333; box-shadow: inset -150px 0px 0px 0px #333 ; }
+.pager .prev:active { -webkit-box-shadow: inset -150px 0px 0px 0px #AF3BFF; -moz-box-shadow: inset -150px 0px 0px 0px #AF3BFF; -o-box-shadow: inset -150px 0px 0px 0px #AF3BFF; -ms-box-shadow: inset -150px 0px 0px 0px #AF3BFF; box-shadow: inset -150px 0px 0px 0px #AF3BFF ; }
+
 
 
 /* ---- data/1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8/css/fonts.css ---- */

+ 6 - 1
index.html

@@ -138,7 +138,12 @@
  </div>
  <!-- EOF Single Post show -->
 
-
+ <!-- Pager -->
+ <div class="pager">
+  <a class="prev" href="#">← <span>Prev page</span></a>
+  <a class="next" href="#"><span>Next page</span> →</a>
+ </div>
+ <!-- EOF Pager -->
 
 </div>
 <!-- EOF right -->

+ 19 - 6
js/ZeroBlog.coffee

@@ -3,6 +3,7 @@ class ZeroBlog extends ZeroFrame
 		@data = null
 		@site_info = null
 		@server_info = null
+		@page = 1
 
 		@event_page_load = $.Deferred()
 		@event_site_info = $.Deferred()
@@ -84,7 +85,13 @@ class ZeroBlog extends ZeroFrame
 		title_hash = lastcomment.post_title.replace(/[#?& ]/g, "+").replace(/[+]+/g, "+")
 		elem.find(".postlink").text(lastcomment.post_title).attr("href", "?Post:#{lastcomment.post_id}:#{title_hash}#Comments")
 
-
+	applyPagerdata: (page, limit, has_next) ->
+		pager = $(".pager")
+		console.log page, limit, has_next
+		if page > 1
+			pager.find(".prev").css("display", "inline-block").attr("href", "?page=#{page-1}")
+		if has_next
+			pager.find(".next").css("display", "inline-block").attr("href", "?page=#{page+1}")
 
 	routeUrl: (url) ->
 		@log "Routing url:", url
@@ -94,12 +101,12 @@ class ZeroBlog extends ZeroFrame
 			@pagePost()
 		else
 			$("body").addClass("page-main")
+			if match = url.match /page=([0-9]+)/
+				@page = parseInt(match[1])
 			@pageMain()
 
-
 	# - Pages -
 
-
 	pagePost: () ->
 		s = (+ new Date)
 		@cmd "dbQuery", ["SELECT * FROM post WHERE post_id = #{@post_id} LIMIT 1"], (res) =>
@@ -111,11 +118,17 @@ class ZeroBlog extends ZeroFrame
 			@pageLoaded()
 
 
-
-
 	pageMain: ->
-		@cmd "dbQuery", ["SELECT post.*, COUNT(comment_id) AS comments FROM post LEFT JOIN comment USING (post_id) GROUP BY post_id ORDER BY date_published"], (res) =>
+		limit = 15
+		@cmd "dbQuery", ["SELECT post.*, COUNT(comment_id) AS comments FROM post LEFT JOIN comment USING (post_id) GROUP BY post_id ORDER BY date_published DESC LIMIT #{(@page-1)*limit}, #{limit+1}"], (res) =>
 			s = (+ new Date)
+			if res.length > limit # Has next page
+				res.pop()
+				@applyPagerdata(@page, limit, true)
+			else
+				@applyPagerdata(@page, limit, false)
+
+			res.reverse()
 			for post in res
 				elem = $("#post_#{post.post_id}")
 				if elem.length == 0 # Not exits yet

+ 31 - 12
js/all.js

@@ -183,7 +183,6 @@
 }).call(this);
 
 
-
 /* ---- data/1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8/js/lib/jquery.csslater.coffee ---- */
 
 
@@ -313,7 +312,6 @@
 }).call(this);
 
 
-
 /* ---- data/1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8/js/lib/marked.min.js ---- */
 
 
@@ -595,7 +593,6 @@
 }).call(this);
 
 
-
 /* ---- data/1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8/js/utils/InlineEditor.coffee ---- */
 
 
@@ -793,7 +790,6 @@
 }).call(this);
 
 
-
 /* ---- data/1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8/js/utils/RateLimit.coffee ---- */
 
 
@@ -823,7 +819,6 @@
 }).call(this);
 
 
-
 /* ---- data/1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8/js/utils/Text.coffee ---- */
 
 
@@ -914,7 +909,6 @@
 }).call(this);
 
 
-
 /* ---- data/1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8/js/utils/Time.coffee ---- */
 
 
@@ -987,7 +981,6 @@
 }).call(this);
 
 
-
 /* ---- data/1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8/js/utils/ZeroFrame.coffee ---- */
 
 
@@ -1099,7 +1092,6 @@
 }).call(this);
 
 
-
 /* ---- data/1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8/js/Comments.coffee ---- */
 
 
@@ -1350,7 +1342,6 @@
 }).call(this);
 
 
-
 /* ---- data/1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8/js/ZeroBlog.coffee ---- */
 
 
@@ -1484,6 +1475,18 @@
       return elem.find(".postlink").text(lastcomment.post_title).attr("href", "?Post:" + lastcomment.post_id + ":" + title_hash + "#Comments");
     };
 
+    ZeroBlog.prototype.applyPagerdata = function(page, limit, has_next) {
+      var pager;
+      pager = $(".pager");
+      console.log(page, limit, has_next);
+      if (page > 1) {
+        pager.find(".prev").css("display", "inline-block").attr("href", "?page=" + (page - 1));
+      }
+      if (has_next) {
+        return pager.find(".next").css("display", "inline-block").attr("href", "?page=" + (page + 1));
+      }
+    };
+
     ZeroBlog.prototype.routeUrl = function(url) {
       var match;
       this.log("Routing url:", url);
@@ -1493,7 +1496,11 @@
         return this.pagePost();
       } else {
         $("body").addClass("page-main");
-        return this.pageMain();
+        if (match = url.match(/page=([0-9]+)/)) {
+          return this.pageMain(parseInt(match[1]));
+        } else {
+          return this.pageMain();
+        }
       }
     };
 
@@ -1513,11 +1520,23 @@
       })(this));
     };
 
-    ZeroBlog.prototype.pageMain = function() {
-      return this.cmd("dbQuery", ["SELECT post.*, COUNT(comment_id) AS comments FROM post LEFT JOIN comment USING (post_id) GROUP BY post_id ORDER BY date_published"], (function(_this) {
+    ZeroBlog.prototype.pageMain = function(page) {
+      var limit;
+      if (page == null) {
+        page = 1;
+      }
+      limit = 15;
+      return this.cmd("dbQuery", ["SELECT post.*, COUNT(comment_id) AS comments FROM post LEFT JOIN comment USING (post_id) GROUP BY post_id ORDER BY date_published DESC LIMIT " + ((page - 1) * limit) + ", " + (limit + 1)], (function(_this) {
         return function(res) {
           var elem, post, s, _i, _len;
           s = +(new Date);
+          if (res.length > limit) {
+            res.pop();
+            _this.applyPagerdata(page, limit, true);
+          } else {
+            _this.applyPagerdata(page, limit, false);
+          }
+          res.reverse();
           for (_i = 0, _len = res.length; _i < _len; _i++) {
             post = res[_i];
             elem = $("#post_" + post.post_id);