diff --git a/erpnext/utilities/page/calendar/calendar.css b/erpnext/utilities/page/calendar/calendar.css
index e69de29..bcf7cce 100644
--- a/erpnext/utilities/page/calendar/calendar.css
+++ b/erpnext/utilities/page/calendar/calendar.css
@@ -0,0 +1,178 @@
+/**** CALENDAR ****/
+
+div.cal_body {
+	margin: 16px;
+	background-color: #DDD;
+	position: relative;
+	border-radius: 5px;
+	-moz-border-radius: 5px;
+	-webkit-border-radius: 5px;	
+	padding: 16px;
+	-moz-box-shadow: 1px 1px 8px #555;
+	-webkit-box-shadow: 1px 1px 8px #555;
+	box-shadow: 1px 1px 8px #555;
+}
+
+div.cal_body h4 {
+	text-align: center;
+}
+
+div.cal_head {
+	margin: 16px;
+	margin-bottom: 0px;
+}
+div.cal_head div {
+	font-size: 18px;
+	color: #666;
+	padding-top: 8px;
+}
+
+div.cal_toolbar {
+}
+
+div.cal_toolbar .btn {
+	text-align: center;
+	margin: 0px;
+	margin-left: -1px;
+}
+
+div.cal_view_body {
+}
+
+div.cal_view_body_plain {
+	margin: 16px;
+}
+
+div.cal_month_head {
+	margin: 8px 0px 8px 0px;
+	height: 30px;
+}
+
+div.cal_month_head .btn {
+	float: right;
+}
+
+span.cal_view_title {
+	display: inline-block;
+	font-size: 20px;
+}
+
+div.cal_month_body {
+}
+
+.cal_month_headtable {
+	/*table-layout:fixed;*/
+	width: 100%;
+}
+
+.cal_month_name {
+	width: 100%;
+	color: #888;
+	font-size: 14px;
+	font-weight: bold;
+	text-align: center;
+}
+
+.cal_month_headtable tr td{
+	font-size: 12px;
+	font-weight: bold;
+	text-align: center;
+	padding: 4px;
+}
+
+table.cal_month_table {
+	border-collapse: collapse;
+	/*table-layout:fixed;*/
+	width: 100%;
+}
+
+table.cal_month_table td {
+	width: 14.29%;
+	height: 20%;
+	/*overflow:hidden;*/
+	padding:0px;
+}
+
+div.cal_month_date {
+	width:100%;
+	font-size: 10px;
+	/*background-color: #EEF;*/
+}
+
+div.cal_month_date_holiday {
+	/*background-color: #FFF;*/
+}
+
+div.cal_month_unit {
+	width:100%;
+	min-height: 100px;
+	overflow:hidden;
+	cursor:pointer;
+	/*background-color:#FFF;*/
+}
+	
+div.cal_vu_disabled {
+	background-color:#FFF;
+	cursor:default;
+}
+
+table.cal_day_table {
+	border-collapse: collapse;
+	width: 100%;
+}
+
+table.cal_day_table td {
+}
+
+div.cal_day_body {
+	width: 100%;
+	overflow-x: hidden;
+	border-top: 1px solid #AAA;
+}
+
+div.cal_day_unit{
+	width:100%;
+	cursor:pointer;
+}
+
+table.cal_week_table {
+	border-collapse: collapse;
+	width: 100%;
+}
+
+table.cal_week_table td {
+	width: 12.5%;
+}
+
+div.cal_week_body {
+	width: 100%;
+	overflow-x: hidden;
+	border-top: 1px solid #888;
+}
+
+div.cal_week_unit{
+	width: 100%;
+	cursor:pointer;
+}
+
+div.cal_event {
+	width: 100%;
+	height: 12px;
+	overflow: hidden;
+	font-size: 11px;
+	color: #00B;
+	margin-bottom: 2px;
+	text-decoration: underline;
+}
+
+div.cal_event_Public {
+	color: GREEN;
+}
+
+div.cal_event_Private {
+	color: BLUE;
+}
+
+div.cal_event_hover {
+	text-decoration: underline;
+}
diff --git a/erpnext/utilities/page/calendar/calendar.html b/erpnext/utilities/page/calendar/calendar.html
index e69de29..2a5150e 100644
--- a/erpnext/utilities/page/calendar/calendar.html
+++ b/erpnext/utilities/page/calendar/calendar.html
@@ -0,0 +1,26 @@
+<div class="cal_body">
+	<a class="close" href="#" onclick="window.history.back();return false;">&times;</a>
+	<div class="cal_toolbar btn-group">
+		<button class="btn btn-small" onclick="erpnext.calendar.add_event()">
+			<i class="icon-plus"></i> Add Event
+		</button>
+		<button class="btn btn-small" onclick="erpnext.calendar.refresh('Day')">
+			Day View
+		</button>
+		<button class="btn btn-small" onclick="erpnext.calendar.refresh('Week')">
+			Week View
+		</button>
+		<button class="btn btn-small" onclick="erpnext.calendar.refresh('Month')">
+			Month View
+		</button>
+	</div>
+	<div class="cal_month_head">
+		<span class="cal_view_title"></span>
+		<button class="btn btn-small" onclick="erpnext.calendar.cur_view.next()">
+			<i class="icon-arrow-right"></i>
+		</button>
+		<button class="btn btn-small" onclick="erpnext.calendar.cur_view.prev()">
+			<i class="icon-arrow-left"></i>
+		</button>
+	</div>
+</div>
\ No newline at end of file
diff --git a/erpnext/utilities/page/calendar/calendar.js b/erpnext/utilities/page/calendar/calendar.js
index e69de29..6e59f21 100644
--- a/erpnext/utilities/page/calendar/calendar.js
+++ b/erpnext/utilities/page/calendar/calendar.js
@@ -0,0 +1,679 @@
+// Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com)
+// 
+// MIT License (MIT)
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a 
+// copy of this software and associated documentation files (the "Software"), 
+// to deal in the Software without restriction, including without limitation 
+// the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+// and/or sell copies of the Software, and to permit persons to whom the 
+// Software is furnished to do so, subject to the following conditions:
+// 
+// The above copyright notice and this permission notice shall be included in 
+// all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
+// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
+// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+// 
+
+pscript.onload_calendar = function(wrapper) {
+	if(!erpnext.calendar) {
+		erpnext.calendar = new Calendar();
+		erpnext.calendar.init(wrapper);
+		rename_observers.push(erpnext.calendar);
+	}
+}
+
+///// CALENDAR
+
+Calendar=function() {
+	this.views=[];
+	this.events = {};
+	this.has_event = {};
+	this.events_by_name = {};
+	this.weekdays = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
+}
+
+Calendar.prototype.init=function (parent) {
+
+	this.wrapper = parent;
+ 	this.body = $('.cal_body').get(0);
+
+ 	//this.make_head_buttons();
+ 	//this.make_header();
+	this.view_title = $('.cal_view_title').get(0);
+ 	
+	this.todays_date = new Date();
+	this.selected_date = this.todays_date;
+	this.selected_hour = 8;
+
+	// Create views
+	this.views['Month'] = new Calendar.MonthView(this);
+	this.views['Week'] = new Calendar.WeekView(this);
+	this.views['Day'] = new Calendar.DayView(this);
+
+	// Month view as initial
+	this.cur_view = this.views['Day'];
+	this.views['Day'].show();
+	
+}
+
+Calendar.prototype.rename_notify = function(dt, old_name, new_name) {
+	// calendar
+	if(dt = 'Event' && this.has_event[old_name])
+		this.has_event[old_name] = false;	
+}
+
+//------------------------------------------------------
+
+Calendar.prototype.show_event = function(ev, cal_ev) {
+	var me = this;
+	if(!this.event_dialog) {
+		var d = new Dialog(400, 400, 'Calendar Event');
+		d.make_body([
+			['HTML','Heading']
+			,['Text','Description']
+			,['Check', 'Public Event']
+			,['Check', 'Cancel Event']
+			,['HTML', 'Event Link']
+			,['Button', 'Save']
+		])
+		
+		// show the event when the dialog opens
+		d.onshow = function() {
+			// heading
+			var c = me.selected_date;
+			var tmp = time_to_ampm(this.ev.event_hour);
+			tmp = tmp[0]+':'+tmp[1]+' '+tmp[2];
+			
+			this.widgets['Heading'].innerHTML = 
+				'<div style="text-align: center; padding:4px; font-size: 14px">'
+				+ erpnext.calendar.weekdays[c.getDay()] + ', ' + c.getDate() + ' ' + month_list_full[c.getMonth()] + ' ' + c.getFullYear() 
+				+ ' - <b>'+tmp+'</b></div>';
+			
+			// set
+			this.widgets['Description'].value = cstr(this.ev.description);
+			
+			this.widgets['Public Event'].checked = false;
+			this.widgets['Cancel Event'].checked = false;
+
+			if(this.ev.event_type=='Public')
+				this.widgets['Public Event'].checked = true;
+			
+			this.widgets['Event Link'].innerHTML = '';
+
+			// link
+			var div = $a(this.widgets['Event Link'], 'div', 'link_type', {margin:'4px 0px'});
+			div.onclick = function() { me.event_dialog.hide(); loaddoc('Event', me.event_dialog.ev.name); }
+			div.innerHTML = 'View Event details, add or edit participants';
+				
+		}
+		
+		// event save
+		d.widgets['Save'].onclick = function() {
+			var d = me.event_dialog;
+			
+			// save values
+			d.ev.description = d.widgets['Description'].value;
+			if(d.widgets['Cancel Event'].checked) d.ev.event_type='Cancel';
+			else if(d.widgets['Public Event'].checked) d.ev.event_type='Public';
+			
+			me.event_dialog.hide();
+			
+			// if new event
+			if(d.cal_ev)
+				var cal_ev = d.cal_ev;
+			else 
+				var cal_ev = me.set_event(d.ev);
+
+			cal_ev.save();
+			if(me.cur_view)me.cur_view.refresh();			
+		}
+		this.event_dialog = d;
+	}
+	this.event_dialog.ev = ev;
+	this.event_dialog.cal_ev = cal_ev ? cal_ev : null;
+	this.event_dialog.show();
+	
+}
+
+//------------------------------------------------------
+
+Calendar.prototype.add_event = function() {
+		
+	var ev = LocalDB.create('Event');
+	ev = locals['Event'][ev];
+	
+	ev.event_date = dateutil.obj_to_str(this.selected_date);
+	ev.event_hour = this.selected_hour+':00';
+	ev.event_type = 'Private';
+
+	this.show_event(ev);
+}
+//------------------------------------------------------
+
+Calendar.prototype.get_month_events = function(call_back) {
+	// ret fn
+	var me = this;
+	var f = function(r, rt) {
+		if(me.cur_view) me.cur_view.refresh();
+		if(call_back)call_back();
+	}
+
+	//load
+	var y=this.selected_date.getFullYear(); var m = this.selected_date.getMonth();
+	if(!this.events[y] || !this.events[y][m]) {
+		$c('webnotes.widgets.event.load_month_events', args = {
+			'month': m + 1, 
+			'year' : y},
+			f);	
+	}
+}
+//------------------------------------------------------
+
+Calendar.prototype.get_daily_event_list=function(day) {
+	var el = [];
+	var d = day.getDate(); var m = day.getMonth(); var y = day.getFullYear()
+	if(this.events[y] && this.events[y][m] &&
+		this.events[y][m][d]) {
+		var l = this.events[y][m][d]
+		for(var i in l) {
+			for(var j in l[i]) el[el.length] = l[i][j];
+		}
+		return el;
+	}
+	else return [];
+}
+//------------------------------------------------------
+
+Calendar.prototype.set_event = function(ev) {
+	// don't duplicate
+	if(this.events_by_name[ev.name]) {
+		return;
+	}
+		
+	var dt = dateutil.str_to_obj(ev.event_date);
+	var m = dt.getMonth();
+	var d = dt.getDate();
+	var y = dt.getFullYear();
+
+	if(!this.events[y]) this.events[y] = [];
+	if(!this.events[y][m]) this.events[y][m] = [];
+	if(!this.events[y][m][d]) this.events[y][m][d] = [];
+	if(!this.events[y][m][d][cint(cint(ev.event_hour))]) 
+		this.events[y][m][d][cint(ev.event_hour)] = [];
+
+	var cal_ev = new Calendar.CalEvent(ev, this);
+	this.events[y][m][d][cint(ev.event_hour)].push(cal_ev);	
+	this.events_by_name[ev.name] = cal_ev;
+	this.has_event[ev.name] = true;
+	
+	return cal_ev;
+}
+//------------------------------------------------------
+
+Calendar.prototype.refresh = function(viewtype){//Sets the viewtype of the Calendar and Calls the View class based on the viewtype
+ 	if(viewtype)
+ 		this.viewtype = viewtype;
+ 	// switch view if reqd
+ 	if(this.cur_view.viewtype!=this.viewtype) {
+ 		this.cur_view.hide();
+ 		this.cur_view = this.views[this.viewtype];
+ 		this.cur_view.in_home = false; // for home page
+ 		this.cur_view.show();
+ 	}
+ 	else{
+ 		this.cur_view.refresh(this);
+ 	}
+}
+
+//------------------------------------------------------
+
+Calendar.CalEvent= function(doc, cal) {
+	this.body = document.createElement('div');
+	var v = locals['Event'][doc.name].description;
+	if(v==null)v='';
+	this.body.innerHTML = v;
+
+	this.doc = doc;
+	var me = this;
+
+	this.body.onclick = function() {
+		if(me.doc.name) {
+			cal.show_event(me.doc, me);
+		}
+	}
+}
+
+Calendar.CalEvent.prototype.show = function(vu) {
+
+	var t = this.doc.event_type;
+	this.my_class = 'cal_event cal_event_'+ t;
+	
+	if(this.body.parentNode)
+		this.body.parentNode.removeChild(this.body);
+	vu.body.appendChild(this.body);
+	
+	// refresh
+	var v = this.doc.description;
+	if(v==null)v='';
+	this.body.innerHTML = v;
+	this.body.className = this.my_class;
+}
+
+Calendar.CalEvent.prototype.save = function() {
+	var me = this;
+	save_doclist('Event', me.doc.name, 'Save', function(r) { 
+		me.doc = locals['Event'][r.docname];
+		erpnext.calendar.has_event[r.docname] = true;
+	} );
+}
+// ----------
+
+Calendar.View =function() { this.daystep = 0; this.monthstep = 0; }
+Calendar.View.prototype.init=function(cal) {
+ 	this.cal = cal;
+ 	this.body = $a(cal.body, 'div', 'cal_view_body');
+ 	this.body.style.display = 'none';
+ 	this.create_table();
+}
+
+
+Calendar.View.prototype.show=function() { 
+	this.get_events(); this.refresh(); this.body.style.display = 'block'; 
+}
+
+Calendar.View.prototype.hide=function() { this.body.style.display = 'none';}
+
+Calendar.View.prototype.next = function() {
+	var s = this.cal.selected_date;
+	this.cal.selected_date = new Date(s.getFullYear(), s.getMonth() + this.monthstep, s.getDate() + this.daystep);
+	this.get_events(); this.refresh();
+}
+
+Calendar.View.prototype.prev = function() {
+	var s = this.cal.selected_date;
+	this.cal.selected_date = new Date(s.getFullYear(), s.getMonth() - this.monthstep, s.getDate() - this.daystep);
+	this.get_events(); this.refresh();
+}
+
+Calendar.View.prototype.get_events = function() { 
+	this.cal.get_month_events(); 
+}
+Calendar.View.prototype.add_unit = function(vu) { 
+	this.viewunits[this.viewunits.length] = vu; 
+}
+Calendar.View.prototype.refresh_units = function() { 
+	// load the events
+	if(locals['Event']) {
+		for(var name in locals['Event']) {
+			this.cal.set_event(locals['Event'][name]);
+		}
+	}
+	
+	
+	for(var r in this.table.rows) {
+		for(var c in this.table.rows[r].cells) {
+			if(this.table.rows[r].cells[c].viewunit) {
+				this.table.rows[r].cells[c].viewunit.refresh();
+			}
+		}
+	}
+}
+
+// ................. Month View..........................
+Calendar.MonthView = function(cal) { this.init(cal); this.monthstep = 1; this.rows = 5; this.cells = 7; }
+Calendar.MonthView.prototype=new Calendar.View();
+Calendar.MonthView.prototype.create_table = function() {
+
+	// create head
+	this.head_wrapper = $a(this.body, 'div', 'cal_month_head');
+
+	// create headers
+	this.headtable = $a(this.head_wrapper, 'table', 'cal_month_headtable');
+	var r = this.headtable.insertRow(0);
+	for(var j=0;j<7;j++) {
+ 		var cell = r.insertCell(j);
+		cell.innerHTML = erpnext.calendar.weekdays[j]; $w(cell, (100 / 7) + '%');
+ 	}
+
+	this.main = $a(this.body, 'div', 'cal_month_body');
+	this.table = $a(this.main, 'table', 'cal_month_table');
+	var me = this;
+
+	// create body
+ 	for(var i=0;i<5;i++) {
+ 		var r = this.table.insertRow(i);
+ 		for(var j=0;j<7;j++) {
+ 			var cell = r.insertCell(j);
+			cell.viewunit = new Calendar.MonthViewUnit(cell);
+ 		}
+  	}  	
+}
+
+Calendar.MonthView.prototype.refresh = function() {
+ 	var c =this.cal.selected_date;
+	var	me=this;
+	// fill other days
+
+	var cur_row = 0; 
+
+ 	var cur_month = c.getMonth();
+ 	var cur_year = c.getFullYear();
+
+ 	var d = new Date(cur_year, cur_month, 1);
+	var day = 1 - d.getDay();
+	
+
+	// set day headers
+ 	var d = new Date(cur_year, cur_month, day);
+
+	this.cal.view_title.innerHTML = month_list_full[cur_month] + ' ' + cur_year;
+
+ 	for(var i=0;i<6;i++) {
+ 		if((i<5) || cur_month==d.getMonth()) { // if this month
+	 		for(var j=0;j<7;j++) {
+				var cell = this.table.rows[cur_row].cells[j];
+
+		 		if((i<5) || cur_month==d.getMonth()) {	// if this month
+					cell.viewunit.day = d;
+					cell.viewunit.hour = 8;
+			 		if(cur_month == d.getMonth()) {
+						cell.viewunit.is_disabled = false;
+	
+						if(same_day(this.cal.todays_date, d))
+							cell.viewunit.is_today = true;
+						else
+							cell.viewunit.is_today = false;					
+						
+					} else {
+						cell.viewunit.is_disabled = true;
+					}
+				}
+				// new date
+	 			day++;
+		 		d = new Date(cur_year, cur_month, day);
+	 		}
+	 	}
+		cur_row++;
+ 		if(cur_row == 5) {cur_row = 0;} // back to top
+	}
+	this.refresh_units();
+	
+}
+ // ................. Daily View..........................
+Calendar.DayView=function(cal){ this.init(cal); this.daystep = 1; }
+Calendar.DayView.prototype=new Calendar.View();
+Calendar.DayView.prototype.create_table = function() {
+
+	// create body
+	this.main = $a(this.body, 'div', 'cal_day_body');
+	this.table = $a(this.main, 'table', 'cal_day_table');
+	var me = this;
+	
+ 	for(var i=0;i<24;i++) {
+ 		var r = this.table.insertRow(i);
+ 		for(var j=0;j<2;j++) {
+ 			var cell = r.insertCell(j);
+			if(j==0) {
+				var tmp = time_to_ampm((i)+':00');
+				cell.innerHTML = tmp[0]+':'+tmp[1]+' '+tmp[2];
+				$w(cell, '10%');
+			} else {
+				cell.viewunit = new Calendar.DayViewUnit(cell);
+				cell.viewunit.hour = i;
+				$w(cell, '90%');
+				if((i>=7)&&(i<=20)) {
+					cell.viewunit.is_daytime = true;
+				}
+			}
+ 		}
+  	}
+ }
+
+Calendar.DayView.prototype.refresh = function() {
+	var c =this.cal.selected_date;
+			
+	// fill other days
+	var me=this;
+
+	this.cal.view_title.innerHTML = erpnext.calendar.weekdays[c.getDay()] + ', ' 
+		+ c.getDate() + ' ' + month_list_full[c.getMonth()] + ' ' + c.getFullYear();
+
+	// headers
+	var d = c;
+
+	for(var i=0;i<24;i++) {
+		var cell = this.table.rows[i].cells[1];
+		if(same_day(this.cal.todays_date, d)) cell.viewunit.is_today = true;
+		else cell.viewunit.is_today = false;
+		cell.viewunit.day = d;
+	}
+	 this.refresh_units();
+}
+
+// ................. Weekly View..........................
+Calendar.WeekView=function(cal) { this.init(cal); this.daystep = 7; }
+Calendar.WeekView.prototype=new Calendar.View();
+Calendar.WeekView.prototype.create_table = function() {
+
+	// create head
+	this.head_wrapper = $a(this.body, 'div', 'cal_month_head');
+
+	// day headers
+	this.headtable = $a(this.head_wrapper, 'table', 'cal_month_headtable');
+	var r = this.headtable.insertRow(0);
+	for(var j=0;j<8;j++) {
+ 		var cell = r.insertCell(j);
+		$w(cell, (100 / 8) + '%');
+ 	}
+ 	
+ 	// hour header
+
+	// create body
+	this.main = $a(this.body, 'div', 'cal_week_body');
+	this.table = $a(this.main, 'table', 'cal_week_table');
+	var me = this;
+	
+ 	for(var i=0;i<24;i++) {
+ 		var r = this.table.insertRow(i);
+ 		for(var j=0;j<8;j++) {
+ 			var cell = r.insertCell(j);
+			if(j==0) {
+				var tmp = time_to_ampm(i+':00');
+				cell.innerHTML = tmp[0]+':'+tmp[1]+' '+tmp[2];
+
+				$w(cell, '10%');
+			} else {
+				cell.viewunit = new Calendar.WeekViewUnit(cell);
+				cell.viewunit.hour = i;
+				if((i>=7)&&(i<=20)) {
+					cell.viewunit.is_daytime = true;
+				}
+			}
+ 		}
+  	}
+}
+
+Calendar.WeekView.prototype.refresh = function() {
+	var c =this.cal.selected_date;
+	// fill other days
+	var me=this;
+
+	this.cal.view_title.innerHTML = month_list_full[c.getMonth()] + ' ' + c.getFullYear();
+
+	// headers
+	var d = new Date(c.getFullYear(), c.getMonth(), c.getDate() - c.getDay());
+
+	for (var k=1;k<8;k++) 	{
+		this.headtable.rows[0].cells[k].innerHTML = erpnext.calendar.weekdays[d.getDay()] + ' ' + d.getDate();
+
+		for(var i=0;i<24;i++) {
+			var cell = this.table.rows[i].cells[k];
+			if(same_day(this.cal.todays_date, d)) 
+				cell.viewunit.is_today = true;
+			else cell.viewunit.is_today = false;
+
+			cell.viewunit.day = d;
+			//cell.viewunit.refresh();
+		}
+		d=new Date(d.getFullYear(),d.getMonth(),d.getDate() + 1);
+
+	 }
+	 
+	 this.refresh_units();
+}
+
+//------------------------------------------------------.
+
+Calendar.ViewUnit = function() {}
+Calendar.ViewUnit.prototype.init = function(parent) {
+	parent.style.border = "1px solid #CCC"	;
+	this.body = $a(parent, 'div', this.default_class);
+	this.parent = parent;
+
+	var me = this;
+	this.body.onclick = function() {
+		erpnext.calendar.selected_date = me.day;
+		erpnext.calendar.selected_hour = me.hour;
+	
+		if(erpnext.calendar.cur_vu && erpnext.calendar.cur_vu!=me){
+			erpnext.calendar.cur_vu.deselect();
+			me.select();
+			erpnext.calendar.cur_vu = me;
+		}
+	}
+	this.body.ondblclick = function() {
+		erpnext.calendar.add_event();
+	}
+}
+
+Calendar.ViewUnit.prototype.set_header=function(v) {
+ 	this.header.innerHTML = v;
+}
+
+Calendar.ViewUnit.prototype.set_today = function() {
+	this.is_today = true;
+	this.set_display();
+}
+
+Calendar.ViewUnit.prototype.clear = function() {
+	if(this.header)this.header.innerHTML = '';
+
+	// clear body
+	while(this.body.childNodes.length)
+		this.body.removeChild(this.body.childNodes[0]);
+}
+
+Calendar.ViewUnit.prototype.set_display = function() {
+	var cn = '#FFF';
+
+	// colors
+	var col_tod_sel = '#EEE';
+	var col_tod = '#FFF';
+	var col_sel = '#EEF';
+
+	if(this.is_today) {
+		if(this.selected) cn = col_tod_sel;
+		else cn = col_tod;
+	} else 
+		if(this.selected) cn = col_sel;
+	
+	if(this.header) {
+		if(this.is_disabled) {
+			this.body.className = this.default_class + ' cal_vu_disabled';
+			this.header.style.color = '#BBB';
+		} else {
+			this.body.className = this.default_class;
+			this.header.style.color = '#000';		
+		}
+		
+		if(this.day&&this.day.getDay()==0)
+			this.header.style.backgroundColor = '#FEE';
+		else 
+			this.header.style.backgroundColor = '';
+	}
+	this.parent.style.backgroundColor = cn;
+}
+
+Calendar.ViewUnit.prototype.is_selected = function() {
+	return (same_day(this.day, erpnext.calendar.selected_date)
+		&& this.hour==erpnext.calendar.selected_hour)
+}
+
+Calendar.ViewUnit.prototype.get_event_list = function() {
+	var y = this.day.getFullYear();
+	var m = this.day.getMonth();
+	var d = this.day.getDate();
+	if(erpnext.calendar.events[y] && erpnext.calendar.events[y][m] &&
+		erpnext.calendar.events[y][m][d] &&
+			erpnext.calendar.events[y][m][d][this.hour]) {
+		return erpnext.calendar.events[y][m][d][this.hour];
+	} else
+		return [];
+}
+
+Calendar.ViewUnit.prototype.refresh = function() {
+	this.clear();
+
+	if(this.is_selected()) { 
+		if(erpnext.calendar.cur_vu)erpnext.calendar.cur_vu.deselect();
+		this.selected = true;
+		erpnext.calendar.cur_vu = this;	
+	}
+	this.set_display();
+	this.el = this.get_event_list();
+	if(this.onrefresh)this.onrefresh();	
+
+	for(var i in this.el) {
+		this.el[i].show(this);
+	}
+		
+	var me = this;
+}
+
+Calendar.ViewUnit.prototype.select=function() { this.selected = true; this.set_display(); }
+Calendar.ViewUnit.prototype.deselect=function() { this.selected = false; this.set_display(); }
+Calendar.ViewUnit.prototype.setevent=function() { }
+
+Calendar.MonthViewUnit=function(parent) {
+	this.header = $a(parent, 'div' , "cal_month_date");
+	this.default_class = "cal_month_unit";
+	
+	this.init(parent);
+
+	this.onrefresh = function() {
+		this.header.innerHTML = this.day.getDate();
+	} 
+}
+Calendar.MonthViewUnit.prototype = new Calendar.ViewUnit();
+Calendar.MonthViewUnit.prototype.is_selected = function() {
+	return same_day(this.day, erpnext.calendar.selected_date)
+}
+
+Calendar.MonthViewUnit.prototype.get_event_list = function() {
+	return erpnext.calendar.get_daily_event_list(this.day);
+}
+
+Calendar.DayViewUnit= function(parent) { 
+	this.default_class = "cal_day_unit"; this.init(parent); 
+}
+Calendar.DayViewUnit.prototype = new Calendar.ViewUnit();
+Calendar.DayViewUnit.prototype.onrefresh = function() {
+	if(this.el.length<3) 
+		this.body.style.height = '30px';
+	else this.body.style.height = '';
+}
+
+Calendar.WeekViewUnit=function(parent) { 
+	this.default_class = "cal_week_unit"; this.init(parent); 
+}
+Calendar.WeekViewUnit.prototype = new Calendar.ViewUnit();
+Calendar.WeekViewUnit.prototype.onrefresh = function() {
+	if(this.el.length<3) this.body.style.height = '30px';
+	else this.body.style.height = '';
+}
diff --git a/erpnext/utilities/page/todo/todo.css b/erpnext/utilities/page/todo/todo.css
index 9f15852..4ac49d6 100644
--- a/erpnext/utilities/page/todo/todo.css
+++ b/erpnext/utilities/page/todo/todo.css
@@ -1,5 +1,7 @@
 .todoitem {
-	margin-bottom: 11px;
+	padding-bottom: 11px;
+	border-bottom: 1px solid #DEB85F;
+	margin-bottom: 5px;
 	height: 14px;
 }
 
diff --git a/erpnext/utilities/page/todo/todo.html b/erpnext/utilities/page/todo/todo.html
index aa46d97..3400455 100644
--- a/erpnext/utilities/page/todo/todo.html
+++ b/erpnext/utilities/page/todo/todo.html
@@ -1,4 +1,4 @@
-<div class="layout-wrapper" style="min-height: 300px">	
+<div class="layout-wrapper" style="min-height: 300px; background-color: #FFFDC9">	
 	<a class="close" onclick="window.history.back();">&times;</a>
 	<h1>To Do</h1>
 	<br>
