added todo
diff --git a/erpnext/utilities/page/calendar/__init__.py b/erpnext/utilities/page/calendar/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/calendar/__init__.py
diff --git a/erpnext/utilities/page/calendar/calendar.css b/erpnext/utilities/page/calendar/calendar.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/calendar/calendar.css
diff --git a/erpnext/utilities/page/calendar/calendar.html b/erpnext/utilities/page/calendar/calendar.html
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/calendar/calendar.html
diff --git a/erpnext/utilities/page/calendar/calendar.js b/erpnext/utilities/page/calendar/calendar.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/calendar/calendar.js
diff --git a/erpnext/utilities/page/calendar/calendar.py b/erpnext/utilities/page/calendar/calendar.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/calendar/calendar.py
diff --git a/erpnext/utilities/page/calendar/calendar.txt b/erpnext/utilities/page/calendar/calendar.txt
new file mode 100644
index 0000000..668c909
--- /dev/null
+++ b/erpnext/utilities/page/calendar/calendar.txt
@@ -0,0 +1,28 @@
+# Page, calendar
+[
+
+	# These values are common in all dictionaries
+	{
+		'creation': '2012-02-24 11:24:12',
+		'docstatus': 0,
+		'modified': '2012-02-24 11:24:12',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
+	},
+
+	# These values are common for all Page
+	{
+		'doctype': 'Page',
+		'module': u'Utilities',
+		'name': '__common__',
+		'page_name': u'calendar',
+		'standard': u'Yes',
+		'title': u'Calendar'
+	},
+
+	# Page, calendar
+	{
+		'doctype': 'Page',
+		'name': u'calendar'
+	}
+]
\ No newline at end of file
diff --git a/erpnext/utilities/page/messages/__init__.py b/erpnext/utilities/page/messages/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/messages/__init__.py
diff --git a/erpnext/utilities/page/messages/messages.css b/erpnext/utilities/page/messages/messages.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/messages/messages.css
diff --git a/erpnext/utilities/page/messages/messages.html b/erpnext/utilities/page/messages/messages.html
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/messages/messages.html
diff --git a/erpnext/utilities/page/messages/messages.js b/erpnext/utilities/page/messages/messages.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/messages/messages.js
diff --git a/erpnext/utilities/page/messages/messages.py b/erpnext/utilities/page/messages/messages.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/messages/messages.py
diff --git a/erpnext/utilities/page/messages/messages.txt b/erpnext/utilities/page/messages/messages.txt
new file mode 100644
index 0000000..4ea71b2
--- /dev/null
+++ b/erpnext/utilities/page/messages/messages.txt
@@ -0,0 +1,28 @@
+# Page, messages
+[
+
+	# These values are common in all dictionaries
+	{
+		'creation': '2012-02-24 11:21:57',
+		'docstatus': 0,
+		'modified': '2012-02-24 11:21:57',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
+	},
+
+	# These values are common for all Page
+	{
+		'doctype': 'Page',
+		'module': u'Utilities',
+		'name': '__common__',
+		'page_name': u'messages',
+		'standard': u'Yes',
+		'title': u'Messages'
+	},
+
+	# Page, messages
+	{
+		'doctype': 'Page',
+		'name': u'messages'
+	}
+]
\ No newline at end of file
diff --git a/erpnext/utilities/page/todo/__init__.py b/erpnext/utilities/page/todo/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/todo/__init__.py
diff --git a/erpnext/utilities/page/todo/todo.css b/erpnext/utilities/page/todo/todo.css
new file mode 100644
index 0000000..9f15852
--- /dev/null
+++ b/erpnext/utilities/page/todo/todo.css
@@ -0,0 +1,29 @@
+.todoitem {
+	margin-bottom: 11px;
+	height: 14px;
+}
+
+.todoitem .label {
+	width: 50px;
+	display: inline-block;
+	text-align: center;
+	margin-right: 7px;
+}
+
+.todoitem .close {
+	margin-left: 14px;
+	font-size: 14px;
+	float: left;
+}
+
+.todoitem .ref_link {
+	float: left;
+	margin-left: 14px;
+	display: inline-block;
+	line-height: 18px;
+}
+
+.todoitem .description {
+	cursor: pointer;
+	float: left;
+}
\ No newline at end of file
diff --git a/erpnext/utilities/page/todo/todo.html b/erpnext/utilities/page/todo/todo.html
new file mode 100644
index 0000000..aa46d97
--- /dev/null
+++ b/erpnext/utilities/page/todo/todo.html
@@ -0,0 +1,10 @@
+<div class="layout-wrapper" style="min-height: 300px">	
+	<a class="close" onclick="window.history.back();">&times;</a>
+	<h1>To Do</h1>
+	<br>
+	<div id="todo-list">
+	</div>
+	<div style="margin-top: 21px">
+		<button id="add-todo" class="btn btn-small"><i class="icon-plus"></i> Add</button>
+	</div>
+</div>
\ No newline at end of file
diff --git a/erpnext/utilities/page/todo/todo.js b/erpnext/utilities/page/todo/todo.js
new file mode 100644
index 0000000..2691912
--- /dev/null
+++ b/erpnext/utilities/page/todo/todo.js
@@ -0,0 +1,132 @@
+wn.provide('erpnext.todo');
+
+erpnext.todo.refresh = function() {
+	wn.call({
+		method: 'utilities.page.todo.todo.get',
+		callback: function(r,rt) {
+			$('#todo-list').empty();
+			if(r.message) {
+				for(var i in r.message) {
+					new erpnext.todo.ToDoItem(r.message[i]);
+				}
+			} else {
+				$('#todo-list').html('<div class="help-box">Nothing to do :)</div>');
+			}
+		}
+	});
+	
+	$('#add-todo').click(function() {
+		erpnext.todo.make_dialog({
+			date:get_today(), priority:'Medium', checked:0, description:''});
+	})
+}
+
+erpnext.todo.ToDoItem = Class.extend({
+	init: function(todo) {
+		label_map = {
+			'High': 'label-important',
+			'Medium': 'label-info',
+			'Low':''
+		}
+		todo.labelclass = label_map[todo.priority];
+		todo.userdate = dateutil.str_to_user(todo.date);
+		$('#todo-list').append(repl('<div class="todoitem">\
+				<span class="description">\
+					<span class="label %(labelclass)s">%(priority)s</span>\
+					<span class="help" style="margin-right: 7px">%(userdate)s</span>\
+					%(description)s</span>\
+					<span class="ref_link">&rarr;\
+					<a href="#!Form/%(reference_type)s/%(reference_name)s">\
+						[%(reference_name)s]</a></span>\
+					<a href="#" class="close">&times;</a>\
+		</div>', todo));
+		$todo = $('div.todoitem:last');
+		
+		if(todo.checked) {
+			$todo.find('.description').css('text-decoration', 'line-through');
+		}
+		
+		if(!todo.reference_name)
+			$todo.find('.ref_link').toggle(false);
+		
+		$todo.find('.description')
+			.data('todo', todo)
+			.click(function() {
+				erpnext.todo.make_dialog($(this).data('todo'));
+				return false;
+			});
+			
+		$todo.find('.close')
+			.data('name', todo.name)
+			.click(function() {
+				$(this).parent().css('opacity', 0.5);
+				wn.call({
+					method:'utilities.page.todo.todo.delete',
+					args: {name: $(this).data('name')},
+					callback: function() {
+						erpnext.todo.refresh();
+					}
+				});
+				return false;
+			})
+	}
+});
+
+erpnext.todo.make_dialog = function(det) {
+	if(!erpnext.todo.dialog) {
+		var dialog = new wn.widgets.Dialog();
+		dialog.make({
+			width: 480,
+			title: 'To Do', 
+			fields: [
+				{fieldtype:'Date', fieldname:'date', label:'Event Date', reqd:1},
+				{fieldtype:'Text', fieldname:'description', label:'Description', reqd:1},
+				{fieldtype:'Check', fieldname:'checked', label:'Completed'},
+				{fieldtype:'Select', fieldname:'priority', label:'Priority', reqd:1, 'options':['Medium','High','Low'].join('\n')},
+				{fieldtype:'Button', fieldname:'save', label:'Save'}
+			]
+		});
+		
+		dialog.fields_dict.save.input.onclick = function() {
+			erpnext.todo.save(this);	
+		}
+		erpnext.todo.dialog = dialog;
+	}
+
+	if(det) {
+		erpnext.todo.dialog.set_values({
+			date: det.date,
+			priority: det.priority,
+			description: det.description,
+			checked: det.checked
+		});
+		erpnext.todo.dialog.det = det;		
+	}
+	erpnext.todo.dialog.show();
+	
+}
+
+erpnext.todo.save = function(btn) {
+	var d = erpnext.todo.dialog;
+	var det = d.get_values();
+	
+	if(!det) {
+	 	return;
+	}
+	
+	det.name = d.det.name || '';
+	wn.call({
+		method:'utilities.page.todo.todo.edit',
+		args: det,
+		btn: btn,
+		callback: function() {
+			erpnext.todo.dialog.hide();
+			erpnext.todo.refresh();
+		}
+	});
+}
+
+pscript.onload_todo = function() {
+	// load todos
+	erpnext.todo.refresh();
+}
\ No newline at end of file
diff --git a/erpnext/utilities/page/todo/todo.py b/erpnext/utilities/page/todo/todo.py
new file mode 100644
index 0000000..c10809e
--- /dev/null
+++ b/erpnext/utilities/page/todo/todo.py
@@ -0,0 +1,46 @@
+import webnotes
+from webnotes.model.doc import Document
+
+@webnotes.whitelist()
+def get(arg=None):
+	"""get todo list"""
+	return webnotes.conn.sql("""select name, owner, description, date,
+		priority, checked, reference_type, reference_name, assigned_by
+		from `tabToDo Item` where owner=%s 
+		order by field(priority, 'High', 'Medium', 'Low') asc, date asc""",
+		webnotes.session['user'], as_dict=1)
+
+@webnotes.whitelist()		
+def edit(arg=None):
+	args = webnotes.form_dict
+
+	d = Document('ToDo Item', args.get('name') or None)
+	d.description = args['description']
+	d.date = args['date']
+	d.priority = args['priority']
+	d.checked = args.get('checked', 0)
+	d.owner = webnotes.session['user']
+	d.save(not args.get('name') and 1 or 0)
+
+	if args.get('name') and d.checked:
+		notify_assignment(d)
+
+	return d.name
+
+@webnotes.whitelist()
+def delete(arg=None):
+	name = webnotes.form_dict['name']
+	d = Document('ToDo Item', name)
+	if d and d.name:
+		notify_assignment(d)
+	webnotes.conn.sql("delete from `tabToDo Item` where name = %s", name)
+
+def notify_assignment(d):
+	doc_type = d.reference_type
+	doc_name = d.reference_name
+	assigned_by = d.assigned_by
+	
+	if doc_type and doc_name and assigned_by:
+		from webnotes.widgets.form import assign_to
+		assign_to.notify_assignment(assigned_by, d.owner, doc_type, doc_name)
+		
\ No newline at end of file
diff --git a/erpnext/utilities/page/todo/todo.txt b/erpnext/utilities/page/todo/todo.txt
new file mode 100644
index 0000000..7310906
--- /dev/null
+++ b/erpnext/utilities/page/todo/todo.txt
@@ -0,0 +1,28 @@
+# Page, todo
+[
+
+	# These values are common in all dictionaries
+	{
+		'creation': '2012-02-23 13:59:03',
+		'docstatus': 0,
+		'modified': '2012-02-23 13:59:03',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
+	},
+
+	# These values are common for all Page
+	{
+		'doctype': 'Page',
+		'module': u'Utilities',
+		'name': '__common__',
+		'page_name': u'todo',
+		'standard': u'Yes',
+		'title': u'To Do'
+	},
+
+	# Page, todo
+	{
+		'doctype': 'Page',
+		'name': u'todo'
+	}
+]
\ No newline at end of file