added leave applications and block lists to calendar
diff --git a/utilities/page/calendar/calendar.js b/utilities/page/calendar/calendar.js
index cac5ec8..aab8f0b 100644
--- a/utilities/page/calendar/calendar.js
+++ b/utilities/page/calendar/calendar.js
@@ -20,6 +20,8 @@
 // OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // 
 
+wn.provide("erpnext.calendar");
+
 pscript.onload_calendar = function(wrapper) {
 	wn.ui.make_app_page({
 		parent: wrapper,
@@ -31,7 +33,81 @@
 	wn.require('lib/js/lib/fullcalendar/fullcalendar.js');
 }
 
-pscript.update_event = function(event) {
+pscript.onshow_calendar = function(wrapper) {
+	if(!wrapper.setup_complete) {
+		erpnext.calendar.setup(wrapper);
+	} else {
+		$("#fullcalendar").fullCalendar("refetchEvents");
+	}
+}
+
+erpnext.calendar.setup = function(wrapper) {
+	wn.model.with_doctype("Event", function() {
+		$('<div id="fullcalendar">').appendTo($(wrapper).find('.layout-main')).fullCalendar({
+			header: {
+				left: 'prev,next today',
+				center: 'title',
+				right: 'month,agendaWeek,agendaDay'
+			},
+			editable: true,
+			selectable: true,
+			selectHelper: true,
+			events: function(start, end, callback) {
+				wn.call({
+					method: 'utilities.page.calendar.calendar.get_events',
+					type: "GET",
+					args: {
+						start: dateutil.obj_to_str(start),
+						end: dateutil.obj_to_str(end),
+						company: wn.user.get_default("company")[0],
+						employee: wn.user.get_default("employee")[0]
+					},
+					callback: function(r) {
+						var events = r.message;
+						$.each(events, function(i, d) { 
+							d.editable = d.owner==user;
+							var options = erpnext.calendar.event_options[d.doctype];
+							if(options && options.prepare)
+								options.prepare(d);
+						});
+						callback(events);
+					}
+				})
+			},
+			eventClick: function(event, jsEvent, view) {
+				// edit event description or delete
+				var options = erpnext.calendar.event_options[event.doctype];
+				if(options && options.click)
+					options.click(event);
+			},
+			eventDrop: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
+				erpnext.calendar.update_event(event);
+			},
+			eventResize: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
+				erpnext.calendar.update_event(event);
+			},
+			select: function(startDate, endDate, allDay, jsEvent, view) {
+				if(jsEvent.day_clicked && view.name=="month")
+					return;
+				var event = wn.model.get_new_doc("Event");
+				event.starts_on = wn.datetime.get_datetime_as_string(startDate);
+				event.ends_on = wn.datetime.get_datetime_as_string(endDate);
+				event.all_day = allDay ? 1 : 0;
+				wn.set_route("Form", "Event", event.name);
+			},
+			dayClick: function(date, allDay, jsEvent, view) {
+				jsEvent.day_clicked = true;
+				$("#fullcalendar").fullCalendar("gotoDate", date)
+				return false;
+			}
+		});
+	});
+
+	wrapper.setup_complete = true;
+	
+}
+
+erpnext.calendar.update_event = function(event) {
 	wn.model.remove_from_locals("Event", event.id);
 	wn.call({
 		module: "utilities",
@@ -40,6 +116,7 @@
 		args: {
 			"start": wn.datetime.get_datetime_as_string(event.start),
 			"end": wn.datetime.get_datetime_as_string(event.end),
+			"all_day": event.allDay,
 			"name": event.id
 		},
 		callback: function(r) {
@@ -50,57 +127,31 @@
 	});
 }
 
-
-pscript.onshow_calendar = function(wrapper) {
-	if(!wrapper.setup_complete) {
-		$('<div id="fullcalendar">').appendTo($(wrapper).find('.layout-main')).fullCalendar({
-			header: {
-				left: 'prev,next today',
-				center: 'title',
-				right: 'month,agendaWeek,agendaDay'
-			},
-			editable: true,
-			events: function(start, end, callback) {
-				wn.call({
-					method: 'utilities.page.calendar.calendar.get_events',
-					type: "GET",
-					args: {
-						start: dateutil.obj_to_str(start),
-						end: dateutil.obj_to_str(end)
-					},
-					callback: function(r) {
-						var events = r.message;
-						$.each(events, function(i, d) { 
-							d.editable = d.owner==user;
-							d.allDay = false; 
-						});
-						callback(events);
-					}
-				})
-			},
-			dayClick: function(date, allDay, jsEvent, view) {
-				// if current date, show popup to create a new event
-				var ev = wn.model.create('Event')
-				ev.doc.set('start', date);
-				ev.doc.set('end', new Date(date));
-				ev.doc.set('all_day', 1);
-
-			},
-			eventClick: function(calEvent, jsEvent, view) {
-				// edit event description or delete
-				wn.set_route("Form", "Event", calEvent.id);
-			},
-			eventDrop: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
-				pscript.update_event(event);
-			},
-			eventResize: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
-				pscript.update_event(event);
+erpnext.calendar.event_options = {
+	"Leave Block List Date": {
+		prepare: function(d) {
+			d.color = "#aaa";
+		}
+	},
+	"Event": {
+		prepare: function(d) {
+			if(d.event_type=="Public") {
+				d.color = "#57AF5B";
 			}
-		});
-
-		wrapper.setup_complete = true;
-	} else {
-		$("#fullcalendar").fullCalendar("refetchEvents");
+		},
+		click: function(event) {
+			wn.set_route("Form", "Event", event.id);
+		}
+	},
+	"Leave Application": {
+		prepare: function(d) {
+			d.color = "#4F9F96";
+		},
+		click: function(event) {
+			if(event.employee==wn.user.get_default("employee")[0]) {
+				wn.set_route("Form", "Leave Application", event.id);
+			}
+		}
 	}
 }
 
diff --git a/utilities/page/calendar/calendar.py b/utilities/page/calendar/calendar.py
index 09b3297..06d4385 100644
--- a/utilities/page/calendar/calendar.py
+++ b/utilities/page/calendar/calendar.py
@@ -1,29 +1,83 @@
 from __future__ import unicode_literals
 
 import webnotes
+from webnotes import _
 
 @webnotes.whitelist()
-def get_events(start, end):
+def get_events(start, end, employee=None, company=None):
 	roles = webnotes.get_roles()
 	events = webnotes.conn.sql("""select name as `id`, subject as title, 
-		starts_on as `start`, ends_on as `end`, "Event" as doctype, owner 
-		from tabEvent where event_date between %s and %s 
+		starts_on as `start`, ends_on as `end`, "Event" as doctype, owner,
+		all_day as allDay, event_type 
+		from tabEvent where (
+			(starts_on between %s and %s)
+			or (ends_on between %s and %s)
+		)
 		and (event_type='Public' or owner=%s
 		or exists(select * from `tabEvent User` where 
 			`tabEvent User`.parent=tabEvent.name and person=%s)
 		or exists(select * from `tabEvent Role` where 
 			`tabEvent Role`.parent=tabEvent.name 
-			and `tabEvent Role`.role in ('%s')))""" % ('%s', '%s', '%s', '%s',
-			"', '".join(roles)), (start, end, 
-			webnotes.session.user, webnotes.session.user), as_dict=1, debug=1)
-	
+			and `tabEvent Role`.role in ('%s')))""" % ('%s', '%s', '%s', '%s', '%s', '%s', 
+			"', '".join(roles)), (start, end, start, end,
+			webnotes.session.user, webnotes.session.user), as_dict=1)
+			
+
+	if employee:
+		add_block_dates(events, start, end, employee, company)
+		add_department_leaves(events, start, end, employee, company)
+
 	return events
-			
-	block_days = webnotes.conn.sql("""select block_date as `start`,
-		name as `id`, reason as `title`, "Holiday List Block Date" as doctype,
-		where block_date between %s and %s
-		and """)
-			
+
+def add_department_leaves(events, start, end, employee, company):
+	department = webnotes.conn.get_value("Employee", employee, "department")
+	
+	if not department:
+		return
+	
+	# department leaves
+	department_employees = webnotes.conn.sql_list("select name from tabEmployee where department=%s", 
+		department)
+	
+	for d in webnotes.conn.sql("""select name, from_date, to_date, employee_name, half_day, 
+		status, employee
+		from `tabLeave Application` where
+		(from_date between %s and %s or to_date between %s and %s)
+		and docstatus < 2
+		and status!="Rejected"
+		and employee in ('%s')""" % ("%s", "%s", "%s", "%s", "', '".join(department_employees)), 
+			(start, end, start, end), as_dict=True):
+			events.append({
+				"id": d.name,
+				"employee": d.employee,
+				"doctype": "Leave Application",
+				"start": d.from_date,
+				"end": d.to_date,
+				"allDay": True,
+				"status": d.status,
+				"title": _("Leave by") + " " +  d.employee_name + \
+					(d.half_day and _(" (Half Day)") or "")
+			})
+	
+
+def add_block_dates(events, start, end, employee, company):
+	# block days
+	from hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates
+
+	cnt = 0
+	block_dates = get_applicable_block_dates(start, end, employee, company, all_lists=True)
+
+	for block_date in block_dates:
+		events.append({
+			"doctype": "Leave Block List Date",
+			"start": block_date.block_date,
+			"title": _("Leave Blocked") + ": " + block_date.reason,
+			"id": "_" + str(cnt),
+			"allDay": True
+		})
+		cnt+=1
+	
+
 @webnotes.whitelist()
 def update_event(name, start, end):
 	webnotes.conn.sql("""update tabEvent set starts_on=%s, ends_on=%s where