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);
+			}
+		}
 	}
 }