Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/projects/doctype/task/task.js b/projects/doctype/task/task.js
index 18c1653..e9ca4d8 100644
--- a/projects/doctype/task/task.js
+++ b/projects/doctype/task/task.js
@@ -26,18 +26,3 @@
 cur_frm.cscript.project = function(doc, cdt, cdn){
   if(doc.project) get_server_fields('get_project_details', '','', doc, cdt, cdn, 1);
 }
-
-
-// TODO: remove these? field doesn't exist, but custom field could exist
-cur_frm.fields_dict['customer'].get_query = function(doc,cdt,cdn){
-  var cond='';
-  if(doc.project) cond = 'ifnull(`tabProject`.customer, "") = `tabCustomer`.name AND ifnull(`tabProject`.name, "") = "'+doc.project+'" AND';
-  return repl('SELECT distinct `tabCustomer`.`name` FROM `tabCustomer`, `tabProject` WHERE %(cond)s `tabCustomer`.`name` LIKE "%s" ORDER BY `tabCustomer`.`name` ASC LIMIT 50', {cond:cond});
-}
-
-cur_frm.cscript.customer = function(doc, cdt, cdn){
-  if(doc.customer) get_server_fields('get_customer_details', '','', doc, cdt, cdn, 1);
-  else doc.customer_name ='';
-}
-
-
diff --git a/setup/doctype/item_group/item_group.py b/setup/doctype/item_group/item_group.py
index 81c5d80..4ce126b 100644
--- a/setup/doctype/item_group/item_group.py
+++ b/setup/doctype/item_group/item_group.py
@@ -39,6 +39,5 @@
 	
 	def prepare_template_args(self):
 		self.doc.sub_groups = webnotes.conn.sql("""select name, page_name
-			from `tabItem Group` where parent_item_group=%s 
-				and ifnull(show_in_website,0)=1""", self.doc.name, as_dict=1)
-	
\ No newline at end of file
+			from `tabItem Group` where parent_item_group=%s
+			and ifnull(show_in_website,0)=1""", self.doc.name, as_dict=1)		
\ No newline at end of file
diff --git a/setup/doctype/item_group/item_group.txt b/setup/doctype/item_group/item_group.txt
index 1a3e063..72b83aa 100644
--- a/setup/doctype/item_group/item_group.txt
+++ b/setup/doctype/item_group/item_group.txt
@@ -4,7 +4,7 @@
   "docstatus": 0, 
   "creation": "2012-12-07 15:15:28", 
   "modified_by": "Administrator", 
-  "modified": "2012-12-18 16:23:48"
+  "modified": "2012-12-20 16:11:15"
  }, 
  {
   "in_create": 1, 
@@ -103,6 +103,7 @@
   "fieldtype": "Check"
  }, 
  {
+  "description": "HTML / Banner that will show on the top of product list.", 
   "depends_on": "show_in_website", 
   "doctype": "DocField", 
   "label": "Description", 
@@ -110,23 +111,6 @@
   "fieldtype": "Text Editor"
  }, 
  {
-  "depends_on": "show_in_website", 
-  "doctype": "DocField", 
-  "label": "Featured Items", 
-  "fieldname": "featured_items_html", 
-  "fieldtype": "Section Break"
- }, 
- {
-  "description": "Items Featured on the Item Group Page", 
-  "depends_on": "show_in_website", 
-  "doctype": "DocField", 
-  "label": "Featured Items", 
-  "fieldname": "featured_items", 
-  "fieldtype": "Table", 
-  "hidden": 0, 
-  "options": "Featured Item"
- }, 
- {
   "print_hide": 1, 
   "no_copy": 1, 
   "oldfieldtype": "Int", 
@@ -169,13 +153,6 @@
   "report_hide": 1
  }, 
  {
-  "doctype": "DocField", 
-  "label": "file_list", 
-  "fieldname": "file_list", 
-  "fieldtype": "Text", 
-  "hidden": 1
- }, 
- {
   "print_hide": 1, 
   "no_copy": 1, 
   "doctype": "DocField", 
diff --git a/stock/doctype/item/item.txt b/stock/doctype/item/item.txt
index 10017a6..71adb4f 100644
--- a/stock/doctype/item/item.txt
+++ b/stock/doctype/item/item.txt
@@ -4,7 +4,7 @@
   "docstatus": 0, 
   "creation": "2012-12-17 14:56:32", 
   "modified_by": "Administrator", 
-  "modified": "2012-12-18 14:23:19"
+  "modified": "2012-12-20 15:59:41"
  }, 
  {
   "allow_attach": 1, 
@@ -772,6 +772,15 @@
   "permlevel": 1
  }, 
  {
+  "description": "Products will be sorted by weight-age in default searches. More the weight-age, higher the product will appear in the list.", 
+  "search_index": 1, 
+  "doctype": "DocField", 
+  "label": "Weightage", 
+  "fieldname": "weightage", 
+  "fieldtype": "Int", 
+  "permlevel": 0
+ }, 
+ {
   "depends_on": "show_in_website", 
   "doctype": "DocField", 
   "label": "Image", 
@@ -823,18 +832,9 @@
   "permlevel": 0
  }, 
  {
-  "description": "Will appear in search", 
   "depends_on": "show_in_website", 
   "doctype": "DocField", 
-  "label": "Short Description", 
-  "fieldname": "web_short_description", 
-  "fieldtype": "Text Editor", 
-  "permlevel": 0
- }, 
- {
-  "depends_on": "show_in_website", 
-  "doctype": "DocField", 
-  "label": "Long Description", 
+  "label": "Website Description", 
   "fieldname": "web_long_description", 
   "fieldtype": "Text Editor", 
   "permlevel": 0
diff --git a/website/doctype/product_settings/__init__.py b/website/doctype/product_settings/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/website/doctype/product_settings/__init__.py
diff --git a/website/doctype/product_settings/product_settings.py b/website/doctype/product_settings/product_settings.py
new file mode 100644
index 0000000..928aa9f
--- /dev/null
+++ b/website/doctype/product_settings/product_settings.py
@@ -0,0 +1,8 @@
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+class DocType:
+	def __init__(self, d, dl):
+		self.doc, self.doclist = d, dl
\ No newline at end of file
diff --git a/website/doctype/product_settings/product_settings.txt b/website/doctype/product_settings/product_settings.txt
new file mode 100644
index 0000000..d9c67f5
--- /dev/null
+++ b/website/doctype/product_settings/product_settings.txt
@@ -0,0 +1,65 @@
+[
+ {
+  "owner": "Administrator", 
+  "docstatus": 0, 
+  "creation": "2012-12-20 14:05:00", 
+  "modified_by": "Administrator", 
+  "modified": "2012-12-20 15:46:15"
+ }, 
+ {
+  "issingle": 1, 
+  "description": "Settings for Product Catalog on the website", 
+  "doctype": "DocType", 
+  "module": "Website", 
+  "document_type": "Other", 
+  "name": "__common__"
+ }, 
+ {
+  "name": "__common__", 
+  "parent": "Product Settings", 
+  "doctype": "DocField", 
+  "parenttype": "DocType", 
+  "permlevel": 0, 
+  "parentfield": "fields"
+ }, 
+ {
+  "parent": "Product Settings", 
+  "read": 1, 
+  "name": "__common__", 
+  "create": 1, 
+  "doctype": "DocPerm", 
+  "write": 1, 
+  "parenttype": "DocType", 
+  "role": "Website Manager", 
+  "permlevel": 0, 
+  "parentfield": "permissions"
+ }, 
+ {
+  "name": "Product Settings", 
+  "doctype": "DocType"
+ }, 
+ {
+  "description": "Default: \"Product Search\"", 
+  "doctype": "DocField", 
+  "label": "Search Help", 
+  "fieldname": "search_help", 
+  "fieldtype": "Data"
+ }, 
+ {
+  "description": "List of Item Groups to be shown in \"All Products\" menu - in the sequence wanted and with number of indents (left spacing to show a tree effect).", 
+  "doctype": "DocField", 
+  "label": "Product Categories", 
+  "fieldname": "sb2", 
+  "fieldtype": "Section Break"
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Website Product Categories", 
+  "fieldname": "website_product_categories", 
+  "fieldtype": "Table", 
+  "options": "Website Product Category"
+ }, 
+ {
+  "doctype": "DocPerm"
+ }
+]
\ No newline at end of file
diff --git a/website/doctype/website_product_category/__init__.py b/website/doctype/website_product_category/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/website/doctype/website_product_category/__init__.py
diff --git a/website/doctype/website_product_category/website_product_category.py b/website/doctype/website_product_category/website_product_category.py
new file mode 100644
index 0000000..928aa9f
--- /dev/null
+++ b/website/doctype/website_product_category/website_product_category.py
@@ -0,0 +1,8 @@
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+class DocType:
+	def __init__(self, d, dl):
+		self.doc, self.doclist = d, dl
\ No newline at end of file
diff --git a/website/doctype/website_product_category/website_product_category.txt b/website/doctype/website_product_category/website_product_category.txt
new file mode 100644
index 0000000..6625b47
--- /dev/null
+++ b/website/doctype/website_product_category/website_product_category.txt
@@ -0,0 +1,43 @@
+[
+ {
+  "owner": "Administrator", 
+  "docstatus": 0, 
+  "creation": "2012-12-20 14:21:35", 
+  "modified_by": "Administrator", 
+  "modified": "2012-12-20 15:00:25"
+ }, 
+ {
+  "istable": 1, 
+  "description": "Product Category for website", 
+  "doctype": "DocType", 
+  "module": "Website", 
+  "document_type": "Transaction", 
+  "name": "__common__"
+ }, 
+ {
+  "name": "__common__", 
+  "parent": "Website Product Category", 
+  "doctype": "DocField", 
+  "parenttype": "DocType", 
+  "permlevel": 0, 
+  "parentfield": "fields"
+ }, 
+ {
+  "name": "Website Product Category", 
+  "doctype": "DocType"
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Item Group", 
+  "fieldname": "item_group", 
+  "fieldtype": "Link", 
+  "options": "Item Group"
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Indent", 
+  "fieldname": "indent", 
+  "fieldtype": "Select", 
+  "options": "0\n1\n2\n3\n4\n5"
+ }
+]
\ No newline at end of file
diff --git a/website/doctype/website_settings/website_settings.txt b/website/doctype/website_settings/website_settings.txt
index b642965..b02b55e 100644
--- a/website/doctype/website_settings/website_settings.txt
+++ b/website/doctype/website_settings/website_settings.txt
@@ -4,7 +4,7 @@
   "docstatus": 0, 
   "creation": "2012-07-12 23:29:36", 
   "modified_by": "Administrator", 
-  "modified": "2012-12-18 16:15:43"
+  "modified": "2012-12-20 14:28:46"
  }, 
  {
   "issingle": 1, 
@@ -66,15 +66,6 @@
   "permlevel": 0
  }, 
  {
-  "description": "Only Items / Groups under this Groups will be shown on the website. This will also represent the \"Products\" Home Page.", 
-  "doctype": "DocField", 
-  "label": "Default Product Category", 
-  "options": "Item Group", 
-  "fieldname": "default_product_category", 
-  "fieldtype": "Link", 
-  "permlevel": 0
- }, 
- {
   "description": "If checked, the Home page will be the default Item Group for the website.", 
   "doctype": "DocField", 
   "label": "Home Page is Products", 
diff --git a/website/helpers/product.py b/website/helpers/product.py
index 60d54e6..398049d 100644
--- a/website/helpers/product.py
+++ b/website/helpers/product.py
@@ -4,6 +4,7 @@
 from __future__ import unicode_literals
 import webnotes
 
+
 @webnotes.whitelist(allow_guest=True)
 def get_product_info(item_code):
 	"""get product price / stock info"""
@@ -24,40 +25,37 @@
 	}
 
 @webnotes.whitelist(allow_guest=True)
-def get_product_list(args=None):
+def get_product_list(search=None, product_group=None, start=0):
 	import webnotes
 	from webnotes.utils import cstr
-	
-	if not args: args = webnotes.form_dict
-	if not args.search: args.search = ""
-	
+		
 	# base query
 	query = """\
 		select name, item_name, page_name, website_image, item_group, 
-			if(ifnull(web_short_description,'')='', web_long_description, 
-			web_short_description) as web_short_description
+			web_long_description as website_description
 		from `tabItem`
 		where docstatus = 0
 		and show_in_website = 1 """
 	
 	# search term condition
-	if args.search:
+	if search:
 		query += """
 			and (
-				web_short_description like %(search)s or
 				web_long_description like %(search)s or
-				description like %(search)s or
 				item_name like %(search)s or
 				name like %(search)s
 			)"""
-		args['search'] = "%" + cstr(args.get('search')) + "%"
+		search = "%" + cstr(search) + "%"
 	
 	# product group condition
-	if args.get('product_group') and args.get('product_group') != 'All Products':
+	if product_group:
 		query += """
 			and item_group = %(product_group)s """
 	
 	# order by
-	query += """order by item_name asc, name asc limit %s, 10""" % args.start
+	query += """order by item_name asc, name asc limit %s, 10""" % start
 
-	return webnotes.conn.sql(query, args, as_dict=1)
\ No newline at end of file
+	return webnotes.conn.sql(query, {
+		"search": search,
+		"product_group": product_group
+	}, as_dict=1)
\ No newline at end of file
diff --git a/website/page/website_home/website_home.html b/website/page/website_home/website_home.html
index 16850e6..a8d2bb1 100644
--- a/website/page/website_home/website_home.html
+++ b/website/page/website_home/website_home.html
@@ -9,11 +9,14 @@
 			<p class="help">Weblog (blog) entry</p>
 		</div>
 		<div style="width: 48%; float: right;">
-			<h5><a href="#Form/Website Settings/Website Settings">Website Settings</a></h5>
+			<h5><a href="#Form/Website Settings">Website Settings</a></h5>
 			<p class="help">Setup of top navigation bar, footer and logo</p>
 			<br>
-			<h5><a href="#Form/Style Settings/Style Settings">Style Settings</a></h5>
+			<h5><a href="#Form/Style Settings">Style Settings</a></h5>
 			<p class="help">Setup of fonts and background</p>
+			<br>
+			<h5><a href="#Form/Product Settings">Product Settings</a></h5>
+			<p class="help">Settings for Product Catalog on the website.</p>
 		</div>
 		<div style="clear: both"></div>
 		<hr>
diff --git a/website/templates/css/login.css b/website/templates/css/login.css
index b7b7fca..3d64009 100644
--- a/website/templates/css/login.css
+++ b/website/templates/css/login.css
@@ -23,6 +23,9 @@
 		.login-box td {
 			padding: 8px;
 		}
+		.login-box td input {
+			margin-bottom: 0px;
+		}
 		.login-footer {
 			text-align: center;
 			padding: 15px;
diff --git a/website/templates/html/outer.html b/website/templates/html/outer.html
index 9741451..fcd65f9 100644
--- a/website/templates/html/outer.html
+++ b/website/templates/html/outer.html
@@ -35,7 +35,11 @@
 								<ul class="dropdown-menu">
 								{% for child in page.child_items %}
 									<li data-label="{{ child.label }}">
-										<a href="{{ child.url }}" {{ child.target or '' }}>
+										<a {% if child.indent %}
+											style="padding-left: 
+												{{(int(child.indent)+1)*15 }}px"
+										{% endif %}
+										href="{{ child.url }}" {{ child.target or '' }}>
 											{{ child.label }}
 										</a>
 									</li>
diff --git a/website/templates/html/product_group.html b/website/templates/html/product_group.html
index 91d79b5..06335a5 100644
--- a/website/templates/html/product_group.html
+++ b/website/templates/html/product_group.html
@@ -1,7 +1,19 @@
 {% extends "html/page.html" %}
 
+{% block javascript %}
+{% include "js/product_list.js" %}
+{% endblock %}
+
 {% block content %}
 
+<script>
+$(document).ready(function() {
+	window.start = 0;
+	window.product_group = "{{ name }}";
+	window.get_product_list();
+});
+</script>
+
 <div class="layout-wrapper layout-wrapper-background">
 	<div class="web-content" id="content-product_group">
 		<div class="layout-main" style="padding: 30px;">
@@ -22,12 +34,17 @@
 				</div>
 			</div>
 			{% endif %}
-			{% if obj.doclist.get({"doctype":"Featured Item"}) %}
 			<hr>
-			<h3>Featured Products</h3>
-			
-			{% endif %}
-			
+			<h3>Products</h3>
+			<div id="search-list">
+				
+			</div>
+			<div style="text-align: center;">
+				<div class="more-btn" 
+					style="display: none; text-align: center;">
+					<button class="btn">More...</button>
+				</div>
+			</div>
 		</div>
 	</div>
 </div>
diff --git a/website/templates/html/product_search_box.html b/website/templates/html/product_search_box.html
index 125f0ba..5f69b34 100644
--- a/website/templates/html/product_search_box.html
+++ b/website/templates/html/product_search_box.html
@@ -10,6 +10,7 @@
 	<script>
 		// redirect to product search page
 		$(document).ready(function() {
+			$('.dropdown-toggle').dropdown()
 			$("#btn-product-search").click(function() {
 				var txt = $("#product-search").val();
 				if(txt) {
diff --git a/website/templates/js/product_list.js b/website/templates/js/product_list.js
new file mode 100644
index 0000000..04f92df
--- /dev/null
+++ b/website/templates/js/product_list.js
@@ -0,0 +1,69 @@
+window.get_product_list = function() {
+	$(".more-btn .btn").click(function() {
+		window.get_product_list()
+	});
+	
+	if(window.start==undefined) {
+		throw "product list not initialized (no start)"
+	}
+	
+	$.ajax({
+		method: "GET",
+		url: "server.py",
+		dataType: "json",
+		data: {
+			cmd: "website.helpers.product.get_product_list",
+			start: window.start,
+			search: window.search,
+			product_group: window.product_group
+		},
+		dataType: "json",
+		success: function(data) {
+			window.render_product_list(data.message);
+		}
+	})
+}
+
+window.render_product_list = function(data) {
+	if(data.length) {
+		var table = $("#search-list .table");
+		if(!table.length)
+			var table = $("<table class='table'>").appendTo("#search-list");
+			
+		$.each(data, function(i, d) {
+			if(!d.web_short_description)
+				d.web_short_description = "No description given."
+			var $tr = $(repl('<tr>\
+				<td style="width: 30%;">\
+					<img class="product-image" \
+						style="width: 80%;" src="files/%(website_image)s">\
+				</td>\
+				<td>\
+					<h4><a href="%(page_name)s">%(item_name)s</a></h4>\
+					<p class="help">Item Code: %(name)s</p>\
+					<p>%(website_description)s</p>\
+				</td>\
+			</tr>', d)).appendTo(table);
+			
+			if(!d.website_image) {
+				$tr.find(".product-image").replaceWith("<div\
+					style='background-color: #eee; padding: 40px; \
+						width: 32px; font-size: 32px; color: #888;'>\
+					<i class='icon-camera'></i></div>");
+			}
+		});
+		
+	}
+	if(data.length < 10) {
+		if(!table) {
+			$(".more-btn")
+				.replaceWith("<div class='alert'>No products found.</div>");
+		} else {
+			$(".more-btn")
+				.replaceWith("<div class='alert'>Nothing more to show.</div>");
+		}
+	} else {
+		$(".more-btn").toggle(true)
+	}
+	window.start += (data.length || 0);
+}
diff --git a/website/templates/pages/product_search.html b/website/templates/pages/product_search.html
index f8a1144..e573f7e 100644
--- a/website/templates/pages/product_search.html
+++ b/website/templates/pages/product_search.html
@@ -2,77 +2,18 @@
 
 {% block title %}Product Search{% endblock %}
 
+{% block javascript %}
+{% include "js/product_list.js" %}
+{% endblock %}
+
 {% block content %}
 <script>
 $(document).ready(function() {
 	var txt = get_url_arg("q");
 	$(".search-results").html("Search results for: " + txt);
-
+	window.search = txt;
 	window.start = 0;
-	var get_list = function() {
-		$.ajax({
-			method: "GET",
-			url: "server.py",
-			dataType: "json",
-			data: {
-				cmd: "website.helpers.product.get_product_list",
-				start: window.start,
-				search: txt
-			},
-			dataType: "json",
-			success: function(data) {
-				render(data.message);
-			}
-		})
-	}
-	
-	var render = function(data) {
-		if(data.length) {
-			var table = $("#search-list .table");
-			if(!table.length)
-				var table = $("<table class='table'>").appendTo("#search-list");
-				
-			$.each(data, function(i, d) {
-				if(!d.web_short_description)
-					d.web_short_description = "No description given."
-				var $tr = $(repl('<tr>\
-					<td style="width: 30%;">\
-						<img class="product-image" style="width: 80%;" src="files/%(website_image)s">\
-					</td>\
-					<td>\
-						<h4><a href="%(page_name)s">%(item_name)s</a></h4>\
-						<p class="help">Item Code: %(name)s</p>\
-						<p>%(web_short_description)s</p>\
-					</td>\
-				</tr>', d)).appendTo(table);
-				
-				if(!d.website_image) {
-					$tr.find(".product-image").replaceWith("<div\
-						style='background-color: #eee; padding: 40px; \
-							width: 32px; font-size: 32px; color: #888;'>\
-						<i class='icon-camera'></i></div>");
-				}
-			});
-			
-		}
-		if(data.length < 10) {
-			if(!table) {
-				$(".more-btn")
-					.replaceWith("<div class='alert'>No results found for your search.</div>");
-			} else {
-				$(".more-btn")
-					.replaceWith("<div class='alert'>Nothing more to show.</div>");
-			}
-		} else {
-			$(".more-btn").toggle(true)
-		}
-		window.start += (data.length || 0);
-	}
-	
-	get_list();
-	$(".more-btn .btn").click(function() {
-		get_list()
-	});
+	window.get_product_list();
 });
 </script>
 
diff --git a/website/utils.py b/website/utils.py
index be8f5e1..3498f67 100644
--- a/website/utils.py
+++ b/website/utils.py
@@ -169,6 +169,7 @@
 	args = obj.doc.fields
 	args['template'] = page_map[doc_type].template
 	args['obj'] = obj
+	args['int'] = int
 	
 	return args
 
@@ -201,9 +202,19 @@
 					t['child_items'].append(d)
 					break
 	
+	if "products" in [d.url.split(".")[0] for d in top_items]:
+		# product categories
+		products = webnotes.conn.sql("""select t1.item_group as label, 
+			concat(t2.page_name, ".html") as url,
+			ifnull(t1.indent,0) as indent
+			from `tabWebsite Product Category` t1, `tabItem Group` t2 
+			where t1.item_group = t2.name
+			and ifnull(t2.show_in_website,0)=1 order by t1.idx""", as_dict=1)
+		products_item = filter(lambda d: d.url.split(".")[0]=="products", top_items)[0]			
+		products_item.child_items = products
+		
 	return {
 		'top_bar_items': top_items,
-	
 		'footer_items': webnotes.conn.sql("""\
 			select * from `tabTop Bar Item`
 			where parent='Website Settings' and parentfield='footer_items'
@@ -211,7 +222,8 @@
 			
 		'brand': webnotes.conn.get_value('Website Settings', None, 'brand_html') or 'ERPNext',
 		'copyright': webnotes.conn.get_value('Website Settings', None, 'copyright'),
-		'favicon': webnotes.conn.get_value('Website Settings', None, 'favicon')
+		'favicon': webnotes.conn.get_value('Website Settings', None, 'favicon'),
+		'int':int
 	}
 
 def get_home_page():