diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js
index 7e72064..904fc5a 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.js
+++ b/erpnext/hr/doctype/leave_application/leave_application.js
@@ -3,113 +3,116 @@
 
 cur_frm.add_fetch('employee','employee_name','employee_name');
 
-frappe.ui.form.on("Leave Application", "leave_approver", function(frm) {
-	frm.set_value("leave_approver_name", frappe.user.full_name(frm.doc.leave_approver));
-});
+frappe.ui.form.on("Leave Application", {
+	onload: function(frm) {
+		if (!frm.doc.posting_date) {
+			frm.set_value("posting_date", get_today());
+		}
 
-cur_frm.cscript.onload = function(doc, dt, dn) {
-	if(!doc.posting_date)
-		set_multiple(dt,dn,{posting_date:get_today()});
-	if(doc.__islocal) {
-		cur_frm.set_value("status", "Open");
-		cur_frm.cscript.calculate_total_days(doc, dt, dn);
-	}
+		frm.set_query("leave_approver", function() {
+			return {
+				query: "erpnext.hr.doctype.leave_application.leave_application.get_approvers",
+				filters: {
+					employee: frm.doc.employee
+				}
+			};
+		});
 
-	cur_frm.set_query("leave_approver", function() {
-		return {
-			query: "erpnext.hr.doctype.leave_application.leave_application.get_approvers",
-			filters: {
-				employee: cur_frm.doc.employee
-			}
-		};
-	});
+		frm.set_query("employee", erpnext.queries.employee);
 
-	cur_frm.cscript.get_leave_balance(cur_frm.doc);
-}
+	},
 
-cur_frm.cscript.refresh = function(doc, dt, dn) {
-	if(doc.__islocal) {
-		cur_frm.set_value("status", "Open")
-	}
-	cur_frm.set_intro("");
-	if(doc.__islocal && !in_list(user_roles, "HR User")) {
-		cur_frm.set_intro(__("Fill the form and save it"))
-	} else {
-		if(doc.docstatus==0 && doc.status=="Open") {
-			if(user==doc.leave_approver) {
-				cur_frm.set_intro(__("You are the Leave Approver for this record. Please Update the 'Status' and Save"));
-				cur_frm.toggle_enable("status", true);
-			} else {
-				cur_frm.set_intro(__("This Leave Application is pending approval. Only the Leave Approver can update status."))
-				cur_frm.toggle_enable("status", false);
+	refresh: function(frm) {
+		if (frm.is_new()) {
+			frm.set_value("status", "Open");
+			frm.trigger("calculate_total_days");
+		}
+
+		frm.set_intro("");
+		if (frm.is_new() && !in_list(user_roles, "HR User")) {
+			frm.set_intro(__("Fill the form and save it"));
+		} else {
+			if(frm.doc.docstatus==0 && frm.doc.status=="Open") {
+				if(user==frm.doc.leave_approver) {
+					frm.set_intro(__("You are the Leave Approver for this record. Please Update the 'Status' and Save"));
+					frm.toggle_enable("status", true);
+				} else {
+					frm.set_intro(__("This Leave Application is pending approval. Only the Leave Approver can update status."))
+					frm.toggle_enable("status", false);
+				}
 			}
 		}
-	}
-}
+	},
 
-cur_frm.cscript.employee = function (doc, dt, dn){
-	cur_frm.cscript.get_leave_balance(doc, dt, dn);
-}
+	leave_approver: function(frm) {
+		frm.set_value("leave_approver_name", frappe.user.full_name(frm.doc.leave_approver));
+	},
 
-cur_frm.cscript.fiscal_year = function (doc, dt, dn){
-	cur_frm.cscript.get_leave_balance(doc, dt, dn);
-}
+	employee: function(frm) {
+		frm.trigger("get_leave_balance");
+	},
 
-cur_frm.cscript.leave_type = function (doc, dt, dn){
-	cur_frm.cscript.get_leave_balance(doc, dt, dn);
-}
+	fiscal_year: function(frm) {
+		frm.trigger("get_leave_balance");
+	},
 
-cur_frm.cscript.half_day = function(doc, dt, dn) {
-	if(doc.from_date) {
-		set_multiple(dt,dn,{to_date:doc.from_date});
-		cur_frm.cscript.calculate_total_days(doc, dt, dn);
-	}
-}
+	leave_type: function(frm) {
+		frm.trigger("get_leave_balance");
+	},
 
-cur_frm.cscript.from_date = function(doc, dt, dn) {
-	if(cint(doc.half_day) == 1){
-		set_multiple(dt,dn,{to_date:doc.from_date});
-	}
-	cur_frm.cscript.calculate_total_days(doc, dt, dn);
-}
+	half_day: function(frm) {
+		if (frm.doc.from_date) {
+			frm.set_value("to_date", frm.doc.from_date);
+			frm.trigger("calculate_total_days");
+		}
+	},
 
-cur_frm.cscript.to_date = function(doc, dt, dn) {
-	if(cint(doc.half_day) == 1 && cstr(doc.from_date) && doc.from_date != doc.to_date){
-		msgprint(__("To Date should be same as From Date for Half Day leave"));
-		set_multiple(dt,dn,{to_date:doc.from_date});
-	}
-	cur_frm.cscript.calculate_total_days(doc, dt, dn);
-}
+	from_date: function(frm) {
+		if (cint(frm.doc.half_day)==1) {
+			frm.set_value("to_date", frm.doc.from_date);
+		}
+		frm.trigger("calculate_total_days");
+	},
 
-cur_frm.cscript.get_leave_balance = function(doc, dt, dn) {
-	if(doc.docstatus==0 && doc.employee && doc.leave_type && doc.fiscal_year) {
-		return cur_frm.call({
-			method: "get_leave_balance",
-			args: {
-				employee: doc.employee,
-				fiscal_year: doc.fiscal_year,
-				leave_type: doc.leave_type
-			}
-		});
-	}
-}
+	to_date: function(frm) {
+		if (cint(frm.doc.half_day)==1 && cstr(frm.doc.from_date) && frm.doc.from_date != frm.doc.to_date) {
+			msgprint(__("To Date should be same as From Date for Half Day leave"));
+			frm.set_value("to_date", frm.doc.from_date);
+		}
 
-cur_frm.cscript.calculate_total_days = function(doc, dt, dn) {
-	if(doc.from_date && doc.to_date){
-		if(cint(doc.half_day) == 1) set_multiple(dt,dn,{total_leave_days:0.5});
-		else{
-			// server call is done to include holidays in leave days calculations
-			return frappe.call({
-				method: 'erpnext.hr.doctype.leave_application.leave_application.get_total_leave_days',
-				args: {leave_app: doc},
-				callback: function(response) {
-					if (response && response.message) {
-						cur_frm.set_value('total_leave_days', response.message.total_leave_days);
-					}
+		frm.trigger("calculate_total_days");
+	},
+
+	get_leave_balance: function(frm) {
+		if(frm.doc.docstatus==0 && frm.doc.employee && frm.doc.leave_type && frm.doc.fiscal_year) {
+			return frm.call({
+				method: "get_leave_balance",
+				args: {
+					employee: frm.doc.employee,
+					fiscal_year: frm.doc.fiscal_year,
+					leave_type: frm.doc.leave_type
 				}
 			});
 		}
-	}
-}
+	},
 
-cur_frm.fields_dict.employee.get_query = erpnext.queries.employee;
+	calculate_total_days: function(frm) {
+		if(frm.doc.from_date && frm.doc.to_date) {
+			if (cint(frm.doc.half_day)==1) {
+				frm.set_value("total_leave_days", 0.5);
+			} else {
+				// server call is done to include holidays in leave days calculations
+				return frappe.call({
+					method: 'erpnext.hr.doctype.leave_application.leave_application.get_total_leave_days',
+					args: { leave_app: frm.doc },
+					callback: function(response) {
+						if (response && response.message) {
+							frm.set_value('total_leave_days', response.message.total_leave_days);
+						}
+					}
+				});
+			}
+		}
+	},
+
+});
