diff --git a/erpnext/accounts/page/chart_of_accounts/__init__.py b/erpnext/accounts/page/chart_of_accounts/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/page/chart_of_accounts/__init__.py
diff --git a/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.css b/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.css
new file mode 100644
index 0000000..00e05d4
--- /dev/null
+++ b/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.css
@@ -0,0 +1,21 @@
+.cell-title {
+	font-weight: bold;
+}
+
+.cell-effort-driven {
+	text-align: center;
+}
+
+.toggle {
+	height: 9px;
+	width: 9px;
+	display: inline-block;
+}
+
+.toggle.expand {
+	background: url(images/expand.gif) no-repeat center center;
+}
+
+.toggle.collapse {
+	background: url(images/collapse.gif) no-repeat center center;
+}
\ No newline at end of file
diff --git a/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.html b/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.html
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.html
diff --git a/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.js b/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.js
new file mode 100644
index 0000000..7cf5648
--- /dev/null
+++ b/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.js
@@ -0,0 +1,282 @@
+// ERPNext - web based ERP (http://erpnext.com)
+// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+// 
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+// 
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
+// GNU General Public License for more details.
+// 
+// You should have received a copy of the GNU General Public License
+// along with this program.	If not, see <http://www.gnu.org/licenses/>.
+
+/* todo
+ 	- load / display chart of accounts
+	- settings for company, start date, end data
+	- load balances
+	- open ledger on link
+*/
+
+wn.pages['chart-of-accounts'].onload = function(wrapper) { 
+	wn.ui.make_app_page({
+		parent: wrapper,
+		title: 'Chart of Accounts',
+		single_column: true
+	});
+	erpnext.coa.company_select = wrapper.appframe.add_select("Company", ["Loading..."]);
+	erpnext.coa.opening_date = wrapper.appframe.add_date("Opening Date")
+		.val(dateutil.str_to_user(sys_defaults.year_start_date));
+	erpnext.coa.closing_date = wrapper.appframe.add_date("Closing Date")
+		.val(dateutil.obj_to_user(new Date()));
+	
+	$('<div id="chart-of-accounts" style="height: 500px; border: 1px solid #aaa;">\
+		</div>').appendTo($(wrapper).find('.layout-main'));
+	
+	wn.call({
+		module: "accounts",
+		page: "chart_of_accounts",
+		method: "get_companies",
+		callback: function(r) {
+			erpnext.coa.company_select.empty().add_options(r.message.companies).change();
+			erpnext.coa.fiscal_years = r.message.fiscal_years;
+		}
+	});
+	
+	erpnext.coa.company_select.change(function() {
+		erpnext.coa.load_slickgrid();
+		erpnext.coa.load_data($(this).val());
+	});
+	
+	erpnext.coa.opening_date.change(erpnext.coa.refresh);
+	erpnext.coa.closing_date.change(erpnext.coa.refresh);
+}
+
+erpnext.coa = {
+	load_slickgrid: function() {
+		// load tree
+		wn.require('js/lib/jquery/jquery.ui.sortable');
+		wn.require('js/lib/slickgrid/slick.grid.css');
+		wn.require('js/lib/slickgrid/slick-default-theme.css');
+		wn.require('js/lib/slickgrid/jquery.event.drag.min.js');
+		wn.require('js/lib/slickgrid/slick.core.js');
+		wn.require('js/lib/slickgrid/slick.formatters.js');
+		wn.require('js/lib/slickgrid/slick.grid.js');
+		wn.require('js/lib/slickgrid/slick.dataview.js');
+		wn.dom.set_style('.slick-cell { font-size: 12px; }');		
+	},
+	refresh: function() {
+		erpnext.coa.prepare_balances();
+		erpnext.coa.render();
+	},
+	load_data: function(company) {
+		wn.call({
+			module: "accounts",
+			page: "chart_of_accounts",
+			method: "get_chart",
+			args: {company: company},
+			callback: function(r) {
+				erpnext.coa.gl = r.message.gl;
+				erpnext.coa.prepare_chart(r.message.chart);
+				erpnext.coa.prepare_balances();
+				erpnext.coa.render();
+			}
+		})
+	},
+	prepare_chart: function(indata) {
+		var data = [];
+		var parent_map = {};
+		var data_by_name = {};
+		$.each(indata, function(i, v) {
+			if(v[0]) {
+				var d = {
+					"id": v[0],
+					"name": v[0],
+					"parent": v[1],
+					"opening": 0,
+					"debit": 0,
+					"credit": 0,
+					"closing": 0,
+					"debit_or_credit": v[2],
+					"is_pl": v[3]
+				};
+
+				data.push(d);
+				data_by_name[d.name] = d;
+				if(d.parent) {
+					parent_map[d.name] = d.parent;
+				}		
+			}
+		});
+		erpnext.coa.set_indent(data, parent_map);
+		erpnext.coa.data = data;
+		erpnext.coa.parent_map = parent_map;
+		erpnext.coa.data_by_name = data_by_name;
+	},
+	prepare_balances: function() {
+		var gl = erpnext.coa.gl;
+		var opening_date = dateutil.user_to_obj(erpnext.coa.opening_date.val());
+		var closing_date = dateutil.user_to_obj(erpnext.coa.closing_date.val());
+		var fiscal_year = erpnext.coa.get_fiscal_year(opening_date, closing_date);
+		if (!fiscal_year) return;
+		
+		$.each(erpnext.coa.data, function(i, v) {
+			v.opening = v.debit = v.credit = v.closing = 0;
+		});
+		
+		$.each(gl, function(i, v) {
+			var posting_date = dateutil.str_to_obj(v[0]);
+			var account = erpnext.coa.data_by_name[v[1]];
+			// opening
+			if (posting_date < opening_date || v[4] === "Yes") {
+				if (account.is_pl === "Yes" && posting_date <= dateutil.str_to_obj(fiscal_year[1])) {
+					// balance of previous fiscal_year should 
+					//	not be part of opening of pl account balance
+				} else {
+					if (account.debit_or_credit === "Debit") {
+						account.opening += (v[2] - v[3]);
+					} else {
+						account.opening += (v[3] - v[2]);
+					}
+				}
+			} else if (opening_date <= posting_date && posting_date <= closing_date) {
+				// in between
+				account.debit += v[2];
+				account.credit += v[3];
+			}
+			// closing
+			if (account.debit_or_credit === "Debit") {
+				account.closing = account.opening + account.debit - account.credit;
+			} else {
+				account.closing = account.opening + account.credit - account.debit;
+			}
+		});
+		
+		// format amount
+		$.each(erpnext.coa.data, function(i, v) {
+			v.opening = fmt_money(v.opening);
+			v.debit = fmt_money(v.debit);
+			v.credit = fmt_money(v.credit);
+			v.closing = fmt_money(v.closing);
+		});
+	},
+	get_fiscal_year: function(opening_date, closing_date) {
+		if (opening_date > closing_date) {
+			msgprint("Opening Date should be before Closing Date");
+			return;
+		}
+		
+		var fiscal_year = null;
+		$.each(erpnext.coa.fiscal_years, function(i, v) {
+			if (opening_date >= dateutil.str_to_obj(v[1]) && 
+				closing_date <= dateutil.str_to_obj(v[2])) {
+					fiscal_year = v;
+				}
+		});
+		
+		if (!fiscal_year) {
+			msgprint("Opening Date and Closing Date should be within same Fiscal Year");
+			return;
+		}
+		return fiscal_year;
+	},
+	set_indent: function(data, parent_map) {
+		$.each(data, function(i, d) {
+			var indent = 0;
+			var parent = parent_map[d.name];
+			if(parent) {
+				while(parent) {
+					indent++;
+					parent = parent_map[parent];
+				}				
+			}
+			d.indent = indent;
+		});
+	},
+	render: function() {
+		// initialize the model
+		erpnext.coa.dataView = new Slick.Data.DataView({ inlineFilters: true });
+		erpnext.coa.dataView.beginUpdate();
+		erpnext.coa.dataView.setItems(erpnext.coa.data);
+		erpnext.coa.dataView.setFilter(erpnext.coa.filter)
+		erpnext.coa.dataView.endUpdate();
+
+		var columns = [
+			{id: "name", name: "Account", field: "name", width: 400, cssClass: "cell-title", 
+				formatter: erpnext.coa.account_formatter},
+			{id: "opening", name: "Opening", field: "opening"},
+			{id: "debit", name: "Debit", field: "debit"},
+			{id: "credit", name: "Credit", field: "credit"},
+			{id: "closing", name: "Closing", field: "closing"}			
+		];
+		
+		var options = {
+			editable: false,
+			enableColumnReorder: false
+		};
+
+		// initialize the grid
+		var grid = new Slick.Grid("#chart-of-accounts", erpnext.coa.dataView, columns, options);
+		erpnext.coa.add_events(grid);
+		erpnext.coa.grid = grid;
+	},
+	add_events: function(grid) {
+		grid.onClick.subscribe(function (e, args) {
+			if ($(e.target).hasClass("toggle")) {
+				var item = erpnext.coa.dataView.getItem(args.row);
+				if (item) {
+					if (!item._collapsed) {
+						item._collapsed = true;
+					} else {
+						item._collapsed = false;
+					}
+
+					erpnext.coa.dataView.updateItem(item.id, item);
+				}
+				e.stopImmediatePropagation();
+			}
+		});
+
+		erpnext.coa.dataView.onRowsChanged.subscribe(function (e, args) {
+			grid.invalidateRows(args.rows);
+			grid.render();
+		});
+		
+		erpnext.coa.dataView.onRowCountChanged.subscribe(function (e, args) {
+			grid.updateRowCount();
+			grid.render();
+		});
+		
+	},
+	filter: function(item) {
+		if (item.parent) {
+			var parent = item.parent;
+			while (parent) {
+				if (erpnext.coa.data_by_name[parent]._collapsed) {
+					return false;
+				}
+				parent = erpnext.coa.parent_map[parent];
+			}
+		}
+		return true;
+	},
+	account_formatter: function (row, cell, value, columnDef, dataContext) {
+		value = value.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
+		var data = erpnext.coa.data;
+		var spacer = "<span style='display:inline-block;height:1px;width:" + 
+			(15 * dataContext["indent"]) + "px'></span>";
+		var idx = erpnext.coa.dataView.getIdxById(dataContext.id);
+		if (data[idx + 1] && data[idx + 1].indent > data[idx].indent) {
+			if (dataContext._collapsed) {
+				return spacer + " <span class='toggle expand'></span>&nbsp;" + value;
+			} else {
+				return spacer + " <span class='toggle collapse'></span>&nbsp;" + value;
+			}
+		} else {
+			return spacer + " <span class='toggle'></span>&nbsp;" + value;
+		}
+	}
+}
diff --git a/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.py b/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.py
new file mode 100644
index 0000000..14984fb
--- /dev/null
+++ b/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.py
@@ -0,0 +1,37 @@
+import webnotes
+
+@webnotes.whitelist()
+def get_chart():
+	company = webnotes.form_dict.get('company')
+	res = {}
+	res["chart"] = webnotes.conn.sql("""select name, parent_account, debit_or_credit, is_pl_account from 
+		tabAccount where company=%s and docstatus < 2 order by lft""", (company, ))
+	res["gl"] = webnotes.conn.sql("""select posting_date, account, ifnull(debit, 0), 
+		ifnull(credit, 0), ifnull(is_opening, 'No')
+		from `tabGL Entry` where company=%s and ifnull(is_cancelled, "No") = "No" 
+		order by posting_date""", (company, ))
+	return res
+
+@webnotes.whitelist()
+def get_companies():
+	"""get a list of companies based on permission"""
+	
+	# check if match permission exists
+	res = webnotes.conn.sql("""select role, `match` from `tabDocPerm`
+		where parent='Account' and permlevel=0 and `read`=1""", as_dict=1)
+		
+	match = any((r["match"] for r in res 
+		if r["role"] in webnotes.user.roles and r["match"]=="company"))
+	
+	# if match == company is specified and companies are specified in user defaults
+	res = {}
+	if match and webnotes.user.get_defaults().get("company"):
+		res["companies"] = webnotes.user.get_defaults().get("company")
+	else:
+		res["companies"] = [r[0] for r in webnotes.conn.sql("""select name from tabCompany
+			where docstatus!=2""")]
+	res["fiscal_years"] = webnotes.conn.sql("""select name, year_start_date, 
+		adddate(year_start_date, interval 1 year)
+		from `tabFiscal Year` where docstatus!=2 
+		order by year_start_date asc""")
+	return res
diff --git a/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.txt b/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.txt
new file mode 100644
index 0000000..e9d5ab5
--- /dev/null
+++ b/erpnext/accounts/page/chart_of_accounts/chart_of_accounts.txt
@@ -0,0 +1,28 @@
+# Page, chart-of-accounts
+[
+
+	# These values are common in all dictionaries
+	{
+		'creation': '2012-09-12 14:43:52',
+		'docstatus': 0,
+		'modified': '2012-09-12 14:43:53',
+		'modified_by': u'Administrator',
+		'owner': u'Administrator'
+	},
+
+	# These values are common for all Page
+	{
+		'doctype': 'Page',
+		'module': u'Accounts',
+		'name': '__common__',
+		'page_name': u'Chart of Accounts',
+		'standard': u'Yes',
+		'title': u'Chart of Accounts'
+	},
+
+	# Page, chart-of-accounts
+	{
+		'doctype': 'Page',
+		'name': u'chart-of-accounts'
+	}
+]
\ No newline at end of file
diff --git a/public/images/collapse.gif b/public/images/collapse.gif
new file mode 100644
index 0000000..01e6914
--- /dev/null
+++ b/public/images/collapse.gif
Binary files differ
diff --git a/public/images/expand.gif b/public/images/expand.gif
new file mode 100644
index 0000000..1b24ef1
--- /dev/null
+++ b/public/images/expand.gif
Binary files differ
diff --git a/public/js/all-app.js b/public/js/all-app.js
index 3728430..24204e8 100644
--- a/public/js/all-app.js
+++ b/public/js/all-app.js
@@ -183,7 +183,7 @@
 wn.dom.set_box_shadow=function(ele,spread){$(ele).css('-moz-box-shadow','0px 0px '+spread+'px rgba(0,0,0,0.3);')
 $(ele).css('-webkit-box-shadow','0px 0px '+spread+'px rgba(0,0,0,0.3);')
 $(ele).css('-box-shadow','0px 0px '+spread+'px rgba(0,0,0,0.3);')};(function($){$.fn.add_options=function(options_list){for(var i=0;i<options_list.length;i++){var v=options_list[i];value=v.value||v;label=v.label||v;$('<option>').html(label).attr('value',value).appendTo(this);}
-$(this).val(options_list[0].value||options_list[0]);}
+return $(this).val(options_list[0].value||options_list[0]);}
 $.fn.set_working=function(){var ele=this.get(0);$(ele).attr('disabled','disabled');if(ele.loading_img){$(ele.loading_img).toggle(true);}else{ele.loading_img=$('<img src="images/lib/ui/button-load.gif" \
     style="margin-left: 4px; margin-bottom: -2px; display: inline;" />').insertAfter(ele);}}
 $.fn.done_working=function(){var ele=this.get(0);$(ele).attr('disabled',null);if(ele.loading_img){$(ele.loading_img).toggle(false);};}})(jQuery);
@@ -494,7 +494,7 @@
 else if(user_fmt=='dd/mm/yyyy'){var d=d.split('/');return d[2]+'-'+d[1]+'-'+d[0];}
 else if(user_fmt=='yyyy-mm-dd'){return d;}
 else if(user_fmt=='mm/dd/yyyy'){var d=d.split('/');return d[2]+'-'+d[0]+'-'+d[1];}
-else if(user_fmt=='mm-dd-yyyy'){var d=d.split('-');return d[2]+'-'+d[0]+'-'+d[1];}},global_date_format:function(d){if(d.substr)d=this.str_to_obj(d);return nth(d.getDate())+' '+month_list_full[d.getMonth()]+' '+d.getFullYear();},get_today:function(){var today=new Date();var m=(today.getMonth()+1)+'';if(m.length==1)m='0'+m;var d=today.getDate()+'';if(d.length==1)d='0'+d;return today.getFullYear()+'-'+m+'-'+d;},get_cur_time:function(){var d=new Date();var hh=d.getHours()+''
+else if(user_fmt=='mm-dd-yyyy'){var d=d.split('-');return d[2]+'-'+d[0]+'-'+d[1];}},user_to_obj:function(d){return dateutil.str_to_obj(dateutil.user_to_str(d));},global_date_format:function(d){if(d.substr)d=this.str_to_obj(d);return nth(d.getDate())+' '+month_list_full[d.getMonth()]+' '+d.getFullYear();},get_today:function(){var today=new Date();var m=(today.getMonth()+1)+'';if(m.length==1)m='0'+m;var d=today.getDate()+'';if(d.length==1)d='0'+d;return today.getFullYear()+'-'+m+'-'+d;},get_cur_time:function(){var d=new Date();var hh=d.getHours()+''
 var mm=cint(d.getMinutes()/5)*5+''
 return(hh.length==1?'0'+hh:hh)+':'+(mm.length==1?'0'+mm:mm);}}
 wn.datetime.only_date=function(val){if(val==null||val=='')return null;if(val.search(':')!=-1){var tmp=val.split(' ');var d=tmp[0].split('-');}else{var d=val.split('-');}
@@ -852,14 +852,14 @@
    <span class="appframe-title"></span>\
    <span class="close">&times;</span>\
   </div>').appendTo(this.$w);this.$w.find('.close').click(function(){window.history.back();})
-if(title)this.title(title);},title:function(txt){this.clear_breadcrumbs();this.add_breadcrumb(txt);},make_toolbar:function(){if(!this.$w.find('.appframe-toolbar').length)
-this.$w.append('<div class="appframe-toolbar"></div>');},add_button:function(label,click,icon){this.make_toolbar();args={label:label,icon:''};if(icon){args.icon='<i class="icon '+icon+'"></i>';}
+if(title)this.title(title);},title:function(txt){this.clear_breadcrumbs();this.add_breadcrumb(txt);},add_button:function(label,click,icon){this.add_toolbar();args={label:label,icon:''};if(icon){args.icon='<i class="icon '+icon+'"></i>';}
 this.buttons[label]=$(repl('<button class="btn btn-small">\
-   %(icon)s %(label)s</button>',args)).click(click).appendTo(this.$w.find('.appframe-toolbar'));return this.buttons[label];},add_help_button:function(txt){this.make_toolbar();$('<button class="btn btn-small" style="float:right;" button-type="help">\
-   <b>?</b></button>').data('help-text',txt).click(function(){msgprint($(this).data('help-text'),'Help');}).appendTo(this.$w.find('.appframe-toolbar'));},clear_buttons:function(){this.$w.find('.appframe-toolbar').empty();},add_breadcrumb:function(html){if(!this.$breadcrumbs)
+   %(icon)s %(label)s</button>',args)).click(click).appendTo(this.toolbar);return this.buttons[label];},add_help_button:function(txt){this.make_toolbar();$('<button class="btn btn-small" style="float:right;" button-type="help">\
+   <b>?</b></button>').data('help-text',txt).click(function(){msgprint($(this).data('help-text'),'Help');}).appendTo(this.toolbar);},clear_buttons:function(){this.toolbar&&this.toolbar.empty();},add_breadcrumb:function(html){if(!this.$breadcrumbs)
 this.$breadcrumbs=$('</span>\
     <span class="breadcrumb-area"></span>').appendTo(this.$titlebar);var crumb=$('<span>').html(html);if(!this.$breadcrumbs.find('span').length){crumb.addClass('appframe-title');}
-crumb.appendTo(this.$breadcrumbs);},clear_breadcrumbs:function(){this.$breadcrumbs&&this.$breadcrumbs.empty();}});wn.ui.make_app_page=function(opts){if(opts.single_column){$(opts.parent).html('<div class="layout-wrapper layout-wrapper-appframe">\
+crumb.appendTo(this.$breadcrumbs);},clear_breadcrumbs:function(){this.$breadcrumbs&&this.$breadcrumbs.empty();},add_toolbar:function(){if(!this.toolbar)
+this.$w.append('<div class="appframe-toolbar"></div>');this.toolbar=this.$w.find('.appframe-toolbar');},add_select:function(label,options){this.add_toolbar();return $("<select style='width: 160px;'>").add_options(options).appendTo(this.add_label(label));},add_label:function(label){return $("<span style='margin-right: 12px;'>"+label+" </span>").appendTo(this.toolbar);},add_date:function(label,date){this.add_toolbar();return $("<input style='width: 80px;'>").datepicker({dateFormat:sys_defaults.date_format.replace("yyyy","yy"),changeYear:true,}).val(dateutil.str_to_user(date)||"").appendTo(this.add_label(label));},});wn.ui.make_app_page=function(opts){if(opts.single_column){$(opts.parent).html('<div class="layout-wrapper layout-wrapper-appframe">\
    <div class="layout-appframe"></div>\
    <div class="layout-main"></div>\
   </div>');}else{$(opts.parent).html('<div class="layout-wrapper layout-wrapper-background">\
@@ -1824,7 +1824,7 @@
 $(callingfield.input).set_working();$c('runserverobj',{'docs':doclist,'method':scriptname},function(r,rtxt){if(onrefresh)
 onrefresh(r,rtxt);me.refresh_fields();me.refresh_dependency();if(callingfield)
 $(callingfield.input).done_working();});}}
-_f.Frm.prototype.runclientscript=function(caller,cdt,cdn){if(!cdt)cdt=this.doctype;if(!cdn)cdn=this.docname;var ret=null;var doc=cur_frm.doc;try{if(this.cscript[caller])
+_f.Frm.prototype.runclientscript=function(caller,cdt,cdn){if(!cdt)cdt=this.doctype;if(!cdn)cdn=this.docname;var ret=null;var doc=locals[cur_frm.doc.doctype][cur_frm.doc.name];try{if(this.cscript[caller])
 ret=this.cscript[caller](doc,cdt,cdn);if(this.cscript['custom_'+caller])
 ret+=this.cscript['custom_'+caller](doc,cdt,cdn);}catch(e){console.log(e);}
 if(caller&&caller.toLowerCase()=='setup'){var doctype=get_local('DocType',this.doctype);var cs=doctype.__js||(doctype.client_script_core+doctype.client_script);if(cs){try{var tmp=eval(cs);}catch(e){console.log(e);}}
diff --git a/public/js/all-web.js b/public/js/all-web.js
index bdecfd4..2f9de38 100644
--- a/public/js/all-web.js
+++ b/public/js/all-web.js
@@ -70,7 +70,7 @@
 wn.dom.set_box_shadow=function(ele,spread){$(ele).css('-moz-box-shadow','0px 0px '+spread+'px rgba(0,0,0,0.3);')
 $(ele).css('-webkit-box-shadow','0px 0px '+spread+'px rgba(0,0,0,0.3);')
 $(ele).css('-box-shadow','0px 0px '+spread+'px rgba(0,0,0,0.3);')};(function($){$.fn.add_options=function(options_list){for(var i=0;i<options_list.length;i++){var v=options_list[i];value=v.value||v;label=v.label||v;$('<option>').html(label).attr('value',value).appendTo(this);}
-$(this).val(options_list[0].value||options_list[0]);}
+return $(this).val(options_list[0].value||options_list[0]);}
 $.fn.set_working=function(){var ele=this.get(0);$(ele).attr('disabled','disabled');if(ele.loading_img){$(ele.loading_img).toggle(true);}else{ele.loading_img=$('<img src="images/lib/ui/button-load.gif" \
     style="margin-left: 4px; margin-bottom: -2px; display: inline;" />').insertAfter(ele);}}
 $.fn.done_working=function(){var ele=this.get(0);$(ele).attr('disabled',null);if(ele.loading_img){$(ele.loading_img).toggle(false);};}})(jQuery);
@@ -381,7 +381,7 @@
 else if(user_fmt=='dd/mm/yyyy'){var d=d.split('/');return d[2]+'-'+d[1]+'-'+d[0];}
 else if(user_fmt=='yyyy-mm-dd'){return d;}
 else if(user_fmt=='mm/dd/yyyy'){var d=d.split('/');return d[2]+'-'+d[0]+'-'+d[1];}
-else if(user_fmt=='mm-dd-yyyy'){var d=d.split('-');return d[2]+'-'+d[0]+'-'+d[1];}},global_date_format:function(d){if(d.substr)d=this.str_to_obj(d);return nth(d.getDate())+' '+month_list_full[d.getMonth()]+' '+d.getFullYear();},get_today:function(){var today=new Date();var m=(today.getMonth()+1)+'';if(m.length==1)m='0'+m;var d=today.getDate()+'';if(d.length==1)d='0'+d;return today.getFullYear()+'-'+m+'-'+d;},get_cur_time:function(){var d=new Date();var hh=d.getHours()+''
+else if(user_fmt=='mm-dd-yyyy'){var d=d.split('-');return d[2]+'-'+d[0]+'-'+d[1];}},user_to_obj:function(d){return dateutil.str_to_obj(dateutil.user_to_str(d));},global_date_format:function(d){if(d.substr)d=this.str_to_obj(d);return nth(d.getDate())+' '+month_list_full[d.getMonth()]+' '+d.getFullYear();},get_today:function(){var today=new Date();var m=(today.getMonth()+1)+'';if(m.length==1)m='0'+m;var d=today.getDate()+'';if(d.length==1)d='0'+d;return today.getFullYear()+'-'+m+'-'+d;},get_cur_time:function(){var d=new Date();var hh=d.getHours()+''
 var mm=cint(d.getMinutes()/5)*5+''
 return(hh.length==1?'0'+hh:hh)+':'+(mm.length==1?'0'+mm:mm);}}
 wn.datetime.only_date=function(val){if(val==null||val=='')return null;if(val.search(':')!=-1){var tmp=val.split(' ');var d=tmp[0].split('-');}else{var d=val.split('-');}
@@ -513,14 +513,14 @@
    <span class="appframe-title"></span>\
    <span class="close">&times;</span>\
   </div>').appendTo(this.$w);this.$w.find('.close').click(function(){window.history.back();})
-if(title)this.title(title);},title:function(txt){this.clear_breadcrumbs();this.add_breadcrumb(txt);},make_toolbar:function(){if(!this.$w.find('.appframe-toolbar').length)
-this.$w.append('<div class="appframe-toolbar"></div>');},add_button:function(label,click,icon){this.make_toolbar();args={label:label,icon:''};if(icon){args.icon='<i class="icon '+icon+'"></i>';}
+if(title)this.title(title);},title:function(txt){this.clear_breadcrumbs();this.add_breadcrumb(txt);},add_button:function(label,click,icon){this.add_toolbar();args={label:label,icon:''};if(icon){args.icon='<i class="icon '+icon+'"></i>';}
 this.buttons[label]=$(repl('<button class="btn btn-small">\
-   %(icon)s %(label)s</button>',args)).click(click).appendTo(this.$w.find('.appframe-toolbar'));return this.buttons[label];},add_help_button:function(txt){this.make_toolbar();$('<button class="btn btn-small" style="float:right;" button-type="help">\
-   <b>?</b></button>').data('help-text',txt).click(function(){msgprint($(this).data('help-text'),'Help');}).appendTo(this.$w.find('.appframe-toolbar'));},clear_buttons:function(){this.$w.find('.appframe-toolbar').empty();},add_breadcrumb:function(html){if(!this.$breadcrumbs)
+   %(icon)s %(label)s</button>',args)).click(click).appendTo(this.toolbar);return this.buttons[label];},add_help_button:function(txt){this.make_toolbar();$('<button class="btn btn-small" style="float:right;" button-type="help">\
+   <b>?</b></button>').data('help-text',txt).click(function(){msgprint($(this).data('help-text'),'Help');}).appendTo(this.toolbar);},clear_buttons:function(){this.toolbar&&this.toolbar.empty();},add_breadcrumb:function(html){if(!this.$breadcrumbs)
 this.$breadcrumbs=$('</span>\
     <span class="breadcrumb-area"></span>').appendTo(this.$titlebar);var crumb=$('<span>').html(html);if(!this.$breadcrumbs.find('span').length){crumb.addClass('appframe-title');}
-crumb.appendTo(this.$breadcrumbs);},clear_breadcrumbs:function(){this.$breadcrumbs&&this.$breadcrumbs.empty();}});wn.ui.make_app_page=function(opts){if(opts.single_column){$(opts.parent).html('<div class="layout-wrapper layout-wrapper-appframe">\
+crumb.appendTo(this.$breadcrumbs);},clear_breadcrumbs:function(){this.$breadcrumbs&&this.$breadcrumbs.empty();},add_toolbar:function(){if(!this.toolbar)
+this.$w.append('<div class="appframe-toolbar"></div>');this.toolbar=this.$w.find('.appframe-toolbar');},add_select:function(label,options){this.add_toolbar();return $("<select style='width: 160px;'>").add_options(options).appendTo(this.add_label(label));},add_label:function(label){return $("<span style='margin-right: 12px;'>"+label+" </span>").appendTo(this.toolbar);},add_date:function(label,date){this.add_toolbar();return $("<input style='width: 80px;'>").datepicker({dateFormat:sys_defaults.date_format.replace("yyyy","yy"),changeYear:true,}).val(dateutil.str_to_user(date)||"").appendTo(this.add_label(label));},});wn.ui.make_app_page=function(opts){if(opts.single_column){$(opts.parent).html('<div class="layout-wrapper layout-wrapper-appframe">\
    <div class="layout-appframe"></div>\
    <div class="layout-main"></div>\
   </div>');}else{$(opts.parent).html('<div class="layout-wrapper layout-wrapper-background">\
