added products, custom pages and footer
diff --git a/erpnext/home/page/event_updates/event_updates.js b/erpnext/home/page/event_updates/event_updates.js
index faf9a75..1ce83df 100644
--- a/erpnext/home/page/event_updates/event_updates.js
+++ b/erpnext/home/page/event_updates/event_updates.js
@@ -477,10 +477,6 @@
 	});
 }
 
-FeedList.prototype.after_run = function() {
-	this.list.has_data() ? $dh(this.no_result) : $ds(this.no_result)
-}
-
 FeedList.prototype.render_feed = function(parent, data) {
 	new FeedItem(parent, data, this);
 }
diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py
index 603d8f3..1bdbcb4 100644
--- a/erpnext/startup/event_handlers.py
+++ b/erpnext/startup/event_handlers.py
@@ -41,7 +41,8 @@
 	
 	if webnotes.session['user']=='Guest':
 		bootinfo['topbar'] = webnotes.model.doc.getsingle('Top Bar Settings')
-		bootinfo['topbaritems'] = webnotes.conn.sql("""select label, std_page, custom_page, parent_label
+		bootinfo['topbaritems'] = webnotes.conn.sql("""select label, std_page, custom_page, 
+			parent_label, parentfield
 			from `tabTop Bar Item` where parent='Top Bar Settings' order by idx asc""", as_dict=1)
 	else:	
 		bootinfo['letter_heads'] = get_letter_heads()
diff --git a/erpnext/startup/modules.js b/erpnext/startup/modules.js
index b5356d9..9503dbe 100644
--- a/erpnext/startup/modules.js
+++ b/erpnext/startup/modules.js
@@ -266,11 +266,14 @@
 SidebarItem.prototype.show_section = function(sec_type) {
 	var me = this;
 	var label = this.det.module_label + ' ' + sec_type;
-	var type_map = {'Reports':'Reports', 'Custom Reports':'Custom Reports', 'Pages':'Tools', 'Single DocType':'Tools', 'Setup Forms':'Tools'}
+	var type_map = {'Reports':'Reports', 'Custom Reports':'Custom Reports', 
+		'Pages':'Tools', 'Single DocType':'Tools', 'Setup Forms':'Tools'}
+
 
 	if(page_body.pages[label]) {
 		loadpage(label, null, 1);
 	} else {
+		
 		// make the reports page
 		var page = page_body.add_page(label);
 		this.wrapper = $a(page,'div','layout_wrapper');
@@ -373,3 +376,6 @@
 	$c_obj('Home Control', 'get_module_order', '', callback)
 
 }
+
+
+
diff --git a/erpnext/startup/modules_new.js b/erpnext/startup/modules_new.js
new file mode 100644
index 0000000..5f912b0
--- /dev/null
+++ b/erpnext/startup/modules_new.js
@@ -0,0 +1,36 @@
+// Tools Page
+erpnext.ListPage = Class.extend({
+	init: function(opts) {
+		var me = this;
+		this.opts = opts;
+		this.page = page_body.add_page[opts.title];
+		this.page.wrapper = $a(this.page, 'div', 'layout_wrapper');
+		this.page.head = new PageHeading(this.wrapper, this.title)
+		this.page.list = new wn.widgets.Listing({
+			parent: this.page.wrapper,
+			query: opts.query,
+			render:row: opts.render_row
+		});
+	},
+	show: function() {
+		if(this.first) {
+			this.page.list.run();
+			this.first = false;
+		}
+		page_body.change_to(this.opts.title);
+	}
+});
+
+erpnext.ToolsPage = erpnext.ListPage.extend({
+	init: function(opts) {
+		this._super({
+			title: opts.module + ' Settings',
+			query: repl('select name, description from tabDocType where \
+				module=%(module)s and ifnull(issingle,0)=1 order by name asc', opts),
+			render_row: function(parent, data) {
+				parent.innerHTML = repl('<a href="#!Form/%(name)s/%(name)s">%(name)s</a>\
+					<div class="comment">%(description)s</div>', data)
+			}
+		})
+	}
+});
\ No newline at end of file
diff --git a/erpnext/startup/startup.js b/erpnext/startup/startup.js
index f97eb39..70dcfc4 100644
--- a/erpnext/startup/startup.js
+++ b/erpnext/startup/startup.js
@@ -28,13 +28,13 @@
 		wn.require('erpnext/startup/toolbar.js');
 		erpnext.toolbar.setup();
 		wn.require('erpnext/startup/feature_setup.js');
+
+		// border to the body
+		// ------------------
+		$('footer').html('<div class="erpnext-footer">\
+			Powered by <a href="https://erpnext.com">ERPNext</a></div>');
 	}
 	
-	// border to the body
-	// ------------------
-	$('footer').html('<div class="erpnext-footer">\
-		Powered by <a href="https://erpnext.com">ERPNext</a></div>');
-
 	$('#startup_div').toggle(false);
 }
 
diff --git a/erpnext/stock/doctype/item/item.txt b/erpnext/stock/doctype/item/item.txt
index 28d0c7a..ec3b160 100644
--- a/erpnext/stock/doctype/item/item.txt
+++ b/erpnext/stock/doctype/item/item.txt
@@ -5,14 +5,14 @@
 	{
 		'creation': '2010-08-08 17:09:05',
 		'docstatus': 0,
-		'modified': '2012-01-30 12:10:37',
+		'modified': '2012-01-30 16:46:37',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
 
 	# These values are common for all DocType
 	{
-		'_last_update': '1327904359',
+		'_last_update': '1327905637',
 		'allow_attach': 1,
 		'allow_trash': 1,
 		'autoname': 'field:item_code',
@@ -29,7 +29,7 @@
 		'show_in_menu': 0,
 		'subject': '%(item_name)s',
 		'tag_fields': 'item_group',
-		'version': 164
+		'version': 165
 	},
 
 	# These values are common for all DocField
@@ -495,98 +495,6 @@
 
 	# DocField
 	{
-		'doctype': 'DocField',
-		'fieldtype': 'Section Break',
-		'label': 'Website Details',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'colour': 'White:FFF',
-		'description': 'Check here to show this item on your website under "Products"',
-		'doctype': 'DocField',
-		'fieldname': 'show_in_website',
-		'fieldtype': 'Check',
-		'label': 'Show in website',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'colour': 'White:FFF',
-		'description': 'Small image shown in listings (100px width) (Attach first)',
-		'doctype': 'DocField',
-		'fieldname': 'thumbnail_image',
-		'fieldtype': 'Select',
-		'label': 'Thumbnail Image',
-		'options': 'attach_files:',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'colour': 'White:FFF',
-		'description': 'Small image shown product page (300px width) (Attach first)',
-		'doctype': 'DocField',
-		'fieldname': 'full_image',
-		'fieldtype': 'Select',
-		'label': 'Full Image',
-		'options': 'attach_files:',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldtype': 'Column Break',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'colour': 'White:FFF',
-		'description': 'Price list for your website (leave blank if you do not want to show the price)',
-		'doctype': 'DocField',
-		'fieldname': 'website_price_list',
-		'fieldtype': 'Link',
-		'label': 'Website Price List',
-		'options': 'Price List',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'colour': 'White:FFF',
-		'description': 'Enter your shipping warehouse if you want "In Stock" or "Out of Stock" to appear on your website',
-		'doctype': 'DocField',
-		'fieldname': 'website_warehouse',
-		'fieldtype': 'Link',
-		'label': 'Website Warehouse',
-		'options': 'Warehouse',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldtype': 'Section Break',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'colour': 'White:FFF',
-		'description': 'Detailed description of your product for your website. Formatted in html/markdown format.',
-		'doctype': 'DocField',
-		'fieldname': 'website_description',
-		'fieldtype': 'Code',
-		'label': 'Website Description',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
 		'colour': 'White:FFF',
 		'doctype': 'DocField',
 		'fieldtype': 'Section Break',
diff --git a/erpnext/website/Module Def/Website/Website.txt b/erpnext/website/Module Def/Website/Website.txt
index fa35cde..8ac31c7 100644
--- a/erpnext/website/Module Def/Website/Website.txt
+++ b/erpnext/website/Module Def/Website/Website.txt
@@ -5,7 +5,7 @@
 	{
 		'creation': '2012-01-23 17:05:32',
 		'docstatus': 0,
-		'modified': '2012-01-30 12:19:11',
+		'modified': '2012-01-31 15:19:28',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
@@ -54,6 +54,22 @@
 
 	# Module Def Item
 	{
+		'display_name': 'Web Page',
+		'doc_name': 'Web Page',
+		'doc_type': 'Forms',
+		'doctype': 'Module Def Item'
+	},
+
+	# Module Def Item
+	{
+		'display_name': 'Product',
+		'doc_name': 'Product',
+		'doc_type': 'Forms',
+		'doctype': 'Module Def Item'
+	},
+
+	# Module Def Item
+	{
 		'display_name': 'Blog',
 		'doc_name': 'Blog',
 		'doc_type': 'Forms',
diff --git a/erpnext/website/css/website.css b/erpnext/website/css/website.css
index 5afb47d..c653c3b 100644
--- a/erpnext/website/css/website.css
+++ b/erpnext/website/css/website.css
@@ -3,6 +3,10 @@
 	margin: auto;
 }
 
+footer {
+	width: 900px;
+	margin: auto;
+}
 header .topbar .container {
 	width: 900px;
 	margin: auto;
@@ -25,4 +29,42 @@
 	margin-right: 15px;
 	color: #606060;
 	overflow-x: hidden;
+}
+
+.web-footer {
+	text-align: center;
+	color: #777;
+	margin: 10px;
+	line-height: 1.7;
+}
+
+.web-footer div, .web-footer a {
+	font-size: 11px;
+}
+
+.web-footer-menu {
+	margin-bottom: 7px;
+}
+.web-footer a, .web-footer a:visited {
+	color: #777;
+}
+
+.web-footer a:hover {
+	background-color: #777;
+	color: #fff;
+}
+
+.web-footer-menu ul {
+	list-style: none;
+	margin: 0px;
+}
+
+.web-footer-menu ul li {
+	display: inline;
+	padding: 2px 15px;
+	border-right: 1px solid #999;
+}
+
+.web-footer-menu ul li:last-child {
+	border-right: 0px solid #777;
 }
\ No newline at end of file
diff --git a/erpnext/website/doctype/blog/blog.py b/erpnext/website/doctype/blog/blog.py
index 1545741..e9c0d74 100644
--- a/erpnext/website/doctype/blog/blog.py
+++ b/erpnext/website/doctype/blog/blog.py
@@ -5,6 +5,7 @@
 """
 
 import webnotes
+import website.utils
 
 class DocType():
 	def __init__(self, d, dl):
@@ -12,27 +13,11 @@
 		
 	def autoname(self):
 		"""save file by its name"""
-		import re
-		self.doc.name = re.sub('[~!@#$%^&*()<>,."\']', '', self.doc.title.lower())
-		self.doc.name = '-'.join(self.doc.name.split()[:4])
-		if webnotes.conn.sql("""select name from tabBlog where name=%s""", self.doc.name) or \
-			webnotes.conn.sql("""select name from tabPage where name=%s""", self.doc.name):
-			webnotes.msgprint("Another page with similar title exists, please change the title",\
-				raise_exception=1)
+		self.doc.name = website.utils.page_name(self.doc.title)
 	
 	def on_update(self):
-		"""write/update 'Page' with the blog"""
-		from webnotes.model.doc import Document
-		
-		if webnotes.conn.sql("""select name from tabPage where name=%s""", self.doc.name):
-			p = Document('Page', self.doc.name)
-		else:
-			p = Document('Page')
-			
-		p.title = self.doc.title
-		p.name = p.page_name = self.doc.name
-		p.module = 'Website'
-		p.standard = 'No'
+		"""write/update 'Page' with the blog"""		
+		p = website.utils.add_page(self.doc.title)
 		
 		from jinja2 import Template
 		import markdown2
@@ -48,11 +33,6 @@
 		
 		p.save()
 		
-		# add guest access
-		if not webnotes.conn.sql("""select parent from `tabPage Role`
-			where role='Guest' and parent=%s""", self.doc.name):
-			d = Document('Page Role')
-			d.parent = self.doc.name
-			d.role = 'Guest'
-			d.save()
+		website.utils.add_guest_access_to_page(p.name)
+
 			
\ No newline at end of file
diff --git a/erpnext/website/doctype/product/__init__.py b/erpnext/website/doctype/product/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/website/doctype/product/__init__.py
diff --git a/erpnext/website/doctype/product/product.js b/erpnext/website/doctype/product/product.js
new file mode 100644
index 0000000..c0b507e
--- /dev/null
+++ b/erpnext/website/doctype/product/product.js
@@ -0,0 +1,6 @@
+$.extend(cur_frm.cscript, {
+	onload: function() {
+		cur_frm.add_fetch('item', 'description', 'short_description');
+		cur_frm.add_fetch('item', 'item_name', 'title');
+	}
+});
\ No newline at end of file
diff --git a/erpnext/website/doctype/product/product.py b/erpnext/website/doctype/product/product.py
new file mode 100644
index 0000000..935d762
--- /dev/null
+++ b/erpnext/website/doctype/product/product.py
@@ -0,0 +1,27 @@
+class DocType:
+	def __init__(self, d, dl):
+		self.doc, self.doclist = d, dl
+		
+	def validate(self):
+		"""make page for this product"""
+		import website.utils
+		
+		p = website.utils.add_page("Product " + self.doc.title)
+		
+		from jinja2 import Template
+		import markdown2
+		import os
+		
+		self.doc.long_description_html = markdown2.markdown(self.doc.long_description or '')
+		
+		with open(os.path.join(os.path.dirname(__file__), 'template.html'), 'r') as f:
+			p.content = Template(f.read()).render(doc=self.doc)
+		
+		with open(os.path.join(os.path.dirname(__file__), 'product_page.js'), 'r') as f:
+			p.script = Template(f.read()).render(doc=self.doc)
+		
+		p.save()
+		
+		website.utils.add_guest_access_to_page(p.name)
+		self.doc.page_name = p.name
+		del self.doc.fields['long_description_html']
\ No newline at end of file
diff --git a/erpnext/website/doctype/product/product.txt b/erpnext/website/doctype/product/product.txt
new file mode 100644
index 0000000..fac4cfb
--- /dev/null
+++ b/erpnext/website/doctype/product/product.txt
@@ -0,0 +1,251 @@
+# DocType, Product
+[
+
+	# These values are common in all dictionaries
+	{
+		'creation': '2012-01-30 16:21:29',
+		'docstatus': 0,
+		'modified': '2012-01-31 13:46:23',
+		'modified_by': 'Administrator',
+		'owner': 'Administrator'
+	},
+
+	# These values are common for all DocType
+	{
+		'_last_update': '1327995660',
+		'allow_attach': 1,
+		'autoname': 'field:item',
+		'colour': 'White:FFF',
+		'description': 'A Product is shown on the website and is linked to an item.',
+		'doctype': 'DocType',
+		'max_attachments': 5,
+		'module': 'Website',
+		'name': '__common__',
+		'section_style': 'Simple',
+		'show_in_menu': 0,
+		'version': 10
+	},
+
+	# These values are common for all DocField
+	{
+		'doctype': 'DocField',
+		'name': '__common__',
+		'parent': 'Product',
+		'parentfield': 'fields',
+		'parenttype': 'DocType'
+	},
+
+	# These values are common for all DocPerm
+	{
+		'doctype': 'DocPerm',
+		'name': '__common__',
+		'parent': 'Product',
+		'parentfield': 'permissions',
+		'parenttype': 'DocType',
+		'read': 1,
+		'role': 'Website Manager'
+	},
+
+	# DocType, Product
+	{
+		'doctype': 'DocType',
+		'name': 'Product'
+	},
+
+	# DocPerm
+	{
+		'create': 1,
+		'doctype': 'DocPerm',
+		'permlevel': 0,
+		'write': 1
+	},
+
+	# DocPerm
+	{
+		'doctype': 'DocPerm',
+		'permlevel': 1
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'doctype': 'DocField',
+		'fieldname': 'item',
+		'fieldtype': 'Link',
+		'label': 'Item',
+		'options': 'Item',
+		'permlevel': 0,
+		'reqd': 1
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'title',
+		'fieldtype': 'Link',
+		'label': 'Title',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'published',
+		'fieldtype': 'Check',
+		'label': 'Published',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'description': 'Select Price List for the web. Leave blank to hide price.',
+		'doctype': 'DocField',
+		'fieldname': 'price_list',
+		'fieldtype': 'Link',
+		'label': 'Price List',
+		'options': 'Price List',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'description': 'Select shipping warehouse to show "In Stock" or "Out of Stock". To hide, leave blank',
+		'doctype': 'DocField',
+		'fieldname': 'warehouse',
+		'fieldtype': 'Link',
+		'label': 'Warehouse',
+		'options': 'Warehouse',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldtype': 'Column Break',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'description': 'Image for listing (Width: 100px) (Attach First)',
+		'doctype': 'DocField',
+		'fieldname': 'thumbnail_image',
+		'fieldtype': 'Select',
+		'label': 'Thumbnail Image',
+		'options': 'attach_files:',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'description': 'Image for listing (Width: 300px) (Attach First)',
+		'doctype': 'DocField',
+		'fieldname': 'full_image',
+		'fieldtype': 'Select',
+		'label': 'Full Image',
+		'options': 'attach_files:',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'doctype': 'DocField',
+		'fieldname': 'short_description',
+		'fieldtype': 'Text',
+		'label': 'Short Description',
+		'permlevel': 0,
+		'reqd': 1
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldtype': 'Section Break',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'description': 'Full description (formatted as markdown)',
+		'doctype': 'DocField',
+		'fieldname': 'long_description',
+		'fieldtype': 'Code',
+		'label': 'Long Description',
+		'permlevel': 0,
+		'reqd': 0
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldtype': 'Section Break',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'page_name',
+		'fieldtype': 'Data',
+		'label': 'Page Name',
+		'permlevel': 1
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'doctype': 'DocField',
+		'fieldname': 'price',
+		'fieldtype': 'Currency',
+		'hidden': 0,
+		'label': 'Price',
+		'permlevel': 1
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'doctype': 'DocField',
+		'fieldname': 'sales',
+		'fieldtype': 'Currency',
+		'label': 'Sales',
+		'permlevel': 1
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'stock',
+		'fieldtype': 'Currency',
+		'label': 'Stock',
+		'permlevel': 1
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'currency',
+		'fieldtype': 'Link',
+		'label': 'Currency',
+		'options': 'Currency',
+		'permlevel': 1
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'file_list',
+		'fieldtype': 'Text',
+		'hidden': 1,
+		'label': 'File List',
+		'no_copy': 1,
+		'permlevel': 0,
+		'print_hide': 1
+	}
+]
\ No newline at end of file
diff --git a/erpnext/website/doctype/product/product_page.js b/erpnext/website/doctype/product/product_page.js
new file mode 100644
index 0000000..7d031ef
--- /dev/null
+++ b/erpnext/website/doctype/product/product_page.js
@@ -0,0 +1,13 @@
+wn.require('erpnext/website/js/product_category.js');
+
+pscript["onload_{{ doc.page_name }}"] = function(wrapper) {
+	erpnext.make_product_categories(wrapper);
+	$(wrapper).find('.product-inquiry').click(function() {
+		loadpage('contact', function() {
+			$('#content-contact-us [name="contact-message"]').val("Hello,\n\n\
+			Please send me more information on {{ doc.title }} (Item Code:{{ doc.item }})\n\n\
+			My contact details are:\n\nThank you!\
+			");
+		})
+	})
+}
\ No newline at end of file
diff --git a/erpnext/website/doctype/product/template.html b/erpnext/website/doctype/product/template.html
new file mode 100644
index 0000000..8c7f918
--- /dev/null
+++ b/erpnext/website/doctype/product/template.html
@@ -0,0 +1,28 @@
+<div class="layout_wrapper">
+	<div class="web-content" id="content-product-{{ doc.name }}">
+		<h1>{{ doc.title }}</h1>
+		<div class="web-main-section">
+			<div style="float: left;">
+				<image src="files/{{ doc.full_image }}" style="width: 300px; 
+					margin-left: 15px;" />
+				{{ doc.long_description_html }}
+				<button class="btn primary product-inquiry" 
+					data-product="{{ doc.name }}"
+					data-description="{{ doc.short_description }}">Send Inquiry</button>
+			</div>
+		</div>
+		<div class="web-side-section">
+			<div class="info-box round">
+				<p><b>Item Code:</b> {{ doc.item }}</p>
+				<p>{{ doc.short_description }}</p>
+				<p><button class="btn primary product-inquiry" 
+					data-product="{{ doc.name }}"
+					data-description="{{ doc.short_description }}">Send Inquiry</button>
+				</p>
+			</div>
+			<br>
+			<h4>More Categories</h4>
+		</div>
+		<div style="clear: both"></div>
+	</div>
+</div>
\ No newline at end of file
diff --git a/erpnext/website/doctype/products_settings/products_settings.py b/erpnext/website/doctype/products_settings/products_settings.py
new file mode 100644
index 0000000..195f37f
--- /dev/null
+++ b/erpnext/website/doctype/products_settings/products_settings.py
@@ -0,0 +1,15 @@
+import webnotes
+
+class DocType:
+	def __init__(self, d, dl):
+		self.doc, self.doclist = d, dl
+	
+	def on_update(self):
+		tmp = None
+		for d in self.doclist:
+			if d.doctype=="Product Group":
+				import json
+				tmp = json.dumps({"item_group": d.item_group, "label":d.label})
+				break
+				
+		webnotes.conn.set_default("default_product_category", tmp)
\ No newline at end of file
diff --git a/erpnext/website/doctype/top_bar_item/top_bar_item.txt b/erpnext/website/doctype/top_bar_item/top_bar_item.txt
index e352ef5..410352c 100644
--- a/erpnext/website/doctype/top_bar_item/top_bar_item.txt
+++ b/erpnext/website/doctype/top_bar_item/top_bar_item.txt
@@ -5,7 +5,7 @@
 	{
 		'creation': '2012-01-24 10:24:19',
 		'docstatus': 0,
-		'modified': '2012-01-24 10:24:19',
+		'modified': '2012-01-30 14:14:48',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
@@ -19,7 +19,7 @@
 		'name': '__common__',
 		'section_style': 'Simple',
 		'show_in_menu': 0,
-		'version': 1
+		'version': 2
 	},
 
 	# These values are common for all DocField
@@ -52,7 +52,7 @@
 		'fieldname': 'std_page',
 		'fieldtype': 'Select',
 		'label': 'Std Page',
-		'options': 'Home\nAbout\nContact\nProduct\nCustomer\nBlog\nPartner\nCareer\nCustom'
+		'options': 'Home\nAbout\nContact\nProducts\nBlog\nCustom'
 	},
 
 	# DocField
diff --git a/erpnext/website/doctype/top_bar_settings/top_bar_settings.txt b/erpnext/website/doctype/top_bar_settings/top_bar_settings.txt
index d651461..ad9a158 100644
--- a/erpnext/website/doctype/top_bar_settings/top_bar_settings.txt
+++ b/erpnext/website/doctype/top_bar_settings/top_bar_settings.txt
@@ -5,14 +5,14 @@
 	{
 		'creation': '2012-01-24 10:21:41',
 		'docstatus': 0,
-		'modified': '2012-01-24 10:45:02',
+		'modified': '2012-01-31 15:55:34',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
 
 	# These values are common for all DocType
 	{
-		'_last_update': '1327380941',
+		'_last_update': '1327382102',
 		'allow_attach': 1,
 		'colour': 'White:FFF',
 		'doctype': 'DocType',
@@ -23,7 +23,7 @@
 		'name': '__common__',
 		'section_style': 'Simple',
 		'show_in_menu': 0,
-		'version': 3
+		'version': 4
 	},
 
 	# These values are common for all DocField
@@ -69,6 +69,13 @@
 
 	# DocField
 	{
+		'doctype': 'DocField',
+		'fieldtype': 'Section Break',
+		'label': 'Top Bar'
+	},
+
+	# DocField
+	{
 		'colour': 'White:FFF',
 		'description': 'Brand is what appears on the top-right of the toolbar. If it is an image, make sure it\nhas a transparent background and use the &lt;img /&gt; tag',
 		'doctype': 'DocField',
@@ -89,6 +96,38 @@
 	# DocField
 	{
 		'doctype': 'DocField',
+		'fieldtype': 'Section Break',
+		'label': 'Footer'
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'address',
+		'fieldtype': 'Text',
+		'label': 'Address'
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'copyright',
+		'fieldtype': 'Data',
+		'label': 'Copyright'
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'footer_items',
+		'fieldtype': 'Table',
+		'label': 'Footer Items',
+		'options': 'Top Bar Item'
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
 		'fieldname': 'file_list',
 		'fieldtype': 'Text',
 		'hidden': 1,
diff --git a/erpnext/website/doctype/web_page/__init__.py b/erpnext/website/doctype/web_page/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/website/doctype/web_page/__init__.py
diff --git a/erpnext/website/doctype/web_page/template.html b/erpnext/website/doctype/web_page/template.html
new file mode 100644
index 0000000..8b0049b
--- /dev/null
+++ b/erpnext/website/doctype/web_page/template.html
@@ -0,0 +1,13 @@
+<div class="layout_wrapper">
+	<div class="web-content" id="content-{{ doc.name }}">
+		<h1>{{ doc.title }}</h1>
+		<br>
+		<div class="web-main-section">
+			{{ doc.main_section_html }}
+		</div>
+		<div class="web-side-section">
+			{{ doc.side_section_html }}
+		</div>
+		<div style="clear: both"></div>
+	</div>
+</div>
\ No newline at end of file
diff --git a/erpnext/website/doctype/web_page/web_page.py b/erpnext/website/doctype/web_page/web_page.py
new file mode 100644
index 0000000..d2ad6d3
--- /dev/null
+++ b/erpnext/website/doctype/web_page/web_page.py
@@ -0,0 +1,30 @@
+import webnotes
+import website.utils
+
+class DocType:
+	def __init__(self, d, dl):
+		self.doc, self.doclist = d, dl
+	
+	def autoname(self):
+		"""name from title"""
+		self.doc.name = website.utils.page_name(self.doc.title)
+
+	def validate(self):
+		"""make page for this product"""					
+		p = website.utils.add_page(self.doc.title)
+		
+		from jinja2 import Template
+		import os
+	
+		website.utils.markdown(self.doc, ['main_section', 'side_section'])
+		
+		with open(os.path.join(os.path.dirname(__file__), 'template.html'), 'r') as f:
+			p.content = Template(f.read()).render(doc=self.doc)
+
+		p.save()
+		
+		website.utils.add_guest_access_to_page(p.name)
+		
+		del self.doc.fields['main_section_html']
+		del self.doc.fields['side_section_html']
+		
\ No newline at end of file
diff --git a/erpnext/website/doctype/web_page/web_page.txt b/erpnext/website/doctype/web_page/web_page.txt
new file mode 100644
index 0000000..aa08a8e
--- /dev/null
+++ b/erpnext/website/doctype/web_page/web_page.txt
@@ -0,0 +1,110 @@
+# DocType, Web Page
+[
+
+	# These values are common in all dictionaries
+	{
+		'creation': '2012-01-31 15:18:49',
+		'docstatus': 0,
+		'modified': '2012-01-31 15:48:50',
+		'modified_by': 'Administrator',
+		'owner': 'Administrator'
+	},
+
+	# These values are common for all DocType
+	{
+		'_last_update': '1328003330',
+		'allow_attach': 1,
+		'colour': 'White:FFF',
+		'description': 'A custom page is a simple page with the layout - headline, main section, side section\n\nEditing:\n\n- Editing is in [markdown format](http://daringfireball.net/projects/markdown/syntax)\n- You can also add images and embed html code\n\nAccessing the page:\n\n- The page can be accessed as #![page-name] after the main url\n\nIdeal for pages like FAQ, Terms, Help etc.\n\n',
+		'doctype': 'DocType',
+		'max_attachments': 5,
+		'module': 'Website',
+		'name': '__common__',
+		'section_style': 'Simple',
+		'show_in_menu': 0,
+		'version': 3
+	},
+
+	# These values are common for all DocField
+	{
+		'doctype': 'DocField',
+		'name': '__common__',
+		'parent': 'Web Page',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0
+	},
+
+	# These values are common for all DocPerm
+	{
+		'doctype': 'DocPerm',
+		'name': '__common__',
+		'parent': 'Web Page',
+		'parentfield': 'permissions',
+		'parenttype': 'DocType',
+		'read': 1,
+		'role': 'Website Manager'
+	},
+
+	# DocType, Web Page
+	{
+		'doctype': 'DocType',
+		'name': 'Web Page'
+	},
+
+	# DocPerm
+	{
+		'create': 1,
+		'doctype': 'DocPerm',
+		'permlevel': 0,
+		'write': 1
+	},
+
+	# DocPerm
+	{
+		'doctype': 'DocPerm',
+		'permlevel': 1
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'description': 'Title / headline of your page',
+		'doctype': 'DocField',
+		'fieldname': 'title',
+		'fieldtype': 'Data',
+		'label': 'Title',
+		'reqd': 1
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'description': 'Content in markdown format that appears on the main side of your page',
+		'doctype': 'DocField',
+		'fieldname': 'main_section',
+		'fieldtype': 'Code',
+		'label': 'Main Section'
+	},
+
+	# DocField
+	{
+		'colour': 'White:FFF',
+		'description': 'Content in markdown format that appears on the right side',
+		'doctype': 'DocField',
+		'fieldname': 'side_section',
+		'fieldtype': 'Code',
+		'label': 'Side Section'
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'file_list',
+		'fieldtype': 'Text',
+		'hidden': 1,
+		'label': 'File List',
+		'no_copy': 1,
+		'print_hide': 1
+	}
+]
\ No newline at end of file
diff --git a/erpnext/website/js/product_category.js b/erpnext/website/js/product_category.js
new file mode 100644
index 0000000..04b7e71
--- /dev/null
+++ b/erpnext/website/js/product_category.js
@@ -0,0 +1,22 @@
+// make sidelisting of categories
+erpnext.product_item_group = {}
+
+erpnext.make_product_categories = function(wrapper) {
+	wrapper.category_list = new wn.widgets.Listing({
+		parent: $(wrapper).find('.web-side-section').get(0),
+		query: 'select label, count(t2.name) as items, t1.item_group \
+			from `tabProduct Group` t1, `tabItem` t2\
+			where t1.parent="Products Settings" \
+			and t2.item_group = t1.item_group \
+			and ifnull(t2.show_in_website, 0)=1 \
+			group by t2.item_group \
+			order by t1.idx desc',
+		hide_refresh: true,
+		render_row: function(parent, data) {
+			parent.innerHTML = repl('<a href="#!products/%(label)s">%(label)s</a> (%(items)s)', 
+				data);
+			erpnext.product_item_group[data.label] = data.item_group;
+		}
+	});
+	wrapper.category_list.run();	
+}
diff --git a/erpnext/website/js/topbar.js b/erpnext/website/js/topbar.js
index 788ed62..d7cba89 100644
--- a/erpnext/website/js/topbar.js
+++ b/erpnext/website/js/topbar.js
@@ -35,8 +35,8 @@
 		var items = wn.boot.topbaritems
 		for(var i=0;i<items.length;i++) {
 			var item = items[i];
-			if(!item.parent_label) {
-				item.route = item.std_page.toLowerCase();
+			if(!item.parent_label && item.parentfield=='top_bar_items') {
+				item.route = item.std_page ? item.std_page.toLowerCase() : item.custom_page;
 				$('header .nav:first').append(repl('<li><a href="#!%(route)s" \
 					data-label="%(label)s">%(label)s</a></li>', item))
 			}
@@ -44,4 +44,31 @@
 	}
 });
 
-erpnext.topbar.topbar = new erpnext.topbar.TopBar();
\ No newline at end of file
+erpnext.topbar.topbar = new erpnext.topbar.TopBar();
+
+// footer
+erpnext.Footer = Class.extend({
+	init: function() {
+		$('footer').html(repl('<div class="web-footer">\
+			<div class="web-footer-menu"><ul></ul></div>\
+			<div class="web-footer-address">%(address)s</div>\
+			<div class="web-footer-copyright">&copy; %(copyright)s</div>\
+			<div class="web-footer-powered">Powered by \
+				<a href="https://erpnext.com">erpnext.com</a></div>\
+		</div>', wn.boot.topbar));
+		this.make_items();
+	},
+	make_items: function() {
+		var items = wn.boot.topbaritems
+		for(var i=0;i<items.length;i++) {
+			var item = items[i];
+			if(!item.parent_label && item.parentfield=='footer_items') {
+				item.route = item.std_page ? item.std_page.toLowerCase() : item.custom_page;
+				$('.web-footer-menu ul').append(repl('<li><a href="#!%(route)s" \
+					data-label="%(label)s">%(label)s</a></li>', item))
+			}
+		}
+	}
+});
+
+erpnext.footer = new erpnext.Footer();
\ No newline at end of file
diff --git a/erpnext/website/page/products/products.html b/erpnext/website/page/products/products.html
index 57f1354..4ef5bf4 100644
--- a/erpnext/website/page/products/products.html
+++ b/erpnext/website/page/products/products.html
@@ -1,6 +1,6 @@
 <div class="layout_wrapper" id="content-products">
 	<div class="web-main-section">
-		<h2 class="products-category"></h2>
+		<h1 class="products-category"></h1>
 		<div class="products-search">
 			<input name="products-search" /><button class="btn">Search</button>
 		</div>
@@ -8,4 +8,5 @@
 	<div class="web-side-section">
 		<h3>Categories</h3>
 	</div>
+	<div style="clear:both;">
 </div>
\ No newline at end of file
diff --git a/erpnext/website/page/products/products.js b/erpnext/website/page/products/products.js
index 993397d..0e7dec5 100644
--- a/erpnext/website/page/products/products.js
+++ b/erpnext/website/page/products/products.js
@@ -1,11 +1,84 @@
 erpnext.products = {}
 
+wn.require('erpnext/website/js/product_category.js');
+
 pscript.onload_products = function(wrapper) {
+	sys_defaults.default_product_category = JSON.parse(sys_defaults.default_product_category);
+	erpnext.products.wrapper = wrapper;	
+
+	// make lists
+	erpnext.make_product_categories(wrapper);
+	erpnext.products.make_product_list(wrapper);
+	
+	// button
+	$(wrapper).find('.products-search .btn').click(function() {
+		wrapper.mainlist.run();
+	});
+	
+	$(wrapper).find('.products-search input').keypress(function(ev) {
+		if(ev.which==13) $(wrapper).find('.products-search .btn').click();
+	});
+}
+
+pscript.onshow_products = function(wrapper) {
+	// show default product category
+	erpnext.products.set_group();
+}
+
+erpnext.products.get_group = function() {
+	var route = window.location.hash.split('/');
+	if(route.length>1) {
+		// from url
+		var grp = erpnext.product_item_group[route[1]];
+		var label = route[1];
+	} else {
+		// default
+		var grp = sys_defaults.default_product_category.item_group;
+		var label = sys_defaults.default_product_category.label;
+	}
+	erpnext.products.cur_group = grp;
+	return {grp:grp, label:label};
+}
+
+erpnext.products.make_product_list = function(wrapper) {
+	wrapper.mainlist = new wn.widgets.Listing({
+		parent: $(wrapper).find('.web-main-section').get(0),
+		run_btn: $(wrapper).find('.products-search .btn').get(0),
+		hide_refresh: true,
+		get_query: function() {
+			args = {
+				searchstr: $('input[name="products-search"]').val() || '',
+				cat: erpnext.products.cur_group
+			};
+			return repl('select t1.name, t1.title, t1.thumbnail_image, \
+				t1.page_name, t1.short_description \
+				from tabProduct t1, tabItem t2 \
+				where t1.item = t2.name \
+				and t2.item_group="%(cat)s" \
+				and t1.short_description like "%%(searchstr)s%"', args)
+		},
+		render_row: function(parent, data) {
+			parent.innerHTML = repl('<div style="float:left; width: 115px;">\
+				<img src="files/%(thumbnail_image)s" style="width:100px;"></div>\
+				<div style="float:left; width: 400px">\
+					<b><a href="#!%(page_name)s">%(title)s</a></b>\
+					<p>%(short_description)s</p></div>\
+				<div style="clear: both; margin-bottom: 7px;"></div>', data);
+		}
+	});
+	
+}
+
+erpnext.products.set_group = function() {
+	var cat = erpnext.products.get_group();
+	if(!cat.grp) {
+		// still nothing
+		setTimeout('erpnext.products.set_group()', 1000);
+		return;		
+	}
 	// get erpnext.products.default_category
+	var wrapper = erpnext.products.wrapper;
 	
-	// make search box
-	
-	// make main listing based on default category
-	
-	// make sidelisting of categories
+	$(wrapper).find('h1').html(cat.label);
+	wrapper.mainlist.run();
 }
\ No newline at end of file
diff --git a/erpnext/website/utils.py b/erpnext/website/utils.py
index e1802cb..330f7a3 100644
--- a/erpnext/website/utils.py
+++ b/erpnext/website/utils.py
@@ -1,14 +1,53 @@
+import webnotes
+from webnotes.model.doc import Document
+
 def make_template(doc, path, convert_fields = ['main_section', 'side_section']):
 	"""make template"""
-	import os, jinja2, markdown2
+	import os, jinja2
 	
-	# markdown
-	for f in convert_fields:
-		doc.fields[f + '_html'] = markdown2.markdown(doc.fields[f] or '', \
-			extras=["wiki-tables"])
+	markdown(doc, convert_fields)
 	
 	# write template
 	with open(path, 'r') as f:
 		temp = jinja2.Template(f.read())
 	
-	return temp.render(doc = doc.fields)	
\ No newline at end of file
+	return temp.render(doc = doc.fields)
+
+def markdown(doc, fields):
+	"""convert fields to markdown"""
+	import markdown2
+	# markdown
+	for f in fields:
+		doc.fields[f + '_html'] = markdown2.markdown(doc.fields[f] or '', \
+			extras=["wiki-tables"])
+
+
+def page_name(title):
+	"""make page name from title, and check that there is no duplicate"""
+	import re
+	name = re.sub('[~!@#$%^&*()<>,."\']', '', title.lower())
+	return '-'.join(name.split()[:4])
+	
+def add_page(title):
+	"""add a custom page with title"""
+	name = page_name(title)
+	if webnotes.conn.sql("""select name from tabPage where name=%s""", name):
+		p = Document('Page', name)
+	else:
+		p = Document('Page')
+		
+	p.title = title
+	p.name = p.page_name = name
+	p.module = 'Website'
+	p.standard = 'No'
+
+	return p
+	
+def add_guest_access_to_page(page):
+	"""add Guest in Page Role"""
+	if not webnotes.conn.sql("""select parent from `tabPage Role`
+		where role='Guest' and parent=%s""", page):
+		d = Document('Page Role')
+		d.parent = page
+		d.role = 'Guest'
+		d.save()
\ No newline at end of file