Merge branch 'master' into cms2
diff --git a/erpnext/patches/june_2012/cms2.py b/erpnext/patches/june_2012/cms2.py
new file mode 100644
index 0000000..fb9c72c
--- /dev/null
+++ b/erpnext/patches/june_2012/cms2.py
@@ -0,0 +1,11 @@
+def execute():
+	import webnotes
+	from webnotes.model.doclist import DocList
+	import webnotes.model.sync
+	
+	# sync web page doctype
+	webnotes.model.sync.sync('website', 'web_page')
+	
+	# save all web pages to create content
+	for p in webnotes.conn.sql("""select name from `tabWeb Page` where docstatus=0"""):
+		DocList('Web Page', p[0]).save()
\ No newline at end of file
diff --git a/erpnext/website/doctype/web_page/template.html b/erpnext/website/doctype/web_page/template.html
index c6d4b40..f46113c 100644
--- a/erpnext/website/doctype/web_page/template.html
+++ b/erpnext/website/doctype/web_page/template.html
@@ -8,21 +8,11 @@
 		<div class="layout-main">
 		{% endif %}
 			{{ doc.main_section_html }}
-			{% if doc.next_page_html %}
-				{{ doc.next_page_html }}
-			{% endif %}
-
 		</div>
 		
 		{% if doc.layout and doc.layout.startswith('Two column') %}
 		<div class="layout-side-section">
 			{{ doc.side_section_html }}
-			{% if doc.see_also %}
-			<div class="info-box">
-				<h4>See Also</h4>
-				{{ doc.see_also }}
-			</div>
-			{% endif %}
 		</div>
 		{% endif %}
 		<div style="clear: both"></div>
diff --git a/erpnext/website/doctype/web_page/web_page.py b/erpnext/website/doctype/web_page/web_page.py
index 27ce5c0..3f4a39c 100644
--- a/erpnext/website/doctype/web_page/web_page.py
+++ b/erpnext/website/doctype/web_page/web_page.py
@@ -28,63 +28,32 @@
 	def on_update(self):
 		"""make page for this product"""
 		from jinja2 import Template
-		from webnotes.utils import global_date_format
-		from webnotes.model.code import get_obj
 		import os
 
 		# we need the name for the templates
 		if self.doc.name.startswith('New Web Page'):
 			self.autoname()
 
-		if self.doc.page_name:
-			webnotes.conn.sql("""delete from tabPage where name=%s""", self.doc.page_name)
-
-		p = website.utils.add_page(self.doc.name)
-		self.doc.page_name = p.name
+		# page name updates with the title
+		self.doc.page_name = website.utils.page_name(self.doc.title)
 		
-		self.doc.updated = global_date_format(self.doc.modified)
+		# markdown
 		website.utils.markdown(self.doc, ['head_section','main_section', 'side_section'])
-				
+		
+		# make page layout
 		with open(os.path.join(os.path.dirname(__file__), 'template.html'), 'r') as f:
-			p.content = Template(f.read()).render(doc=self.doc)
-
-		p.title = self.doc.title
-		p.web_page = 'Yes'
+			self.doc.content = Template(f.read()).render(doc=self.doc)
 		
-		if self.doc.insert_code:
-			p.script = self.doc.javascript
-
-		if self.doc.insert_style:
-			p.style = self.doc.css
-
-		p.save()
-		get_obj(doc=p).write_cms_page()
-		
-		website.utils.add_guest_access_to_page(p.name)
 		self.cleanup_temp()
 
 		self.doc.save()
 
 		self.if_home_clear_cache()
-			
-	def add_page_links(self):
-		"""add links for next_page and see_also"""
-		if self.doc.next_page:
-			self.doc.next_page_html = """<div class="info-box round" style="text-align: right">
-				<b>Next:</b>
-				<a href="#!%(name)s">%(title)s</a></div>""" % {"name":self.doc.next_page, \
-						"title": webnotes.conn.get_value("Page", self.doc.next_page, "title")}
-
-		self.doc.see_also = ''
-		for d in self.doclist:
-			if d.doctype=='Related Page':
-				tmp = {"page":d.page, "title":webnotes.conn.get_value('Page', d.page, 'title')}
-				self.doc.see_also += """<div><a href="#!%(page)s">%(title)s</a></div>""" % tmp
 				
 	def cleanup_temp(self):
 		"""cleanup temp fields"""
-		fl = ['main_section_html', 'side_section_html', 'see_also', \
-			'next_page_html', 'head_section_html', 'updated']
+		fl = ['main_section_html', 'side_section_html', \
+			'head_section_html']
 		for f in fl:
 			if f in self.doc.fields:
 				del self.doc.fields[f]
diff --git a/erpnext/website/doctype/web_page/web_page.txt b/erpnext/website/doctype/web_page/web_page.txt
index c40caff..9fba41a 100644
--- a/erpnext/website/doctype/web_page/web_page.txt
+++ b/erpnext/website/doctype/web_page/web_page.txt
@@ -5,7 +5,7 @@
 	{
 		'creation': '2012-04-02 16:02:43',
 		'docstatus': 0,
-		'modified': '2012-05-02 15:24:31',
+		'modified': '2012-06-15 17:18:59',
 		'modified_by': u'Administrator',
 		'owner': u'Administrator'
 	},
@@ -88,6 +88,17 @@
 
 	# DocField
 	{
+		'colour': u'White:FFF',
+		'description': u'Page url name (auto-generated) ',
+		'doctype': u'DocField',
+		'fieldname': u'page_name',
+		'fieldtype': u'Data',
+		'label': u'Page Name',
+		'permlevel': 1
+	},
+
+	# DocField
+	{
 		'doctype': u'DocField',
 		'fieldname': u'cb1',
 		'fieldtype': u'Column Break',
@@ -101,7 +112,7 @@
 		'fieldname': u'layout',
 		'fieldtype': u'Select',
 		'label': u'Layout',
-		'options': u'Two column with header\nTwo column\nSingle column',
+		'options': u'Single column\nTwo column\nTwo column with header',
 		'permlevel': 0
 	},
 
@@ -155,6 +166,17 @@
 	# DocField
 	{
 		'colour': u'White:FFF',
+		'doctype': u'DocField',
+		'fieldname': u'content',
+		'fieldtype': u'Code',
+		'hidden': 1,
+		'label': u'Content',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'colour': u'White:FFF',
 		'description': u'Link to other pages in the side bar and next section',
 		'doctype': u'DocField',
 		'fieldname': u'sb2',
@@ -176,6 +198,7 @@
 	# DocField
 	{
 		'colour': u'White:FFF',
+		'description': u'Add code as &lt;script&gt;',
 		'doctype': u'DocField',
 		'fieldname': u'insert_code',
 		'fieldtype': u'Check',
@@ -215,15 +238,6 @@
 	# DocField
 	{
 		'doctype': u'DocField',
-		'fieldname': u'page_name',
-		'fieldtype': u'Data',
-		'label': u'Page Name',
-		'permlevel': 1
-	},
-
-	# DocField
-	{
-		'doctype': u'DocField',
 		'fieldname': u'file_list',
 		'fieldtype': u'Text',
 		'hidden': 1,
diff --git a/erpnext/website/templates/404.html b/erpnext/website/templates/404.html
new file mode 100644
index 0000000..8a30892
--- /dev/null
+++ b/erpnext/website/templates/404.html
@@ -0,0 +1,12 @@
+{% extends "outer.html" %}
+
+{% block content %}
+<div class="content">
+	<div class="layout-wrapper layout-main">
+		<h3>Page missing or moved</h3>
+		<br>
+		<p>We are very sorry for this, but the page you are looking for is missing
+			(this could be because of a typo in the address) or moved.</p>
+	</div>
+</div>
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/website/templates/__init__.py b/erpnext/website/templates/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/website/templates/__init__.py
diff --git a/erpnext/website/templates/base.html b/erpnext/website/templates/base.html
new file mode 100644
index 0000000..cd64139
--- /dev/null
+++ b/erpnext/website/templates/base.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<head>
+	<meta charset="utf-8">
+	<title>{% block title %}{% endblock %}</title>
+	<meta name="generator" content="wnframework">
+	<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+	<link rel="icon" href="images/favicon.ico" type="image/x-icon">
+	<script type="text/javascript" src="js/lib/jquery/jquery.min.js"></script>
+	<script type="text/javascript" src="js/all-web.js"></script>
+	<script type="text/javascript" src="js/wn-web.js"></script>
+	<link type="text/css" rel="stylesheet" href="css/all-web.css">
+	<link type="text/css" rel="stylesheet" href="css/wn-web.css">
+	
+	{% block header %}
+	{% endblock %}
+</head>
+<body>
+	{% block body %}
+	{% endblock %}
+</body>
\ No newline at end of file
diff --git a/erpnext/website/templates/blog.html b/erpnext/website/templates/blog.html
new file mode 100644
index 0000000..d0b9a13
--- /dev/null
+++ b/erpnext/website/templates/blog.html
@@ -0,0 +1,58 @@
+{% extends "outer.html" %}
+
+{% block title %}{{ title }}{% endblock %}
+
+
+{% block content %}
+<div class="layout-wrapper layout-wrapper-background">
+	<div class="web-content" id="content-blog">
+		<div class="layout-main-section">
+			<h1>Blog</h1>
+			<br>
+			<div id="blog-list">
+				<!-- blog list will be generated dynamically -->
+			</div>
+		</div>
+		<div class="layout-side-section">
+			<!-- for later
+			<h4>Get Updates</h4>
+			<p>
+			<input name="blog-subscribe">
+			<button class="btn" id="blog-subscribe">Subscribe</button>
+			</p>-->
+			<h4>Subscribe</h4>
+			<p>
+			<img src="images/feed.png" style="margin-right: 4px; margin-bottom: -4px">
+			<a href="rss.xml" target="_blank">RSS Feed</a>
+			</p>
+		</div>
+		<div style="clear: both"></div>
+	</div>
+</div>
+
+<script>
+
+// if not a specific blog, show listing
+erpnext.blog_list = new wn.ui.Listing({
+	parent: $(wrapper).find('#blog-list').get(0),
+	query: 'select tabBlog.name, title, left(content, 1000) as content, tabBlog.creation, \
+		ifnull(first_name, "") as first_name, ifnull(last_name, "") as last_name \
+		from tabProfile, tabBlog\
+	 	where ifnull(published,0)=1 and tabBlog.owner = tabProfile.name \
+		order by tabBlog.creation desc',
+	hide_refresh: true,
+	no_toolbar: true,
+	render_row: function(parent, data) {
+		if(data.content && data.content.length==1000) data.content += '... (read on)';
+		data.content = wn.markdown(data.content);
+		if(data.last_name) data.last_name = ' ' + data.last_name;
+		data.date = prettyDate(data.creation);
+		parent.innerHTML = repl('<h2>%(title)s</h2>\
+			<p><div class="help">By %(first_name)s%(last_name)s, %(date)s</div></p>\
+			<p>%(content)s</p>\
+			<a href="%(name)s.html">Read Full Text</a><br>', data);
+	},
+	page_length: 10
+});
+erpnext.blog_list.run();
+</script>
\ No newline at end of file
diff --git a/erpnext/website/templates/outer.html b/erpnext/website/templates/outer.html
new file mode 100644
index 0000000..4b8c04d
--- /dev/null
+++ b/erpnext/website/templates/outer.html
@@ -0,0 +1,57 @@
+{#
+	requires, brand, top_bar_items, footer_items, copyright, content
+#}
+
+{% extends "base.html" %}
+
+{% block body %}
+
+	<header>
+		<div class="navbar navbar-fixed-top">
+			<div class="navbar-inner">
+			<div class="container">
+				<a class="brand" href="index.html">{{ brand }}</a>
+				<ul class="nav">
+					{% for page in top_bar_items %}
+						{% if not page.parent_label %}
+						<li data-label="{{ page.label }}">
+							<a href="{{ page.url }}" {{ page.target }}>
+							{{ page.label }}
+							{% if page.child_items %}
+								<ul class="dropdown-menu">
+								{% for child in page.child_items %}
+									<li data-label="{{ child.label }}">
+										<a href="{{ child.url }}" {{ child.target }}>
+								{% endfor %}
+								</ul>
+							{% endif %}
+							</a></li>
+						{% endif %}
+					{% endfor %}
+				</ul>
+				<img src="images/lib/ui/spinner.gif" id="spinner"/>
+				<ul class="nav pull-right">
+					<li id="login-topbar-item"><a href="login-page.html">Login</a></li>
+				</ul>
+			</div>
+			</div>
+			</div>	
+	</header>
+	<div id="body_div">
+		<div class="content" id="page-{{ name }}" style="display: block;">
+		{% block content %}
+		{% endblock %}
+		</div>
+	</div>
+	<footer><div class="web-footer">
+		<div class="web-footer-menu"><ul>
+		{% for item in footer_items %}
+			<li><a href="{{ item.url }}" {{ item.target }}
+				data-label="{{ item.label }}">{{ item.label }}</a></li>
+		{% endfor %}
+		</ul></div>
+		<div class="web-footer-copyright">&copy; {{ copyright }}
+		</div>
+	</footer>
+
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/website/templates/page.html b/erpnext/website/templates/page.html
new file mode 100644
index 0000000..97a309a
--- /dev/null
+++ b/erpnext/website/templates/page.html
@@ -0,0 +1,32 @@
+{% extends "outer.html" %}
+
+{% block title %}{{ title }}{% endblock %}
+
+{% block header %}
+	{{ super() }}
+	{% if insert_code %}
+	<script>
+	window.page_name = "{{ name }}";
+
+	$(document).bind('app_ready', function() {
+		var _page = new wn.views.Page(window.page_name);
+	
+		// page script
+		{{ javascript }}
+	
+		// trigger onload
+		_page.trigger('onload');
+	
+		// activate page
+		wn.container.change_to(window.page_name);
+	});
+	</script>
+	{% endif %}
+	{% if insert_style %}
+	<style>{{ css }}</style>
+	{% endif %}
+{% endblock %}
+
+{% block content %}
+	{{ content }}
+{% endblock %}
\ No newline at end of file
diff --git a/public/js/all-app.js b/public/js/all-app.js
index 8e26724..5e3f8f2 100644
--- a/public/js/all-app.js
+++ b/public/js/all-app.js
@@ -390,7 +390,7 @@
 /*
  *	lib/js/wn/request.js
  */
-wn.provide('wn.request');wn.request.url='index.cgi';wn.request.prepare=function(opts){if(opts.btn)$(opts.btn).set_working();if(opts.show_spinner)set_loading();if(opts.freeze)freeze();if(!opts.args.cmd){console.log(opts)
+wn.provide('wn.request');wn.request.url='server.py';wn.request.prepare=function(opts){if(opts.btn)$(opts.btn).set_working();if(opts.show_spinner)set_loading();if(opts.freeze)freeze();if(!opts.args.cmd){console.log(opts)
 throw"Incomplete Request";}}
 wn.request.cleanup=function(opts,r){if(opts.btn)$(opts.btn).done_working();if(opts.show_spinner)hide_loading();if(opts.freeze)unfreeze();if(wn.boot&&wn.boot.sid&&wn.get_cookie('sid')!=wn.boot.sid){if(!wn.app.logged_out){msgprint('Session Expired. Logging you out');wn.app.logout();}
 return;}
diff --git a/public/js/all-web.js b/public/js/all-web.js
index c4cc240..a549dc9 100644
--- a/public/js/all-web.js
+++ b/public/js/all-web.js
@@ -277,7 +277,7 @@
 /*
  *	lib/js/wn/request.js
  */
-wn.provide('wn.request');wn.request.url='index.cgi';wn.request.prepare=function(opts){if(opts.btn)$(opts.btn).set_working();if(opts.show_spinner)set_loading();if(opts.freeze)freeze();if(!opts.args.cmd){console.log(opts)
+wn.provide('wn.request');wn.request.url='server.py';wn.request.prepare=function(opts){if(opts.btn)$(opts.btn).set_working();if(opts.show_spinner)set_loading();if(opts.freeze)freeze();if(!opts.args.cmd){console.log(opts)
 throw"Incomplete Request";}}
 wn.request.cleanup=function(opts,r){if(opts.btn)$(opts.btn).done_working();if(opts.show_spinner)hide_loading();if(opts.freeze)unfreeze();if(wn.boot&&wn.boot.sid&&wn.get_cookie('sid')!=wn.boot.sid){if(!wn.app.logged_out){msgprint('Session Expired. Logging you out');wn.app.logout();}
 return;}
diff --git a/public/index.cgi b/public/server.py
similarity index 100%
rename from public/index.cgi
rename to public/server.py
diff --git a/public/web.py b/public/web.py
new file mode 100755
index 0000000..751d762
--- /dev/null
+++ b/public/web.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+
+"""
+return a dynamic page from website templates
+
+all html pages except login-page.html get generated here
+"""
+
+import cgi, cgitb, os, sys
+cgitb.enable()
+
+# import libs
+sys.path.append('..')
+import conf
+sys.path.append('../lib/py')
+sys.path.append(conf.modules_path)
+
+def init():
+	import webnotes
+	webnotes.form = cgi.FieldStorage(keep_blank_values=True)
+	for key in webnotes.form.keys():
+		webnotes.form_dict[key] = webnotes.form.getvalue(key)
+	webnotes.connect()
+
+def respond():
+	html = get_html()
+	print "Content-Type: text/html"
+	print
+	print html.encode('utf-8')
+
+def get_html():
+	import webnotes
+	from webnotes.model.doc import Document
+	# Get web page
+	outer_env_dict = get_outer_env()
+	try:
+		if 'page' in webnotes.form_dict:
+			page_name = webnotes.form_dict['page']
+			if page_name.endswith('.html'):
+				page_name = page_name[:-5]
+				
+			if page_name.startswith('blog'):
+				raise Exception
+				#page_name = 
+			else:
+				page_name = get_web_page_name(page_name)		
+		else:
+			from webnotes.cms import get_home_page
+			page_name = get_home_page('Guest')
+		
+		page = Document('Web Page', page_name)
+		page.fields.update(outer_env_dict)
+
+		return build_html(page.fields, "page: %s" % page_name)
+		
+	except Exception, e:
+		return build_html(outer_env_dict, "error: %s" % webnotes.getTraceback(), '404.html')
+
+def get_outer_env():
+	"""env dict for outer template"""
+	import webnotes
+	return {
+		'top_bar_items': webnotes.conn.sql("""select * from `tabTop Bar Item`
+			where parent='Website Settings' and parentfield='top_bar_items'
+			order by idx asc""", as_dict=1),
+	
+		'footer_items': webnotes.conn.sql("""select * from `tabTop Bar Item`
+			where parent='Website Settings' and parentfield='footer_items'
+			order by idx asc""", as_dict=1),
+			
+		'brand': webnotes.conn.get_value('Website Settings', None, 'brand_html'),
+		'copyright': webnotes.conn.get_value('Website Settings', None, 'copyright'),
+	}
+
+def build_html(args, comments, template='page.html'):
+	"""build html using jinja2 templates"""
+	from webnotes.utils import cstr
+	from jinja2 import Environment, FileSystemLoader
+	jenv = Environment(loader = FileSystemLoader('../erpnext/website/templates'))
+	
+	html = jenv.get_template(template).render(args)
+	html += "\n<!-- %s -->" % cstr(comments)
+	return html
+
+def get_web_page_name(page_name):
+	"""get page by shortname"""
+	import webnotes
+	return webnotes.conn.sql("""select name from `tabWeb Page` where page_name=%s""", page_name)[0][0]
+
+		
+if __name__=="__main__":
+	init()
+	respond()