Merge branch 'handlerupdate' of github.com:webnotes/erpnext into shf_rename

Conflicts:
	version.num
diff --git a/css/all-app.css b/css/all-app.css
index c2a6730..f30d1cf 100644
--- a/css/all-app.css
+++ b/css/all-app.css
@@ -1589,10 +1589,12 @@
 
 div.list-row table td {
 	overflow: hidden;
-	padding-right: 3px;
+	/*padding-right: 3px;*/
+	padding: 0px 3px;
 	vertical-align: middle;
 	height: 24px;
 	max-height: 24px;
+	word-wrap: break-word;
 }
 
 div.paging-button {
diff --git a/css/all-web.css b/css/all-web.css
index d818b7f..ad1304b 100644
--- a/css/all-web.css
+++ b/css/all-web.css
@@ -1674,10 +1674,12 @@
 
 div.list-row table td {
 	overflow: hidden;
-	padding-right: 3px;
+	/*padding-right: 3px;*/
+	padding: 0px 3px;
 	vertical-align: middle;
 	height: 24px;
 	max-height: 24px;
+	word-wrap: break-word;
 }
 
 div.paging-button {
diff --git a/erpnext/accounts/doctype/payable_voucher/listview.js b/erpnext/accounts/doctype/payable_voucher/listview.js
new file mode 100644
index 0000000..6dc8f99
--- /dev/null
+++ b/erpnext/accounts/doctype/payable_voucher/listview.js
@@ -0,0 +1,39 @@
+// render
+wn.doclistviews['Payable Voucher'] = wn.views.ListView.extend({
+	init: function(d) {
+		this._super(d);
+		this.fields = this.fields.concat([
+			'`tabPayable Voucher`.supplier_name',
+			'`tabPayable Voucher`.currency',
+			'IFNULL(`tabPayable Voucher`.grand_total_import, 0) as grand_total_import',
+			'IFNULL(`tabPayable Voucher`.grand_total, 0) as grand_total',
+			'IFNULL(`tabPayable Voucher`.outstanding_amount, 0) as outstanding_amount',
+		]);
+		this.stats = this.stats.concat(['company']);
+	},
+
+	prepare_data: function(data) {
+		this._super(data);
+		data.paid = flt(
+			((data.grand_total - data.outstanding_amount) / data.grand_total) * 100,
+			2);
+	},
+
+	columns: [
+		{width: '5%', content: 'avatar'},
+		{width: '3%', content: 'docstatus'},
+		{width: '15%', content: 'name'},
+		{width: '37%', content: 'tags+supplier_name', css: {color: '#aaa'}},
+		{
+			width: '18%', 
+			content: function(parent, data) { 
+				$(parent).html(data.currency + ' ' + fmt_money(data.grand_total_import)) 
+			},
+			css: {'text-align':'right'}
+		},
+		{width: '10%', content: 'paid', type:'bar-graph', label:'Paid'},
+		{width: '12%', content:'modified', css: {
+			'text-align': 'right', 'color':'#777'
+		}},
+	]
+});
diff --git a/erpnext/accounts/doctype/receivable_voucher/listview.js b/erpnext/accounts/doctype/receivable_voucher/listview.js
index d30431f..ebedd51 100644
--- a/erpnext/accounts/doctype/receivable_voucher/listview.js
+++ b/erpnext/accounts/doctype/receivable_voucher/listview.js
@@ -3,12 +3,14 @@
 	init: function(d) {
 		this._super(d)
 		this.fields = this.fields.concat([
-			"`tabReceivable Voucher`.customer", 
+			"`tabReceivable Voucher`.customer_name", 
 			"ifnull(`tabReceivable Voucher`.outstanding_amount,0) as outstanding_amount", 
 			"ifnull(`tabReceivable Voucher`.grand_total,0) as grand_total", 
 			"`tabReceivable Voucher`.currency", 
 			"ifnull(`tabReceivable Voucher`.grand_total_export,0) as grand_total_export"
 		]);
+
+		this.stats = this.stats.concat(['company']);		
 	},
 	prepare_data: function(data) {
 		this._super(data);
@@ -18,7 +20,7 @@
 		{width: '5%', content:'avatar'},
 		{width: '3%', content:'docstatus'},
 		{width: '15%', content:'name'},
-		{width: '37%', content:'tags+customer', css: {color:'#aaa'}},
+		{width: '37%', content:'tags+customer_name', css: {color:'#aaa'}},
 		{
 			width: '18%', 
 			content: function(parent, data) { 
diff --git a/erpnext/buying/doctype/indent/listview.js b/erpnext/buying/doctype/indent/listview.js
new file mode 100644
index 0000000..df78ea9
--- /dev/null
+++ b/erpnext/buying/doctype/indent/listview.js
@@ -0,0 +1,33 @@
+// render
+wn.doclistviews['Indent'] = wn.views.ListView.extend({
+	init: function(d) {
+		this._super(d)
+		this.fields = this.fields.concat([
+			"`tabIndent`.status",
+			"IFNULL(`tabIndent`.per_ordered, 0) as per_ordered",
+			"`tabIndent`.remark",
+		]);
+		this.stats = this.stats.concat(['status', 'company']);
+	},
+
+	prepare_data: function(data) {
+		this._super(data);
+		if(['Stopped', 'Cancelled'].indexOf(data.status)!=-1) {
+			data.label_type = 'important';
+		} else if(data.status == 'Submitted') {
+			data.label_type = 'success';
+		}
+
+		data.status_html = repl('<span class="label label-%(label_type)s">%(status)s</span>', data);
+	},
+	
+	columns: [
+		{width: '5%', content:'avatar'},
+		{width: '3%', content:'docstatus'},
+		{width: '17%', content:'name'},
+		{width: '53%', content:'status_html+tags+remark', css: {'color': '#aaa'}},
+		{width: '10%', content: 'per_ordered', type:'bar-graph', label:'Ordered'},
+		{width: '12%', content:'modified', css: {'text-align': 'right', 'color':'#777'}}
+	]
+});
+
diff --git a/erpnext/buying/doctype/purchase_order/listview.js b/erpnext/buying/doctype/purchase_order/listview.js
new file mode 100644
index 0000000..528fe60
--- /dev/null
+++ b/erpnext/buying/doctype/purchase_order/listview.js
@@ -0,0 +1,33 @@
+// render
+wn.doclistviews['Purchase Order'] = wn.views.ListView.extend({
+	init: function(d) {
+		this._super(d)
+		this.fields = this.fields.concat([
+			"`tabPurchase Order`.supplier_name", 
+			"ifnull(`tabPurchase Order`.per_received,0) as per_received",
+			"ifnull(`tabPurchase Order`.per_billed,0) as per_billed",
+			"`tabPurchase Order`.currency", 
+			"ifnull(`tabPurchase Order`.grand_total_import,0) as grand_total_import"
+		]);
+		this.stats = this.stats.concat(['status', 'company']);
+	},
+	
+	columns: [
+		{width: '5%', content:'avatar'},
+		{width: '3%', content:'docstatus'},
+		{width: '15%', content:'name'},
+		{width: '35%', content:'tags+supplier_name', css: {color:'#aaa'}},
+		{
+			width: '18%', 
+			content: function(parent, data) { 
+				$(parent).html(data.currency + ' ' + fmt_money(data.grand_total_import)) 
+			},
+			css: {'text-align':'right'}
+		},
+		{width: '8%', content: 'per_received', type:'bar-graph', label:'Delivered'},
+		{width: '8%', content: 'per_billed', type:'bar-graph', label:'Billed'},
+		{width: '12%', content:'modified', css: {'text-align': 'right', 'color':'#777'}}
+	]
+
+});
+
diff --git a/erpnext/buying/doctype/supplier/listview.js b/erpnext/buying/doctype/supplier/listview.js
new file mode 100644
index 0000000..86e22d6
--- /dev/null
+++ b/erpnext/buying/doctype/supplier/listview.js
@@ -0,0 +1,23 @@
+// render
+wn.doclistviews['Supplier'] = wn.views.ListView.extend({
+	init: function(d) {
+		this._super(d)
+		this.fields = this.fields.concat([
+			"`tabSupplier`.supplier_type",
+		]);
+		this.stats = this.stats.concat([]);
+	},
+
+	prepare_data: function(data) {
+		this._super(data);
+	},
+	
+	columns: [
+		{width: '5%', content:'avatar'},
+		{width: '50%', content:'name'},
+		{width: '10%', content:'tags'},
+		{width: '23%', content:'supplier_type', css: {'color': '#aaa'}},
+		{width: '12%', content:'modified', css: {'text-align': 'right', 'color':'#777'}}
+	]
+});
+
diff --git a/erpnext/selling/doctype/customer/listview.js b/erpnext/selling/doctype/customer/listview.js
new file mode 100644
index 0000000..3ac705a
--- /dev/null
+++ b/erpnext/selling/doctype/customer/listview.js
@@ -0,0 +1,18 @@
+// render
+wn.doclistviews['Customer'] = wn.views.ListView.extend({
+	init: function(d) {
+		this._super(d)
+		this.fields = this.fields.concat([
+			"`tabCustomer`.customer_name",
+			"`tabCustomer`.territory",
+		]);
+	},
+	
+	columns: [
+		{width: '5%', content:'avatar'},
+		{width: '53%', content:'name'},
+		{width: '10%', content:'tags'},
+		{width: '20%', content:'territory', css: {'color': '#aaa'}},
+		{width: '12%', content:'modified', css: {'text-align': 'right', 'color':'#777'}}
+	]
+});
diff --git a/erpnext/selling/doctype/enquiry/listview.js b/erpnext/selling/doctype/enquiry/listview.js
new file mode 100644
index 0000000..1bd1b96
--- /dev/null
+++ b/erpnext/selling/doctype/enquiry/listview.js
@@ -0,0 +1,37 @@
+wn.doclistviews['Enquiry'] = wn.views.ListView.extend({
+	init: function(d) {
+		this._super(d)
+		this.fields = this.fields.concat([
+			'tabEnquiry.enquiry_from',
+			'tabEnquiry.lead_name',
+			'tabEnquiry.customer_name',
+			'tabEnquiry.status',
+		]);
+		this.stats = this.stats.concat(['status', 'source', 'enquiry_from', 'company']);
+	},
+
+	prepare_data: function(data) {
+		this._super(data);
+		if(['Order Confirmed', 'Quotation Sent']
+				.indexOf(data.status)!=-1) {
+			data.label_type = 'success';
+		} else if(data.status == 'Draft') {
+			data.label_type = 'info';
+		} else if(data.status == 'Submit') {
+			data.label_type = 'important';
+		}
+		data.status_html = repl('<span class="label label-%(label_type)s">%(status)s</span>', data);
+		if(data.enquiry_from == 'Lead') {
+			data.enquiry_name = repl('[%(enquiry_from)s] %(lead_name)s', data);
+		} else {
+			data.enquiry_name = repl('[%(enquiry_from)s] %(customer_name)s', data);
+		}
+	},
+
+	columns: [
+		{width: '15%', content:'name'},
+		{width: '18%', content:'status_html'},
+		{width: '55%', content:'tags+enquiry_name', css: {color:'#aaa'}},
+		{width: '12%', content:'modified', css: {'text-align': 'right', 'color':'#777'}}
+	]
+})
diff --git a/erpnext/selling/doctype/lead/listview.js b/erpnext/selling/doctype/lead/listview.js
index b5ed6b8..4751c64 100644
--- a/erpnext/selling/doctype/lead/listview.js
+++ b/erpnext/selling/doctype/lead/listview.js
@@ -7,7 +7,7 @@
 			'tabLead.source',
 			'tabLead.rating'
 		]);
-		this.stats = this.stats.concat(['status', 'source', 'rating']);
+		this.stats = this.stats.concat(['status', 'source', 'rating', 'company']);
 	},
 
 	prepare_data: function(data) {
diff --git a/erpnext/selling/doctype/quotation/listview.js b/erpnext/selling/doctype/quotation/listview.js
new file mode 100644
index 0000000..1489df3
--- /dev/null
+++ b/erpnext/selling/doctype/quotation/listview.js
@@ -0,0 +1,40 @@
+// render
+wn.doclistviews['Quotation'] = wn.views.ListView.extend({
+	init: function(d) {
+		this._super(d)
+		this.fields = this.fields.concat([
+			"`tabQuotation`.quotation_to",
+			"`tabQuotation`.lead_name",
+			"`tabQuotation`.customer_name",
+			"`tabQuotation`.currency", 
+			"ifnull(`tabQuotation`.grand_total_export,0) as grand_total_export"
+		]);
+		this.stats = this.stats.concat(['status', 'quotation_to', 'company']);
+	},
+	
+	prepare_data: function(data) {
+		this._super(data);
+		if(data.quotation_to == 'Lead') {
+			data.quotation_name = repl('[%(quotation_to)s] %(lead_name)s', data);
+		} else {
+			data.quotation_name = repl('[%(quotation_to)s] %(customer_name)s', data);
+		}		
+	},
+	
+	columns: [
+		{width: '5%', content:'avatar'},
+		{width: '3%', content:'docstatus'},
+		{width: '15%', content:'name'},
+		{width: '47%', content:'tags+quotation_name', css: {color:'#aaa'}},
+		{
+			width: '18%', 
+			content: function(parent, data) { 
+				$(parent).html(data.currency + ' ' + fmt_money(data.grand_total_export)) 
+			},
+			css: {'text-align':'right'}
+		},
+		{width: '12%', content:'modified', css: {'text-align': 'right', 'color':'#777'}}
+	]
+
+});
+
diff --git a/erpnext/selling/doctype/sales_order/listview.js b/erpnext/selling/doctype/sales_order/listview.js
index c0b3895..3b764d1 100644
--- a/erpnext/selling/doctype/sales_order/listview.js
+++ b/erpnext/selling/doctype/sales_order/listview.js
@@ -9,14 +9,14 @@
 			"`tabSales Order`.currency", 
 			"ifnull(`tabSales Order`.grand_total_export,0) as grand_total_export"
 		]);
-		this.stats = this.stats.concat(['status']);
+		this.stats = this.stats.concat(['status', 'company']);
 	},
 	
 	columns: [
 		{width: '5%', content:'avatar'},
 		{width: '3%', content:'docstatus'},
 		{width: '15%', content:'name'},
-		{width: '37%', content:'tags+customer_name', css: {color:'#aaa'}},
+		{width: '35%', content:'tags+customer_name', css: {color:'#aaa'}},
 		{
 			width: '18%', 
 			content: function(parent, data) { 
@@ -26,7 +26,7 @@
 		},
 		{width: '8%', content: 'per_delivered', type:'bar-graph', label:'Delivered'},
 		{width: '8%', content: 'per_billed', type:'bar-graph', label:'Billed'},
-		{width: '10%', content:'modified', css: {'text-align': 'right', 'color':'#777'}}
+		{width: '12%', content:'modified', css: {'text-align': 'right', 'color':'#777'}}
 	]
 
 });
diff --git a/erpnext/stock/doctype/item/listview.js b/erpnext/stock/doctype/item/listview.js
new file mode 100644
index 0000000..7f0dbc8
--- /dev/null
+++ b/erpnext/stock/doctype/item/listview.js
@@ -0,0 +1,23 @@
+// render
+wn.doclistviews['Item'] = wn.views.ListView.extend({
+	init: function(d) {
+		this._super(d)
+		this.fields = this.fields.concat([
+			"`tabItem`.item_name",
+			"`tabItem`.description",
+		]);
+		this.stats = this.stats.concat(['default_warehouse', 'brand']);
+	},
+
+	prepare_data: function(data) {
+		this._super(data);
+		data.description = repl("%(item_name)s | %(description)s", data);
+	},
+	
+	columns: [
+		{width: '5%', content:'avatar'},
+		{width: '20%', content:'name'},
+		{width: '63%', content:'tags+description', css: {'color': '#aaa'}},
+		{width: '12%', content:'modified', css: {'text-align': 'right', 'color':'#777'}}
+	]
+});
diff --git a/erpnext/support/doctype/support_ticket/listview.js b/erpnext/support/doctype/support_ticket/listview.js
index 87c1224..67ba9ea 100644
--- a/erpnext/support/doctype/support_ticket/listview.js
+++ b/erpnext/support/doctype/support_ticket/listview.js
@@ -1,5 +1,7 @@
 // render
 wn.doclistviews['Support Ticket'] = wn.views.ListView.extend({
+	me: this,
+
 	init: function(d) {
 		this._super(d)
 		this.fields = this.fields.concat([
@@ -26,8 +28,13 @@
 			data.status = 'Waiting'
 		}
 		data.status_html = repl('<span class="label label-%(label_type)s">%(status)s</span>', data);
+		var a = $(data.status_html).click(function() {
+			me.set_filter('status', $(this).text());
+		});
 		
-		data.description = data.description + ' | ' + data.subject;
+		// replace double quote with blank string
+		data.description = cstr(data.subject).replace(/"/gi, '')
+			+ " | " + cstr(data.description).replace(/"/gi, '');
 		
 		// description
 		if(data.description && data.description.length > 50) {
diff --git a/js/all-app.js b/js/all-app.js
index fe634e3..b9043aa 100644
--- a/js/all-app.js
+++ b/js/all-app.js
@@ -387,7 +387,7 @@
     <i class="icon-remove"></i> Delete</a>',function(){me.delete_items();},'.btn-filter')}},delete_items:function(){var me=this;var dl=$.map(me.$page.find('.list-delete:checked'),function(e){return $(e).data('name');});if(!dl.length)
 return;if(!confirm('This is PERMANENT action and you cannot undo. Continue?')){return;}
 me.set_working(true);wn.call({method:'webnotes.widgets.doclistview.delete_items',args:{items:dl,doctype:me.doctype},callback:function(){me.set_working(false);me.refresh();}})},init_stats:function(){var me=this
-wn.call({method:'webnotes.widgets.doclistview.get_stats',args:{stats:me.listview.stats,doctype:me.doctype},callback:function(r){$.each(r.message,function(field,stat){me.render_stat(field,stat);});}});},render_stat:function(field,stat){var me=this;if(!stat||!stat.length){if(field=='_user_tags'){this.$page.find('.layout-side-section').append('<div class="stat-wrapper"><h4>Tags</h4>\
+wn.call({method:'webnotes.widgets.doclistview.get_stats',args:{stats:me.listview.stats,doctype:me.doctype},callback:function(r){$.each(me.listview.stats,function(i,v){me.render_stat(v,r.message[v]);});}});},render_stat:function(field,stat){var me=this;if(!stat||!stat.length){if(field=='_user_tags'){this.$page.find('.layout-side-section').append('<div class="stat-wrapper"><h4>Tags</h4>\
       <div class="help small"><i>No records tagged.</i><br><br> \
       To add a tag, open the document and click on \
       "Add Tag" on the sidebar</div></div>');}
@@ -408,16 +408,16 @@
 this.run();}});wn.views.ListView=Class.extend({init:function(doclistview){this.doclistview=doclistview;this.doctype=doclistview.doctype;var t="`tab"+this.doctype+"`.";this.fields=[t+'name',t+'owner',t+'docstatus',t+'_user_tags',t+'modified'];this.stats=['_user_tags'];if(!this.doclistview.can_delete){this.columns=$.map(this.columns,function(v,i){if(v.content!='check')return v});}},columns:[{width:'3%',content:'check'},{width:'4%',content:'avatar'},{width:'3%',content:'docstatus',css:{"text-align":"center"}},{width:'35%',content:'name'},{width:'40%',content:'tags',css:{'color':'#aaa'}},{width:'15%',content:'modified',css:{'text-align':'right','color':'#777'}}],render_column:function(data,parent,opts){var me=this;if(opts.css){$.each(opts.css,function(k,v){$(parent).css(k,v)});}
 if(opts.content.indexOf&&opts.content.indexOf('+')!=-1){$.map(opts.content.split('+'),function(v){me.render_column(data,parent,{content:v});});return;}
 if(typeof opts.content=='function'){opts.content(parent,data);}
-else if(opts.content=='name'){$(parent).html(repl('<a href="#!Form/%(doctype)s/%(name)s">%(name)s</a>',data));}
-else if(opts.content=='avatar'){$(parent).html(repl('<span class="avatar-small"><img src="%(avatar)s" \
+else if(opts.content=='name'){$(parent).append(repl('<a href="#!Form/%(doctype)s/%(name)s">%(name)s</a>',data));}
+else if(opts.content=='avatar'){$(parent).append(repl('<span class="avatar-small"><img src="%(avatar)s" \
     title="%(fullname)s"/></span>',data));}
-else if(opts.content=='check'){$(parent).html('<input class="list-delete" type="checkbox">');$(parent).find('input').data('name',data.name);}
-else if(opts.content=='docstatus'){$(parent).html(repl('<span class="docstatus"><i class="%(docstatus_icon)s" \
+else if(opts.content=='check'){$(parent).append('<input class="list-delete" type="checkbox">');$(parent).find('input').data('name',data.name);}
+else if(opts.content=='docstatus'){$(parent).append(repl('<span class="docstatus"><i class="%(docstatus_icon)s" \
     title="%(docstatus_title)s"></i></span>',data));}
 else if(opts.content=='tags'){this.add_user_tags(parent,data);}
 else if(opts.content=='modified'){$(parent).append(data.when);}
 else if(opts.type=='bar-graph'){args={percent:data[opts.content],fully_delivered:(data[opts.content]>99?'bar-complete':''),label:opts.label}
-$(parent).html(repl('<span class="bar-outer" style="width: 30px; float: right" \
+$(parent).append(repl('<span class="bar-outer" style="width: 30px; float: right" \
     title="%(percent)s% %(label)s">\
     <span class="bar-inner %(fully_delivered)s" \
      style="width: %(percent)s%;"></span>\
@@ -455,7 +455,7 @@
 wn.request.cleanup=function(opts,r){if(opts.btn)$(opts.btn).done_working();if(opts.show_spinner)hide_loading();if(opts.freeze)unfreeze();if(wn.boot.sid&&wn.get_cookie('sid')!=wn.boot.sid){msgprint('Session expired');setTimeout('redirect_to_login()',3000);return;}
 if(r.server_messages)msgprint(r.server_messages)
 if(r.exc){errprint(r.exc);console.log(r.exc);};if(r.docs)LocalDB.sync(r.docs);}
-wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});msgprint('Unable to complete request: '+textStatus)
+wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus)
 if(opts.error)opts.error(xhr)}})}
 wn.call=function(opts){var args=$.extend({},opts.args)
 if(opts.module&&opts.page){args.cmd=opts.module+'.page.'+opts.page+'.'+opts.page+'.'+opts.method}else if(opts.method){args.cmd=opts.method;}
@@ -511,7 +511,7 @@
 s=rstrip(s,chars);return s;}
 var lstrip=function(s,chars){if(!chars)chars=['\n','\t',' '];var first_char=s.substr(0,1);while(in_list(chars,first_char)){var s=s.substr(1);first_char=s.substr(0,1);}
 return s;}
-var rstrip=function(s,chars){if(!chars)chars=['\n','\t',' '];var last_char=s.substr(s.length-1);while(in_list(chars,last_char)){var s=s.substr(0,this.length-1);last_char=s.substr(this.length-1);}
+var rstrip=function(s,chars){if(!chars)chars=['\n','\t',' '];var last_char=s.substr(s.length-1);while(in_list(chars,last_char)){var s=s.substr(0,s.length-1);last_char=s.substr(s.length-1);}
 return s;}
 function repl_all(s,s1,s2){var idx=s.indexOf(s1);while(idx!=-1){s=s.replace(s1,s2);idx=s.indexOf(s1);}
 return s;}
diff --git a/js/all-web.js b/js/all-web.js
index f905fa4..a25d3e8 100644
--- a/js/all-web.js
+++ b/js/all-web.js
@@ -301,7 +301,7 @@
     <i class="icon-remove"></i> Delete</a>',function(){me.delete_items();},'.btn-filter')}},delete_items:function(){var me=this;var dl=$.map(me.$page.find('.list-delete:checked'),function(e){return $(e).data('name');});if(!dl.length)
 return;if(!confirm('This is PERMANENT action and you cannot undo. Continue?')){return;}
 me.set_working(true);wn.call({method:'webnotes.widgets.doclistview.delete_items',args:{items:dl,doctype:me.doctype},callback:function(){me.set_working(false);me.refresh();}})},init_stats:function(){var me=this
-wn.call({method:'webnotes.widgets.doclistview.get_stats',args:{stats:me.listview.stats,doctype:me.doctype},callback:function(r){$.each(r.message,function(field,stat){me.render_stat(field,stat);});}});},render_stat:function(field,stat){var me=this;if(!stat||!stat.length){if(field=='_user_tags'){this.$page.find('.layout-side-section').append('<div class="stat-wrapper"><h4>Tags</h4>\
+wn.call({method:'webnotes.widgets.doclistview.get_stats',args:{stats:me.listview.stats,doctype:me.doctype},callback:function(r){$.each(me.listview.stats,function(i,v){me.render_stat(v,r.message[v]);});}});},render_stat:function(field,stat){var me=this;if(!stat||!stat.length){if(field=='_user_tags'){this.$page.find('.layout-side-section').append('<div class="stat-wrapper"><h4>Tags</h4>\
       <div class="help small"><i>No records tagged.</i><br><br> \
       To add a tag, open the document and click on \
       "Add Tag" on the sidebar</div></div>');}
@@ -322,16 +322,16 @@
 this.run();}});wn.views.ListView=Class.extend({init:function(doclistview){this.doclistview=doclistview;this.doctype=doclistview.doctype;var t="`tab"+this.doctype+"`.";this.fields=[t+'name',t+'owner',t+'docstatus',t+'_user_tags',t+'modified'];this.stats=['_user_tags'];if(!this.doclistview.can_delete){this.columns=$.map(this.columns,function(v,i){if(v.content!='check')return v});}},columns:[{width:'3%',content:'check'},{width:'4%',content:'avatar'},{width:'3%',content:'docstatus',css:{"text-align":"center"}},{width:'35%',content:'name'},{width:'40%',content:'tags',css:{'color':'#aaa'}},{width:'15%',content:'modified',css:{'text-align':'right','color':'#777'}}],render_column:function(data,parent,opts){var me=this;if(opts.css){$.each(opts.css,function(k,v){$(parent).css(k,v)});}
 if(opts.content.indexOf&&opts.content.indexOf('+')!=-1){$.map(opts.content.split('+'),function(v){me.render_column(data,parent,{content:v});});return;}
 if(typeof opts.content=='function'){opts.content(parent,data);}
-else if(opts.content=='name'){$(parent).html(repl('<a href="#!Form/%(doctype)s/%(name)s">%(name)s</a>',data));}
-else if(opts.content=='avatar'){$(parent).html(repl('<span class="avatar-small"><img src="%(avatar)s" \
+else if(opts.content=='name'){$(parent).append(repl('<a href="#!Form/%(doctype)s/%(name)s">%(name)s</a>',data));}
+else if(opts.content=='avatar'){$(parent).append(repl('<span class="avatar-small"><img src="%(avatar)s" \
     title="%(fullname)s"/></span>',data));}
-else if(opts.content=='check'){$(parent).html('<input class="list-delete" type="checkbox">');$(parent).find('input').data('name',data.name);}
-else if(opts.content=='docstatus'){$(parent).html(repl('<span class="docstatus"><i class="%(docstatus_icon)s" \
+else if(opts.content=='check'){$(parent).append('<input class="list-delete" type="checkbox">');$(parent).find('input').data('name',data.name);}
+else if(opts.content=='docstatus'){$(parent).append(repl('<span class="docstatus"><i class="%(docstatus_icon)s" \
     title="%(docstatus_title)s"></i></span>',data));}
 else if(opts.content=='tags'){this.add_user_tags(parent,data);}
 else if(opts.content=='modified'){$(parent).append(data.when);}
 else if(opts.type=='bar-graph'){args={percent:data[opts.content],fully_delivered:(data[opts.content]>99?'bar-complete':''),label:opts.label}
-$(parent).html(repl('<span class="bar-outer" style="width: 30px; float: right" \
+$(parent).append(repl('<span class="bar-outer" style="width: 30px; float: right" \
     title="%(percent)s% %(label)s">\
     <span class="bar-inner %(fully_delivered)s" \
      style="width: %(percent)s%;"></span>\
@@ -369,7 +369,7 @@
 wn.request.cleanup=function(opts,r){if(opts.btn)$(opts.btn).done_working();if(opts.show_spinner)hide_loading();if(opts.freeze)unfreeze();if(wn.boot.sid&&wn.get_cookie('sid')!=wn.boot.sid){msgprint('Session expired');setTimeout('redirect_to_login()',3000);return;}
 if(r.server_messages)msgprint(r.server_messages)
 if(r.exc){errprint(r.exc);console.log(r.exc);};if(r.docs)LocalDB.sync(r.docs);}
-wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});msgprint('Unable to complete request: '+textStatus)
+wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus)
 if(opts.error)opts.error(xhr)}})}
 wn.call=function(opts){var args=$.extend({},opts.args)
 if(opts.module&&opts.page){args.cmd=opts.module+'.page.'+opts.page+'.'+opts.page+'.'+opts.method}else if(opts.method){args.cmd=opts.method;}
@@ -425,7 +425,7 @@
 s=rstrip(s,chars);return s;}
 var lstrip=function(s,chars){if(!chars)chars=['\n','\t',' '];var first_char=s.substr(0,1);while(in_list(chars,first_char)){var s=s.substr(1);first_char=s.substr(0,1);}
 return s;}
-var rstrip=function(s,chars){if(!chars)chars=['\n','\t',' '];var last_char=s.substr(s.length-1);while(in_list(chars,last_char)){var s=s.substr(0,this.length-1);last_char=s.substr(this.length-1);}
+var rstrip=function(s,chars){if(!chars)chars=['\n','\t',' '];var last_char=s.substr(s.length-1);while(in_list(chars,last_char)){var s=s.substr(0,s.length-1);last_char=s.substr(s.length-1);}
 return s;}
 function repl_all(s,s1,s2){var idx=s.indexOf(s1);while(idx!=-1){s=s.replace(s1,s2);idx=s.indexOf(s1);}
 return s;}
diff --git a/version.num b/version.num
index 2800f1b..3591ec6 100644
--- a/version.num
+++ b/version.num
@@ -1 +1 @@
-1460
+1492