Allow user to change page_name in Item and Item Group #2397
diff --git a/erpnext/setup/doctype/item_group/item_group.js b/erpnext/setup/doctype/item_group/item_group.js
index 717c7d6..67e4e99 100644
--- a/erpnext/setup/doctype/item_group/item_group.js
+++ b/erpnext/setup/doctype/item_group/item_group.js
@@ -1,30 +1,36 @@
 // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-cur_frm.list_route = "Sales Browser/Item Group";
+frappe.ui.form.on("Item Group", {
+	onload: function(frm) {
+		frm.list_route = "Sales Browser/Item Group";
 
-cur_frm.cscript.refresh = function(doc, cdt, cdn) {
-	cur_frm.cscript.set_root_readonly(doc);
-	cur_frm.add_custom_button(__("Item Group Tree"), function() {
-		frappe.set_route("Sales Browser", "Item Group");
-	}, "icon-sitemap")
-}
+		//get query select item group
+		frm.fields_dict['parent_item_group'].get_query = function(doc,cdt,cdn) {
+			return{
+				filters:[
+					['Item Group', 'is_group', '=', 'Yes'],
+					['Item Group', 'name', '!=', doc.item_group_name]
+				]
+			}
+		}
+	},
 
-cur_frm.cscript.set_root_readonly = function(doc) {
-	// read-only for root item group
-	cur_frm.set_intro("");
-	if(!doc.parent_item_group) {
-		cur_frm.set_read_only();
-		cur_frm.set_intro(__("This is a root item group and cannot be edited."), true);
-	}
-}
+	refresh: function(frm) {
+		frm.trigger("set_root_readonly");
+		frm.add_custom_button(__("Item Group Tree"), function() {
+			frappe.set_route("Sales Browser", "Item Group");
+		}, "icon-sitemap");
+	},
 
-//get query select item group
-cur_frm.fields_dict['parent_item_group'].get_query = function(doc,cdt,cdn) {
-	return{
-		filters:[
-			['Item Group', 'is_group', '=', 'Yes'],
-			['Item Group', 'name', '!=', doc.item_group_name]
-		]
-	}
-}
+	set_root_readonly: function(frm) {
+		// read-only for root item group
+		frm.set_intro("");
+		if(!frm.doc.parent_item_group) {
+			frm.set_read_only();
+			frm.set_intro(__("This is a root item group and cannot be edited."), true);
+		}
+	},
+
+	page_name: frappe.utils.warn_page_name_change
+});
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index 33b1720..df15891 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -3,200 +3,207 @@
 
 frappe.provide("erpnext.item");
 
-frappe.ui.form.on("Item", "refresh", function(frm) {
-	if(frm.doc.is_stock_item) {
-		frm.add_custom_button(__("Show Balance"), function() {
-			frappe.route_options = {
-				"item_code": frm.doc.name
-			}
-			frappe.set_route("query-report", "Stock Balance");
-		});
-	}
-})
-
-cur_frm.cscript.refresh = function(doc) {
-	// make sensitive fields(has_serial_no, is_stock_item, valuation_method)
-	// read only if any stock ledger entry exists
-
-	cur_frm.cscript.make_dashboard();
-
-	if (cur_frm.doc.has_variants) {
-		cur_frm.set_intro(__("This Item is a Template and cannot be used in transactions. Item attributes will be copied over into the variants unless 'No Copy' is set"), true);
-		cur_frm.add_custom_button(__("Show Variants"), function() {
-			frappe.set_route("List", "Item", {"variant_of": cur_frm.doc.name});
-		}, "icon-list", "btn-default");
-	}
-	if (cur_frm.doc.variant_of) {
-		cur_frm.set_intro(__("This Item is a Variant of {0} (Template). Attributes will be copied over from the template unless 'No Copy' is set", [cur_frm.doc.variant_of]), true);
-	}
-
-	if (frappe.defaults.get_default("item_naming_by")!="Naming Series") {
-		cur_frm.toggle_display("naming_series", false);
-	} else {
-		erpnext.toggle_naming_series();
-	}
-
-
-	cur_frm.cscript.edit_prices_button();
-
-	if (!doc.__islocal && doc.is_stock_item == 'Yes') {
-		cur_frm.toggle_enable(['has_serial_no', 'is_stock_item', 'valuation_method', 'has_batch_no'],
-			(doc.__onload && doc.__onload.sle_exists=="exists") ? false : true);
-	}
-
-	erpnext.item.toggle_reqd(cur_frm);
-}
-
-erpnext.item.toggle_reqd = function(frm) {
-	frm.toggle_reqd("default_warehouse", frm.doc.is_stock_item==="Yes");
-};
-
-frappe.ui.form.on("Item", "onload", function(frm) {
-	var df = frappe.meta.get_docfield("Item Variant", "item_attribute_value");
-	df.on_make = function(field) {
-		field.$input.autocomplete({
-			minLength: 0,
-			minChars: 0,
-			source: function(request, response) {
-				frappe.call({
-					method:"frappe.client.get_list",
-					args:{
-						doctype:"Item Attribute Value",
-						filters: [
-							["parent","=", field.doc.item_attribute],
-							["attribute_value", "like", request.term + "%"]
-						],
-						fields: ["attribute_value"]
-					},
-					callback: function(r) {
-						response($.map(r.message, function(d) { return d.attribute_value; }));
+frappe.ui.form.on("Item", {
+	onload: function(frm) {
+		var df = frappe.meta.get_docfield("Item Variant", "item_attribute_value");
+		df.on_make = function(field) {
+			field.$input.autocomplete({
+				minLength: 0,
+				minChars: 0,
+				source: function(request, response) {
+					frappe.call({
+						method:"frappe.client.get_list",
+						args:{
+							doctype:"Item Attribute Value",
+							filters: [
+								["parent","=", field.doc.item_attribute],
+								["attribute_value", "like", request.term + "%"]
+							],
+							fields: ["attribute_value"]
+						},
+						callback: function(r) {
+							response($.map(r.message, function(d) { return d.attribute_value; }));
+						}
+					});
+				},
+				select: function(event, ui) {
+					field.$input.val(ui.item.value);
+					field.$input.trigger("change");
+				},
+				focus: function( event, ui ) {
+					if(ui.item.action) {
+						return false;
 					}
-				});
-			},
-			select: function(event, ui) {
-				field.$input.val(ui.item.value);
-				field.$input.trigger("change");
-			},
-			focus: function( event, ui ) {
-				if(ui.item.action) {
-					return false;
+				},
+			});
+		}
+
+		erpnext.item.setup_queries(frm);
+	},
+
+	refresh: function(frm) {
+		if(frm.doc.is_stock_item) {
+			frm.add_custom_button(__("Show Balance"), function() {
+				frappe.route_options = {
+					"item_code": frm.doc.name
 				}
-			},
+				frappe.set_route("query-report", "Stock Balance");
+			});
+		}
+
+		// make sensitive fields(has_serial_no, is_stock_item, valuation_method)
+		// read only if any stock ledger entry exists
+		erpnext.item.make_dashboard(frm);
+
+		if (frm.doc.has_variants) {
+			frm.set_intro(__("This Item is a Template and cannot be used in transactions. Item attributes will be copied over into the variants unless 'No Copy' is set"), true);
+			frm.add_custom_button(__("Show Variants"), function() {
+				frappe.set_route("List", "Item", {"variant_of": frm.doc.name});
+			}, "icon-list", "btn-default");
+		}
+		if (frm.doc.variant_of) {
+			frm.set_intro(__("This Item is a Variant of {0} (Template). Attributes will be copied over from the template unless 'No Copy' is set", [frm.doc.variant_of]), true);
+		}
+
+		if (frappe.defaults.get_default("item_naming_by")!="Naming Series") {
+			frm.toggle_display("naming_series", false);
+		} else {
+			erpnext.toggle_naming_series();
+		}
+
+		erpnext.item.edit_prices_button(frm);
+
+		if (!frm.doc.__islocal && frm.doc.is_stock_item == 'Yes') {
+			frm.toggle_enable(['has_serial_no', 'is_stock_item', 'valuation_method', 'has_batch_no'],
+				(frm.doc.__onload && frm.doc.__onload.sle_exists=="exists") ? false : true);
+		}
+
+		erpnext.item.toggle_reqd(frm);
+	},
+
+	validate: function(frm){
+		erpnext.item.weight_to_validate(frm);
+	},
+
+	image: function(frm) {
+		refresh_field("image_view");
+	},
+
+	page_name: frappe.utils.warn_page_name_change
+
+	item_code: function(frm) {
+		if(!frm.doc.item_name)
+			frm.set_value("item_name", frm.doc.item_code);
+		if(!frm.doc.description)
+			frm.set_value("description", frm.doc.item_code);
+	},
+
+	tax_type: function(frm, cdt, cdn){
+		var d = locals[cdt][cdn];
+		return get_server_fields('get_tax_rate', d.tax_type, 'taxes', doc, cdt, cdn, 1);
+	},
+
+	copy_from_item_group: function(frm) {
+		return frm.call({
+			doc: frm.doc,
+			method: "copy_specification_from_item_group"
 		});
-	}
+	},
 });
 
-cur_frm.cscript.make_dashboard = function() {
-	cur_frm.dashboard.reset();
-	if(cur_frm.doc.__islocal)
-		return;
-}
-
-cur_frm.cscript.edit_prices_button = function() {
-	cur_frm.add_custom_button(__("Add / Edit Prices"), function() {
-		frappe.set_route("Report", "Item Price", {"item_code": cur_frm.doc.name});
-	}, "icon-money", "btn-default");
-}
-
-cur_frm.cscript.item_code = function(doc) {
-	if(!doc.item_name)
-		cur_frm.set_value("item_name", doc.item_code);
-	if(!doc.description)
-		cur_frm.set_value("description", doc.item_code);
-}
-
-// Expense Account
-// ---------------------------------
-cur_frm.fields_dict['expense_account'].get_query = function(doc) {
-	return {
-		filters: {
-			"report_type": "Profit and Loss",
-			"group_or_ledger": "Ledger"
+$.extend(erpnext.item, {
+	setup_queries: function(frm) {
+		// Expense Account
+		// ---------------------------------
+		frm.fields_dict['expense_account'].get_query = function(doc) {
+			return {
+				filters: {
+					"report_type": "Profit and Loss",
+					"group_or_ledger": "Ledger"
+				}
+			}
 		}
-	}
-}
 
-// Income Account
-// --------------------------------
-cur_frm.fields_dict['income_account'].get_query = function(doc) {
-	return {
-		filters: {
-			"report_type": "Profit and Loss",
-			'group_or_ledger': "Ledger",
-			'account_type': "Income Account"
+		// Income Account
+		// --------------------------------
+		frm.fields_dict['income_account'].get_query = function(doc) {
+			return {
+				filters: {
+					"report_type": "Profit and Loss",
+					'group_or_ledger': "Ledger",
+					'account_type': "Income Account"
+				}
+			}
 		}
-	}
-}
 
 
-// Purchase Cost Center
-// -----------------------------
-cur_frm.fields_dict['buying_cost_center'].get_query = function(doc) {
-	return {
-		filters:{ 'group_or_ledger': "Ledger" }
-	}
-}
+		// Purchase Cost Center
+		// -----------------------------
+		frm.fields_dict['buying_cost_center'].get_query = function(doc) {
+			return {
+				filters:{ 'group_or_ledger': "Ledger" }
+			}
+		}
 
 
-// Sales Cost Center
-// -----------------------------
-cur_frm.fields_dict['selling_cost_center'].get_query = function(doc) {
-	return {
-		filters:{ 'group_or_ledger': "Ledger" }
-	}
-}
+		// Sales Cost Center
+		// -----------------------------
+		frm.fields_dict['selling_cost_center'].get_query = function(doc) {
+			return {
+				filters:{ 'group_or_ledger': "Ledger" }
+			}
+		}
 
 
-cur_frm.fields_dict['taxes'].grid.get_field("tax_type").get_query = function(doc, cdt, cdn) {
-	return {
-		filters: [
-			['Account', 'account_type', 'in',
-				'Tax, Chargeable, Income Account, Expense Account'],
-			['Account', 'docstatus', '!=', 2]
-		]
-	}
-}
+		frm.fields_dict['taxes'].grid.get_field("tax_type").get_query = function(doc, cdt, cdn) {
+			return {
+				filters: [
+					['Account', 'account_type', 'in',
+						'Tax, Chargeable, Income Account, Expense Account'],
+					['Account', 'docstatus', '!=', 2]
+				]
+			}
+		}
 
-cur_frm.cscript.tax_type = function(doc, cdt, cdn){
-	var d = locals[cdt][cdn];
-	return get_server_fields('get_tax_rate', d.tax_type, 'taxes', doc, cdt, cdn, 1);
-}
+		frm.fields_dict['item_group'].get_query = function(doc,cdt,cdn) {
+			return {
+				filters: [
+					['Item Group', 'docstatus', '!=', 2]
+				]
+			}
+		}
 
-cur_frm.fields_dict['item_group'].get_query = function(doc,cdt,cdn) {
-	return {
-		filters: [
-			['Item Group', 'docstatus', '!=', 2]
-		]
-	}
-}
+		frm.fields_dict.customer_items.grid.get_field("customer_name").get_query = function(doc, cdt, cdn) {
+			return { query: "erpnext.controllers.queries.customer_query" }
+		}
 
-// Quotation to validation - either customer or lead mandatory
-cur_frm.cscript.weight_to_validate = function(doc, cdt, cdn){
-	if((doc.nett_weight || doc.gross_weight) && !doc.weight_uom) {
-		msgprint(__('Weight is mentioned,\nPlease mention "Weight UOM" too'));
-		validated = 0;
-	}
-}
+		frm.fields_dict.supplier_items.grid.get_field("supplier").get_query = function(doc, cdt, cdn) {
+			return { query: "erpnext.controllers.queries.supplier_query" }
+		}
 
-cur_frm.cscript.validate = function(doc, cdt, cdn){
-	cur_frm.cscript.weight_to_validate(doc, cdt, cdn);
-}
+	},
 
-cur_frm.fields_dict.customer_items.grid.get_field("customer_name").get_query = function(doc, cdt, cdn) {
-	return { query: "erpnext.controllers.queries.customer_query" }
-}
+	toggle_reqd: function(frm) {
+		frm.toggle_reqd("default_warehouse", frm.doc.is_stock_item==="Yes");
+	},
 
-cur_frm.fields_dict.supplier_items.grid.get_field("supplier").get_query = function(doc, cdt, cdn) {
-	return { query: "erpnext.controllers.queries.supplier_query" }
-}
+	make_dashboard: function(frm) {
+		frm.dashboard.reset();
+		if(frm.doc.__islocal)
+			return;
+	},
 
-cur_frm.cscript.copy_from_item_group = function(doc) {
-	return cur_frm.call({
-		doc: doc,
-		method: "copy_specification_from_item_group"
-	});
-}
+	edit_prices_button: function(frm) {
+		frm.add_custom_button(__("Add / Edit Prices"), function() {
+			frappe.set_route("Report", "Item Price", {"item_code": frm.doc.name});
+		}, "icon-money", "btn-default");
+	},
 
-cur_frm.cscript.image = function() {
-	refresh_field("image_view");
-}
+	weight_to_validate: function(frm){
+		if((frm.doc.nett_weight || frm.doc.gross_weight) && !frm.doc.weight_uom) {
+			msgprint(__('Weight is mentioned,\nPlease mention "Weight UOM" too'));
+			validated = 0;
+		}
+	},
+
+});
diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json
index 70826fb..28bfb5a 100644
--- a/erpnext/stock/doctype/item/item.json
+++ b/erpnext/stock/doctype/item/item.json
@@ -772,7 +772,7 @@
    "label": "Page Name", 
    "no_copy": 1, 
    "permlevel": 0, 
-   "read_only": 1
+   "read_only": 0
   }, 
   {
    "depends_on": "show_in_website", 
@@ -876,7 +876,7 @@
  "icon": "icon-tag", 
  "idx": 1, 
  "max_attachments": 1, 
- "modified": "2015-02-24 05:19:07.382483", 
+ "modified": "2015-02-25 02:46:14.483577", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Item",