Rename Item Variant from Manage Variants feature Added.
diff --git a/erpnext/stock/doctype/manage_variants/manage_variants.js b/erpnext/stock/doctype/manage_variants/manage_variants.js
index 992e2a9..5388cc2 100644
--- a/erpnext/stock/doctype/manage_variants/manage_variants.js
+++ b/erpnext/stock/doctype/manage_variants/manage_variants.js
@@ -39,8 +39,14 @@
 
 	refresh: function(frm) {
 		frm.disable_save();
+		frm.page.set_primary_action(__("Create Variants"), function() {
+			frappe.call({
+				method: "create_variants",
+				doc:frm.doc
+			})
+		});
 	},
-	
+
 	item:function(frm) {
 		return frappe.call({
 			method: "get_item_details",
@@ -51,5 +57,4 @@
 			}
 		})
 	}
-	
 });
diff --git a/erpnext/stock/doctype/manage_variants/manage_variants.json b/erpnext/stock/doctype/manage_variants/manage_variants.json
index bcad045..1ad938d 100644
--- a/erpnext/stock/doctype/manage_variants/manage_variants.json
+++ b/erpnext/stock/doctype/manage_variants/manage_variants.json
@@ -58,14 +58,6 @@
    "options": "Variant Item", 
    "permlevel": 0, 
    "precision": ""
-  }, 
-  {
-   "fieldname": "create_variants", 
-   "fieldtype": "Button", 
-   "label": "Create Variants", 
-   "options": "create_variants", 
-   "permlevel": 0, 
-   "precision": ""
   }
  ], 
  "hide_heading": 0, 
@@ -75,7 +67,7 @@
  "is_submittable": 0, 
  "issingle": 1, 
  "istable": 0, 
- "modified": "2015-05-27 04:43:52.051367", 
+ "modified": "2015-05-28 06:18:03.238411", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Manage Variants", 
diff --git a/erpnext/stock/doctype/manage_variants/manage_variants.py b/erpnext/stock/doctype/manage_variants/manage_variants.py
index 8b96ff9..834b9ef 100644
--- a/erpnext/stock/doctype/manage_variants/manage_variants.py
+++ b/erpnext/stock/doctype/manage_variants/manage_variants.py
@@ -15,8 +15,10 @@
 class ManageVariants(Document):
 
 	def get_item_details(self):
-		self.get_attributes()
-		self.get_variants()
+		self.clear_tables()
+		if self.item:
+			self.get_attributes()
+			self.get_variants()
 		
 	def generate_combinations(self):
 		self.validate_attributes()
@@ -29,6 +31,10 @@
 	def create_variants(self):
 		self.sync_variants()
 	
+	def clear_tables(self):
+		self.set('attributes', [])
+		self.set('variants', [])
+	
 	def get_attributes(self):
 		attributes = {}
 		self.set('attributes', [])
@@ -41,15 +47,14 @@
 				self.append('attributes',{"attribute": d, "attribute_value": value})
 
 	def get_variants(self):
-		self.set('variants', [])
 		variants = [d.name for d in frappe.get_all("Item",
 			filters={"variant_of":self.item})]
 		for d in variants:
 			variant_attributes, attributes = "", []
 			for attribute in frappe.db.sql("""select attribute, attribute_value from `tabVariant Attribute` where parent = %s""", d):
-				variant_attributes += attribute[1] + " "
+				variant_attributes += attribute[1] + " | "
 				attributes.append([attribute[0], attribute[1]])
-			self.append('variants',{"variant": d, "variant_attributes": variant_attributes, "attributes": json.dumps(attributes)})
+			self.append('variants',{"variant": d, "variant_attributes": variant_attributes[: -2], "attributes": json.dumps(attributes)})
 
 	def validate_attributes(self):
 		if not self.attributes:
@@ -112,33 +117,50 @@
 					else:
 						variant_attributes = ""
 						for d in _my_attributes:
-							variant_attributes += d[1] + " "
+							variant_attributes += d[1] + " | "
 						self.append('variants', {"variant": item_code + "-" + value.abbr, 
-							"attributes": json.dumps(_my_attributes), "variant_attributes": variant_attributes})
-
+							"attributes": json.dumps(_my_attributes), "variant_attributes": variant_attributes[: -2]})
 		add_attribute_suffixes(self.item, [], attributes)
 
 	def sync_variants(self):
 		variant_item_codes = []
+		item_variants_attributes = {}
+		inserted, updated, renamed_old, renamed_new, deleted = [], [], [], [], []
+		
 		for v in self.variants:
 			variant_item_codes.append(v.variant)
 
 		existing_variants = [d.name for d in frappe.get_all("Item",
 			filters={"variant_of":self.item})]
+		
+		for d in existing_variants:
+			attributes = []
+			for attribute in frappe.db.sql("""select attribute, attribute_value from `tabVariant Attribute` where parent = %s""", d):
+				attributes.append([attribute[0], attribute[1]])
+			item_variants_attributes.setdefault(d, []).append(attributes)
 
-		inserted, updated, deleted = [], [], []
 		for existing_variant in existing_variants:
 			if existing_variant not in variant_item_codes:
-				frappe.delete_doc("Item", existing_variant)
-				deleted.append(existing_variant)
+				att = item_variants_attributes[existing_variant][0]
+				for variant in self.variants:
+					if sorted(json.loads(variant.attributes) ,key=lambda x: x[0]) == \
+						sorted(att ,key=lambda x: x[0]):
+							rename_variant(existing_variant, variant.variant)
+							renamed_old.append(existing_variant)
+							renamed_new.append(variant.variant)
+
+				if existing_variant not in renamed_old:
+					delete_variant(existing_variant)
+					deleted.append(existing_variant)
 
 		for item_code in variant_item_codes:
 			if item_code not in existing_variants:
-				make_variant(self.item, item_code, self.variants)
-				inserted.append(item_code)
+				if item_code not in renamed_new:
+					make_variant(self.item, item_code, self.variants)
+					inserted.append(item_code)
 			else:
-				update_variant(self.item, existing_variant, self.variants)
-				updated.append(existing_variant)
+				update_variant(self.item, item_code, self.variants)
+				updated.append(item_code)
 
 		if inserted:
 			frappe.msgprint(_("Item Variants {0} created").format(", ".join(inserted)))
@@ -146,6 +168,9 @@
 		if updated:
 			frappe.msgprint(_("Item Variants {0} updated").format(", ".join(updated)))
 
+		if renamed_old:
+			frappe.msgprint(_("Item Variants {0} renamed").format(", ".join(renamed_old)))
+
 		if deleted:
 			frappe.msgprint(_("Item Variants {0} deleted").format(", ".join(deleted)))
 	
@@ -162,6 +187,12 @@
 	copy_attributes_to_variant(template, variant, variant_attribute, insert=True)
 	variant.save()
 
+def rename_variant(old_variant_code, new_variant_code):
+	frappe.rename_doc("Item", old_variant_code, new_variant_code)
+
+def delete_variant(variant_code):
+	frappe.delete_doc("Item", variant_code)
+
 def copy_attributes_to_variant(template, variant, variant_attribute=None, insert=False):
 	from frappe.model import no_value_fields
 	for field in template.meta.fields:
diff --git a/erpnext/stock/doctype/variant_item/variant_item.json b/erpnext/stock/doctype/variant_item/variant_item.json
index 9f10482..13c46ac 100644
--- a/erpnext/stock/doctype/variant_item/variant_item.json
+++ b/erpnext/stock/doctype/variant_item/variant_item.json
@@ -47,7 +47,7 @@
   {
    "fieldname": "attributes", 
    "fieldtype": "Text", 
-   "hidden": 1, 
+   "hidden": 0, 
    "label": "attributes", 
    "permlevel": 0, 
    "precision": "", 
@@ -62,7 +62,7 @@
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
- "modified": "2015-05-28 04:58:20.495616", 
+ "modified": "2015-05-29 02:09:33.622631", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Variant Item",