refactored blog client-side code
diff --git a/home/page/latest_updates/latest_updates.js b/home/page/latest_updates/latest_updates.js
index f41c547..d1e46ef 100644
--- a/home/page/latest_updates/latest_updates.js
+++ b/home/page/latest_updates/latest_updates.js
@@ -1,4 +1,7 @@
 erpnext.updates = [
+	["14th December 2012", [
+		"Website Module: Major Refactor - removed framework code from website."
+	]],
 	["12th December 2012", [
 		"Attachments: Attachments can be set as URLs or File Uploads. This will help if people want to share documents from Google Docs, Dropbox and other such services (esp for the Product listings on websites).",
 		"Global Defaults: Session Expiry can now be set in Global Defaults.",
diff --git a/public/js/website_utils.js b/public/js/website_utils.js
index eb6363f..f35ad4c 100644
--- a/public/js/website_utils.js
+++ b/public/js/website_utils.js
@@ -42,4 +42,12 @@
 		return "";
 	else
 		return decodeURIComponent(results[1]);		
-}
\ No newline at end of file
+}
+
+function repl(s, dict) {
+	if(s==null)return '';
+	for(key in dict) {
+		s = s.split("%("+key+")s").join(dict[key]);
+	}
+	return s;
+}
diff --git a/website/helpers/blog.py b/website/helpers/blog.py
index 02230dc..2bff6e5 100644
--- a/website/helpers/blog.py
+++ b/website/helpers/blog.py
@@ -9,8 +9,7 @@
 def get_blog_list(args=None):
 	"""
 		args = {
-			'limit_start': 0,
-			'limit_page_length': 10,
+			'start': 0,
 		}
 	"""
 	import webnotes
@@ -24,11 +23,9 @@
 				comment_doctype='Blog' and comment_docname=`tabBlog`.name) as comments
 		from `tabBlog`
 		where ifnull(published,0)=1
-		order by creation desc, name asc"""
-	
-	from webnotes.widgets.query_builder import add_limit_to_query
-	query, args = add_limit_to_query(query, args)
-	
+		order by creation desc, name asc
+		limit %s, 5""" % args.start
+		
 	result = webnotes.conn.sql(query, args, as_dict=1)
 
 	# strip html tags from content
@@ -41,38 +38,6 @@
 		if not res['content']:
 			res['content'] = website.utils.get_html(res['page_name'])
 		res['content'] = split_blog_content(res['content'])
-		res['content'] = res['content'][:1000]
-
-	return result
-
-@webnotes.whitelist(allow_guest=True)
-def get_recent_blog_list(args=None):
-	"""
-		args = {
-			'limit_start': 0,
-			'limit_page_length': 5,
-			'name': '',
-		}
-	"""
-	import webnotes
-	
-	if not args: args = webnotes.form_dict
-	
-	query = """\
-		select name, page_name, title, left(content, 100) as content
-		from tabBlog
-		where ifnull(published,0)=1 and
-		name!=%(name)s order by creation desc"""
-	
-	from webnotes.widgets.query_builder import add_limit_to_query
-	query, args = add_limit_to_query(query, args)
-	
-	result = webnotes.conn.sql(query, args, as_dict=1)
-
-	# strip html tags from content
-	import webnotes.utils
-	for res in result:
-		res['content'] = webnotes.utils.strip_html(res['content'])
 
 	return result
 
diff --git a/website/templates/css/blog_page.css b/website/templates/css/blog_page.css
index 928b8ac..8f56cd2 100644
--- a/website/templates/css/blog_page.css
+++ b/website/templates/css/blog_page.css
@@ -6,4 +6,8 @@
 		.comment-content {
 			margin-left: 20px;
 		}
+		
+		input {
+			width: 240px;
+		}
 	</style>
\ No newline at end of file
diff --git a/website/templates/html/blog_page.html b/website/templates/html/blog_page.html
index 5421f00..87dcfef 100644
--- a/website/templates/html/blog_page.html
+++ b/website/templates/html/blog_page.html
@@ -2,7 +2,6 @@
 
 {% block javascript %}
 	{% include "js/blog_page.js" %}
-	{% include "js/blog_subscribe.js" %}
 {% endblock %}
 
 {% block css %}
@@ -28,15 +27,32 @@
 				<div class="blog-comments">
 					
 					{% if not comment_list %}
-					<div class="no-result help hide">
+					<div class="alert no-comment">
 						<p>Be the first one to comment</p>
-						<br />
 					</div>
 					{% endif %}
 					
 					{% include 'html/comment.html' %}
 				</div>
-				<button class="btn add-comment">Add Comment</button>
+				<div><button class="btn add-comment">Add Comment</button></div>
+				<div style="display: none; margin-top: 10px;" 
+					id="comment-form" class="well">
+					<div class="alert" style="display:none;"></div>
+					<form>
+						<p>
+							<input name="comment_by_fullname" placeholder="Your Name" />
+						</p>
+						<p>
+							<input name="comment_by" placeholder="Your Email Id" />
+						</p>
+						<p>
+							<textarea name="comment" placeholder="Comment" />
+							</textarea>
+						</p>
+						<p>
+							<button class="btn btn-info" id="submit-comment">Submit</button>
+					</form>
+				</div>
 			</div>
 		</div>
 	</div>
diff --git a/website/templates/js/blog.js b/website/templates/js/blog.js
index 24cdf15..43b2d70 100644
--- a/website/templates/js/blog.js
+++ b/website/templates/js/blog.js
@@ -15,29 +15,54 @@
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 // js inside blog page
-wn.pages['{{ name }}'].onload = function(wrapper) {
-	erpnext.blog_list = new wn.ui.Listing({
-		parent: $(wrapper).find('#blog-list').get(0),
-		method: 'website.helpers.blog.get_blog_list',
-		hide_refresh: true,
-		no_toolbar: true,
-		render_row: function(parent, data) {
-			if(!data.comments) {
-				data.comment_text = 'No comments yet.'
-			} else if (data.comments===1) {
-				data.comment_text = '1 comment.'
+
+$(document).ready(function() {
+	// make list of blogs
+	blog.get_list();
+	
+	$("#next-page").click(function() {
+		blog.get_list();
+	})
+});
+
+var blog = {
+	start: 0,
+	get_list: function() {
+		$.ajax({
+			method: "GET",
+			url: "server.py",
+			data: {
+				cmd: "website.helpers.blog.get_blog_list",
+				start: blog.start
+			},
+			dataType: "json",
+			success: function(data) {
+				blog.render(data.message);
+			}
+		});
+	},
+	render: function(data) {
+		var $wrap = $("#blog-list");
+		$.each(data, function(i, b) {
+			// comments
+			if(!b.comments) {
+				b.comment_text = 'No comments yet.'
+			} else if (b.comments===1) {
+				b.comment_text = '1 comment.'
 			} else {
-				data.comment_text = data.comments + ' comments.'
+				b.comment_text = b.comments + ' comments.'
 			} 
 			
-			if(data.content && data.content.length==1000) {
-				data.content += repl('... <a href="%(page_name)s.html">(read on)</a>', data);
-			}
-			parent.innerHTML = repl('<h2><a href="%(page_name)s.html">%(title)s</a></h2>\
+			$(repl('<h2><a href="%(page_name)s.html">%(title)s</a></h2>\
 				<div class="help">%(comment_text)s</div>\
-				%(content)s<br /><br />', data);
-		},
-		page_length: 10
-	});
-	erpnext.blog_list.run();
+				%(content)s<br />\
+				<p><a href="%(page_name)s">Read with comments...</a></p>\
+				<hr /><br />', b)).appendTo($wrap);
+		});
+		blog.start += data.length;
+		if(!data.length) {
+			$("#next-page").toggle(false)
+				.parent().append("<div class='alert'>Nothing more to show.</div>");
+		}
+	}
 }
\ No newline at end of file
diff --git a/website/templates/js/blog_page.js b/website/templates/js/blog_page.js
index 12dcac1..2e8de7e 100644
--- a/website/templates/js/blog_page.js
+++ b/website/templates/js/blog_page.js
@@ -16,166 +16,61 @@
 
 // js inside blog page
 
-wn.provide('erpnext.blog');
-wn.pages['{{ name }}'].onload = function(wrapper) {
-	erpnext.blog.wrapper = wrapper;
+$(document).ready(function() {
+	var n_comments = $(".comment-row").length;
 	
-	// sidebar
-	//erpnext.blog.render_recent_list(wrapper);
-	
-	// unhide no-result if no comments found
-	erpnext.blog.toggle_no_result(wrapper);
-	
-	// bind add comment button to comment dialog
-	erpnext.blog.make_comment_dialog(wrapper);
-	
-	// hide add comment button after 50 comments
-	erpnext.blog.toggle_add_comment_btn(wrapper);
-}
-
-erpnext.blog.adjust_page_height = function(wrapper) {
-	if (!wrapper) { wrapper = erpnext.blog.wrapper; }
-	if (!wrapper) { return; }
-
-	// adjust page height based on sidebar height
-	var $main_page = $(wrapper).find('.layout-main-section');
-	var $sidebar = $(wrapper).find('.layout-side-section');
-	if ($sidebar.height() > $main_page.height()) {
-		$main_page.height($sidebar.height());
+	if(n_comments) {
+		$(".no_comment").toggle(false);
 	}
-}
-
-erpnext.blog.render_recent_list = function(wrapper) {
-	if (!wrapper) { wrapper = erpnext.blog.wrapper; }
-	if (!wrapper) { return; }
-	
-	wrapper.recent_list = new wn.ui.Listing({
-		parent: $(wrapper).find('.recent-posts'),
-		no_toolbar: true,
-		method: 'website.helpers.blog.get_recent_blog_list',
-		get_args: function() {
-			return { name: '{{ name }}' }
-		},
-		hide_refresh: true,
-		render_row: function(parent, data) {
-			if(data.content && data.content.length>=100) data.content += '...';
-			parent.innerHTML = repl('<div style="font-size: 80%">\
-				<a href="%(page_name)s.html">%(title)s</a>\
-				<div class="comment">%(content)s</div><br></div>', data);
-			
-			// adjust page height depending on sidebar height
-			erpnext.blog.adjust_page_height(wrapper);
-		},
-		page_length: 5,
-	});
-	wrapper.recent_list.run();
-}
-
-erpnext.blog.toggle_no_result = function(wrapper) {
-	if (!wrapper) { wrapper = erpnext.blog.wrapper; }
-	if (!wrapper) { return; }
-	
-	var $blog_comments = $(wrapper).find('.blog-comments');
-	var $comment_rows = $blog_comments.find('.comment-row');
-	var $no_result = $blog_comments.find('.no-result');
-
-	if ($comment_rows.length == 0) {
-		$no_result.removeClass('hide');
-	} else {
-		$no_result.addClass('hide');
+	if(n_comments > 50) {
+		$(".add-comment").toggle(false)
+			.parent().append("<div class='alert'>Comments are closed.</div>")
 	}
-}
-
-erpnext.blog.make_comment_dialog = function(wrapper) {
-	if (!wrapper) { wrapper = erpnext.blog.wrapper; }
-	if (!wrapper) { return; }
-	
-	var $comment_btn = $(wrapper).find('button.add-comment');
-	
-	$comment_btn.click(function() {
-		if(!erpnext.blog.comment_dialog) {
-			var d = new wn.ui.Dialog({
-				title: 'Add Comment',
-				fields: [
-					{
-						fieldname: 'comment_by_fullname', label: 'Your Name',
-						reqd: 1, fieldtype: 'Data'
-					},
-					{
-						fieldname: 'comment_by', label: 'Email Id',
-						reqd: 1, fieldtype: 'Data'
-					},
-					{
-						fieldname: 'comment', label: 'Comment',
-						reqd: 1, fieldtype: 'Text'
-					},
-					{
-						fieldname: 'post_comment', label: 'Post Comment',
-						fieldtype: 'Button'
-					},
-				],
-			});
-			
-			erpnext.blog.comment_dialog = d;
+	$(".add-comment").click(function() {
+		$("#comment-form").toggle();
+		$("#comment-form input, #comment-form, textarea").val("");
+	})
+	$("#submit-comment").click(function() {
+		var args = {
+			comment_by_fullname: $("[name='comment_by_fullname']").val(),
+			comment_by: $("[name='comment_by']").val(),
+			comment: $("[name='comment']").val(),
+			cmd: "website.helpers.blog.add_comment",
+			comment_doctype: "Blog",
+			comment_docname: "{{ name }}",
+			page_name: "{{ page_name }}"
 		}
 		
-		erpnext.blog.comment_dialog.fields_dict.post_comment
-				.input.onclick = function() {
-			erpnext.blog.add_comment(wrapper);
+		$("#comment-form .alert").toggle(false);
+		
+		if(!args.comment_by_fullname || !args.comment_by || !args.comment) {
+			$("#comment-form .alert")
+				.html("All fields are necessary to submit the comment.")
+				.toggle(true);
+			return false;
 		}
 		
-		erpnext.blog.comment_dialog.show();
-	});
-
-}
-
-erpnext.blog.add_comment = function(wrapper) {
-	var args = erpnext.blog.comment_dialog.get_values();
-
-	if(!args) return;
-	
-	args.comment_doctype = 'Blog';
-	args.comment_docname = '{{ name }}';
-	args.page_name = '{{ page_name }}';
-	
-	wn.call({
-		method: 'website.helpers.blog.add_comment',
-		args: args,
-		btn: this,
-		callback: function(r) {
-			if(!r.exc) {
-				erpnext.blog.add_comment_to_page(wrapper, r.message);
-				erpnext.blog.comment_dialog.hide();
+		
+		$.ajax({
+			method: "POST",
+			url: "server.py",
+			data: args,
+			dataType: "json",
+			success: function(data) {
+				if(data.exc) {
+					$("#comment-form .alert")
+						.html(data.exc)
+						.toggle(true)
+				} else {
+					$(data.message).appendTo(".blog-comments");
+					$(".no_comment").toggle(false);
+					$(".add-comment").toggle(false);
+					$("#comment-form")
+						.replaceWith("<div class='alert'>Thank you for your comment!</div>")
+				}
 			}
-		}
-	});
-}
-
-erpnext.blog.add_comment_to_page = function(wrapper, comment) {
-	$blog_comments = $(wrapper).find('.blog-comments');
-	$comment_rows = $blog_comments.find('.comment-row');
-	
-	if ($comment_rows.length) {
-		$blog_comments.append(comment);
-	} else {
-		$blog_comments.append(comment);
-	}
-	
-	erpnext.blog.toggle_no_result(wrapper);
-	erpnext.blog.toggle_add_comment_btn(wrapper);
-}
-
-erpnext.blog.toggle_add_comment_btn = function(wrapper) {
-	var $wrapper = $(wrapper);
-	if ($wrapper.find('.blog-comments .comment-row').length > 50) {
-		var $comment_btn = $wrapper.find('button.add-comment');
-		$comment_btn.addClass('hide');
+		})
 		
-		// show comments are close
-		$wrapper.find('.blog-comments').append("\
-			<div class=\"help\"> \
-				<p>Comments Closed</p> \
-				<br /> \
-			</div>");
-	}
-}
\ No newline at end of file
+		return false;
+	})
+})
\ No newline at end of file
diff --git a/website/templates/pages/blog.html b/website/templates/pages/blog.html
index c4a5dad..75681d5 100644
--- a/website/templates/pages/blog.html
+++ b/website/templates/pages/blog.html
@@ -2,7 +2,6 @@
 
 {% block javascript %}
 	{% include "js/blog.js" %}
-	{% include "js/blog_subscribe.js" %}
 {% endblock %}
 
 {% block css %}
@@ -18,9 +17,12 @@
 			<div class="layout-main">
 				<h1>Blog</h1>
 				<br>
-				<div id="blog-list">
+				<div id="blog-list" style="min-height: 400px;">
 					<!-- blog list will be generated dynamically -->
 				</div>
+				<div style="text-align: center;">
+					<button id="next-page" class="btn">More...</button>
+				</div>
 			</div>
 		</div>
 	</div>