Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/setup/doctype/price_list/price_list.css b/setup/doctype/price_list/price_list.css
new file mode 100644
index 0000000..61b0694
--- /dev/null
+++ b/setup/doctype/price_list/price_list.css
@@ -0,0 +1,7 @@
+.table-grid tbody tr {
+	cursor: pointer;
+}
+
+.table-grid thead tr {
+	height: 50px;
+}
\ No newline at end of file
diff --git a/setup/doctype/price_list/price_list.js b/setup/doctype/price_list/price_list.js
index 2c24d7e..67090bc 100644
--- a/setup/doctype/price_list/price_list.js
+++ b/setup/doctype/price_list/price_list.js
@@ -14,46 +14,42 @@
 cur_frm.cscript.show_item_prices = function() {
 	var item_price = wn.model.get("Item Price", {parent: cur_frm.doc.name});
 	
-	cur_frm.toggle_display("item_prices", true);
-	$(cur_frm.fields_dict.item_prices.wrapper).empty();
+	$(cur_frm.fields_dict.item_prices_html.wrapper).empty();
 	
 	new wn.ui.form.TableGrid({
-		parent: cur_frm.fields_dict.item_prices.wrapper,
+		parent: cur_frm.fields_dict.item_prices_html.wrapper,
 		frm: cur_frm,
-		table_field: wn.model.get("DocField", {parent:"Price List", fieldname:"item_prices"})[0]
+		table_field: wn.meta.get_docfield("Price List", "item_prices", cur_frm.doc.name)
 	});
 }
 
 wn.ui.form.TableGrid = Class.extend({
 	init: function(opts) {
 		$.extend(this, opts);
-		this.fields = wn.model.get("DocField", {parent: this.table_field.options});
+		this.fields = wn.meta.get_docfields("Item Price", cur_frm.doc.name);
 		this.make_table();
 	},
 	make_table: function() {
 		var me = this;
 		// Creating table & assigning attributes
 		var grid_table = document.createElement("table");
-		$(grid_table).attr("class", "table table-hover table-bordered grid");
+		grid_table.className = "table table-hover table-bordered table-grid";
 		
 		// Appending header & rows to table
-
-		$(this.make_table_headers()).appendTo(grid_table);
-		$(this.make_table_rows()).appendTo(grid_table);
+		grid_table.appendChild(this.make_table_headers());
+		grid_table.appendChild(this.make_table_rows());
 				
 		// Creating button to add new row
 		var btn_div = document.createElement("div");
 		var new_row_btn = document.createElement("button");
-		$new_row_btn = $(new_row_btn);
-		$new_row_btn.attr({
-			"class": "btn btn-success table-new-row",
-			"title": "Add new row"
-		});
+		new_row_btn.className = "btn btn-success table-new-row";
+		new_row_btn.title = "Add new row";
+
 		var btn_icon = document.createElement("i");
-		$(btn_icon).attr("class", "icon-plus");
-		$(btn_icon).appendTo(new_row_btn);
-		$new_row_btn.append(" Add new row");
-		$new_row_btn.appendTo(btn_div);
+		btn_icon.className = "icon-plus";
+		new_row_btn.appendChild(btn_icon);
+		new_row_btn.innerHTML += " Add new row";
+		btn_div.appendChild(new_row_btn);
 
 		// Appending table & button to parent
 		var $grid_table = $(grid_table).appendTo($(this.parent));
@@ -75,35 +71,31 @@
 		
 		// Creating header row
 		var row = document.createElement("tr");
-		$(row).attr({
-			"class": "active",
-			"style": "height:50px"
-		});
-		$(row).appendTo(header);
-
+		row.className = "active";
+		
 		// Creating head first cell
 		var th = document.createElement("th");
-		$(th).attr({
-			"width": "8%",
-			"style": "vertical-align:middle",
-			"class": "text-center"
-		});
-		$(th).html("#");
-		$(th).appendTo(row);
+		th.width = "8%";
+		th.className = "text-center";
+		th.innerHTML = "#";
+		row.appendChild(th);
 
 		// Make other headers with label as heading
-		$.each(this.fields, function(i, obj) {
-			var th = document.createElement("th");
+		for(var i=0, l=this.fields.length; i<l; i++) {
+			var df = this.fields[i];
 			
-			// If currency then move header to right
-			if (obj.fieldtype == "Currency")
-				$(th).attr("style", "vertical-align:middle; text-align:right;");
-			else
-				$(th).attr("style", "vertical-align:middle");
+			if(!!!df.hidden && df.in_list_view === 1) {
+				var th = document.createElement("th");
 			
-			$(th).html(obj.label);
-			$(th).appendTo(row);
-		});
+				// If currency then move header to right
+				if(["Int", "Currency", "Float"].indexOf(df.fieldtype) !== -1) th.className = "text-right";
+			
+				th.innerHTML = wn._(df.label);
+				row.appendChild(th);
+			}
+		}
+		
+		header.appendChild(row);
 
 		return header;
 	},
@@ -112,49 +104,21 @@
 
 		// Creating table body
 		var table_body = document.createElement("tbody");
-		$(table_body).attr("style", "cursor:pointer");
 
-		$.each(wn.model.get_children(this.table_field.options, this.frm.doc.name, 
-			this.table_field.fieldname, this.frm.doctype), function(index, d) {
-
-				// Creating table row
-				var tr = document.createElement("tr");
-				$(tr).attr({
-					"class": "table-row",
-					"data-idx": d.idx
-				});
-
-				// Creating table data & appending to row
-				var td = document.createElement("td");
-				$(td).attr("class", "text-center");
-				$(td).html(d.idx);
-				$(td).appendTo(tr);
-
-				$.each(me.fields, function(i, obj) {
-					if (obj.in_list_view===1) {
-						var td = document.createElement("td");
-						$(td).attr({
-							"data-fieldtype": obj.fieldtype,
-							"data-fieldname": obj.fieldname,
-							"data-fieldvalue": d[obj.fieldname],
-							"data-doc_name": d["name"]
-						});
-						$(td).html(d[obj.fieldname]);
-						
-						// if field is currency then add style & change text
-						if (obj.fieldtype=="Currency") {
-							$(td).attr("style", "text-align:right");
-							$(td).html(format_currency(d[obj.fieldname], me.frm.doc.currency));
-						}
-						
-						// Append td to row
-						$(td).appendTo(tr);
-					}
-				});
-
-				// Append row to table body
-				$(tr).appendTo(table_body);
-		});
+		var item_prices = wn.model.get_children(this.table_field.options, this.frm.doc.name, 
+			this.table_field.fieldname, this.frm.doctype);
+			
+		for(var i=0, l=item_prices.length; i<l; i++) {
+			var d = item_prices[i];
+			
+			// Creating table row
+			var tr = this.add_new_row(d);
+			
+			// append row to table body
+			table_body.appendChild(tr);
+		}
+		
+		this.table_body = table_body;
 		
 		return table_body;
 	},
@@ -205,89 +169,89 @@
 		var me = this;
 
 		if (!row) {
-			me.add_new_row();
+			var d = wn.model.add_child(this.frm.doc, this.table_field.options, 
+				this.table_field.fieldname);
+			refresh_field(this.table_field.fieldname);
+			this.update_item_price(d.name);
+			var tr = this.add_new_row(d);
+			this.table_body.appendChild(tr);
 		}
 		else {
-			$.each(me.fields, function(i, item) {
-				var $td = $(row).find('td[data-fieldname="'+ item.fieldname +'"]');
-				var val = me.dialog.get_values()[item.fieldname];
-
-				wn.model.set_value(me.table_field.options, $td.attr('data-doc_name'), 
-					item.fieldname, val);
-				$td.attr('data-fieldvalue', val);
-				
-				// If field type is currency the update with format currency
-				if ($td.attr('data-fieldtype') == "Currency")
-					$td.html(format_currency(val, me.frm.doc.currency));
-				else
-					$td.html(val);
-			});
+			this.update_item_price(null, row);
 		}
 		
 		this.dialog.hide();
 	},
+	
+	update_item_price: function(docname, row) {
+		var me = this;
+		if(!docname && row) docname = $(row).attr("data-docname");
+		$.each(me.fields, function(i, df) {
+			var val = me.dialog.get_values()[df.fieldname];
+			
+			if(["Currency", "Float"].indexOf(df.fieldtype)!==-1) {
+				val = flt(val);
+			} else if(["Int", "Check"].indexOf(df.fieldtype)!==-1) {
+				val = cint(val);
+			}
+			
+			wn.model.set_value(me.table_field.options, docname, 
+				df.fieldname, val);
+				
+			if(row) {
+				var $td = $(row).find('td[data-fieldname="'+ df.fieldname +'"]');
+				$td.attr('data-fieldvalue', val);
+				// If field type is currency the update with format currency
+				$td.html(wn.format(val, df));
+			}
+		});
+	},
+	
 	delete_row: function(row) {
 		var me = this;
-		var doc_name = $(row).find('td:last').attr('data-doc_name');
-		wn.model.clear_doc(me.table_field.options, doc_name);
+		var docname = $(row).find('td:last').attr('data-docname');
+		wn.model.clear_doc(me.table_field.options, docname);
 		$(row).remove();
 
 		// Re-assign idx
-		$.each($(this.parent).find(".grid tbody tr"), function(idx, data) {
-			$(data).attr("data-idx", idx + 1);
+		$.each($(this.parent).find("tbody tr"), function(idx, data) {
 			var $td = $(data).find('td:first');
 			$td.html(idx + 1);
 		});
 		this.dialog.hide();
 	},
-	add_new_row: function() {
-		var me = this;
-		var row = $(this.parent).find(".grid tbody tr");
-
-		// Creating new row
-		var new_row = document.createElement("tr");
-		$(new_row).attr({
-			"class": "table-row",
-			"data-idx": row.length + 1
-		});
-
-		// Creating first table data
-		var td = document.createElement("td");
-		$(td).attr("class", "text-center");
-		$(td).html(row.length + 1);
-		$(td).appendTo(new_row);
-
-		var child = wn.model.add_child(this.frm.doc, this.table_field.options, 
-			this.table_field.fieldname);
+	
+	add_new_row: function(d) {
+		var tr = document.createElement("tr");
+		tr.className = "table-row";
+		tr.setAttribute("data-docname", d.name);
 		
-		$.each(this.fields, function(i, obj) {
-			if (obj.in_list_view===1) {
-				child[obj.fieldname] = me.dialog.get_values()[obj.fieldname];
-				
+		// Creating table data & appending to row
+		var td = document.createElement("td");
+		td.className = "text-center";
+		td.innerHTML = d.idx;
+		tr.appendChild(td);
+		
+		for(var f=0, lf=this.fields.length; f<lf; f++) {
+			var df = this.fields[f];
+			if(!!!df.hidden && df.in_list_view===1) {
 				var td = document.createElement("td");
-				$(td).attr({
-					"data-fieldtype": obj.fieldtype,
-					"data-fieldname": obj.fieldname,
-					"data-fieldvalue": child[obj.fieldname],
-					"data-doc_name": child["name"]
-				});
-				$(td).html(child[obj.fieldname]);
+				td.setAttribute("data-fieldname", df.fieldname);
+				td.setAttribute("data-fieldvalue", d[df.fieldname]);
+				td.setAttribute("data-docname", d.name);
 				
-				// if field is currency then add style & change text
-				if (obj.fieldtype=="Currency") {
-					$(td).attr("style", "text-align:right");
-					$(td).html(format_currency(child[obj.fieldname], me.frm.doc.currency));
+				// If currency then move header to right
+				if(["Int", "Currency", "Float"].indexOf(df.fieldtype) !== -1) {
+					td.className = "text-right";
 				}
 				
-				// Append td to row
-				$(td).appendTo(new_row);
+				// format and set display
+				td.innerHTML = wn.format(d[df.fieldname], df);
+				
+				// append column to tabel row
+				tr.appendChild(td);
 			}
-		});
-
-		// refresh field to push to grid rows
-		refresh_field(this.table_field.fieldname);
-
-		// append row to tbody of grid
-		$(new_row).appendTo($(this.parent).find(".grid tbody"));
+		}
+		return tr;
 	}
 });
\ No newline at end of file
diff --git a/setup/doctype/price_list/price_list.txt b/setup/doctype/price_list/price_list.txt
index 343331d..df91bd9 100644
--- a/setup/doctype/price_list/price_list.txt
+++ b/setup/doctype/price_list/price_list.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-25 11:35:09", 
   "docstatus": 0, 
-  "modified": "2013-09-30 15:50:52", 
+  "modified": "2013-10-02 11:36:09", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -94,8 +94,14 @@
  }, 
  {
   "doctype": "DocField", 
+  "fieldname": "item_prices_html", 
+  "fieldtype": "HTML"
+ }, 
+ {
+  "doctype": "DocField", 
   "fieldname": "item_prices", 
   "fieldtype": "Table", 
+  "hidden": 1, 
   "label": "Item Prices", 
   "options": "Item Price"
  },