diff --git a/erpnext/home/doctype/company_control/company_control.txt b/erpnext/home/doctype/company_control/company_control.txt
index b11c7da..a83f4dd 100644
--- a/erpnext/home/doctype/company_control/company_control.txt
+++ b/erpnext/home/doctype/company_control/company_control.txt
@@ -18,7 +18,6 @@
 		'module': 'Home',
 		'name': '__common__',
 		'section_style': 'Simple',
-		'server_code': '\n\n\t# Update roles of given user\n\tdef update_roles(self,arg):\n\t\targ = eval(arg)\n\t\tsql("delete from `tabUserRole` where parenttype=\'Profile\' and parent =\'%s\'" % (cstr(arg[\'usr\'])))\n\t\trole_list = arg[\'role_list\'].split(\',\')\n\t\tmsgprint(sql("select role from tabUserRole where parent = \'%s\'" % cstr(arg[\'usr\'])))\n\t\tmsgprint(role_list)\n\t\tfor r in role_list:\n\t\t\tpr=Document(\'UserRole\')\n\t\t\tpr.parent = arg[\'usr\']\n\t\t\tpr.parenttype = \'Profile\'\n\t\t\tpr.role = r\n\t\t\tpr.parentfield = \'userroles\'\n\t\t\tpr.save(1)\n\t\tmsgprint(sql("select role from tabUserRole where parent = \'%s\'" % cstr(arg[\'usr\'])))\n\n\n  # Create New Profile\n  # ====================\n\tdef create_new_profile(self, arg):\n\t\tp = Document(\'Profile\')\n\t\tp.first_name = arg.get(\'first_name\') or arg.get(\'email_id\')\n\t\tp.last_name = arg.get(\'last_name\')\n\t\tp.email = arg.get(\'email_id\')\n\t\tp.name = arg.get(\'email_id\')\n\t\tp.user_type = arg.get(\'user_type\') or \'System User\'\n\t\tp.enabled = 0\t\n\t\tp.save(new=1)\n\t\tp_obj = get_obj(\'Profile\', p.name)\n\t\tp_obj.on_update()',
 		'server_code_error': ' ',
 		'version': 13
 	},
diff --git a/erpnext/selling/search_criteria/customer_address_contact/customer_address_contact.txt b/erpnext/selling/search_criteria/customer_address_contact/customer_address_contact.txt
index 99890b7..fe1e6e5 100644
--- a/erpnext/selling/search_criteria/customer_address_contact/customer_address_contact.txt
+++ b/erpnext/selling/search_criteria/customer_address_contact/customer_address_contact.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2012-02-13 11:28:45',
+		'creation': '2012-02-22 15:45:49',
 		'docstatus': 0,
-		'modified': '2012-02-13 11:28:45',
+		'modified': '2012-02-22 15:45:49',
 		'modified_by': u'Administrator',
 		'owner': u'Administrator'
 	},
diff --git a/erpnext/setup/doctype/contact_control/__init__.py b/erpnext/setup/doctype/contact_control/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/setup/doctype/contact_control/__init__.py
+++ /dev/null
diff --git a/erpnext/setup/doctype/contact_control/contact_control.js b/erpnext/setup/doctype/contact_control/contact_control.js
deleted file mode 100755
index b6825eb..0000000
--- a/erpnext/setup/doctype/contact_control/contact_control.js
+++ /dev/null
@@ -1,562 +0,0 @@
-// common partner functions
-// =========================
-
-/*
-// make shipping list body
-// ------------------------
-cur_frm.cscript.make_sl_body = function(){
-	cur_frm.fields_dict['Shipping HTML'].wrapper.innerHTML = '';
-	cur_frm.shipping_html = $a(cur_frm.fields_dict['Shipping HTML'].wrapper,'div');
-}
-*/
-
-// make history list body
-// -----------------------
-cur_frm.cscript.make_hl_body = function(){
-	cur_frm.fields_dict['History HTML'].wrapper.innerHTML = '';
-	cur_frm.history_html = $a(cur_frm.fields_dict['History HTML'].wrapper,'div');
-}
-
-
-/*
-// set shipping list message
-// --------------------------
-cur_frm.cscript.set_sl_msg = function(doc){
-	cur_frm.shipping_html.innerHTML = 'Shipping Address Details will appear only when you save the ' + doc.doctype.toLowerCase();
-}
-*/
-/*
-// set history list message
-// -------------------------
-cur_frm.cscript.set_hl_msg = function(doc){
-	cur_frm.history_html.innerHTML= 'History Details will appear only when you save the ' + doc.doctype.toLowerCase();
-}
-*/
-
-
-/*
-// make shipping address
-// -------------
-cur_frm.cscript.make_shipping_address = function(doc, dt, dn){
-  	cur_frm.shipping_html.innerHTML = '';
-
-	var dsn = cur_frm.doc.customer_name;
-	var dsa = cur_frm.doc.address;
-	cl = new AddressList(cur_frm.shipping_html,dt,dn,dsn,dsa);
-}
-*/
-
-
-// make history
-// -------------
-cur_frm.cscript.make_history = function(doc,dt,dn){
-	cur_frm.history_html.innerHTML = '';
-	cur_frm.cscript.make_history_list(cur_frm.history_html,doc);
-}
-
-// make history list
-// ------------------
-cur_frm.cscript.make_history_list = function(parent,doc){
-
-	var sel = $a(parent,'select');
-	
-	var ls = ['Select Transaction..'];
-	for(d in cur_frm.history_dict){
-		ls.push(d);
-	}
-	
-	add_sel_options(sel,ls,'Select..');
-	
-	var body = $a(parent,'div');
-	body.innerHTML = '<div class="help_box">Please select a transaction type to see History</div>';
-	
-	sel.body = body;
-	sel.doc = doc;
-	
-	sel.onchange = function(){
-		for(d in cur_frm.history_dict){
-			if(sel_val(this) == d){
-				this.body.innerHTML = '';
-				eval(cur_frm.history_dict[d]);
-				return;
-			}
-			else{
-				// pass
-			}
-		}
-	}
-}
-
-// run list
-// ---------
-cur_frm.cscript.run_list = function(lst,parent,q,q_max,doc,dn,nm){
-	
-	parent.innerHTML = '';
-	$dh(parent);
-	
-	lst.doc = doc;
-	lst.dn = dn;
-	lst.nm = nm;
-	lst.page_len = 10;
-	
-	lst.get_query = function(){
-		this.query = q;
-		this.query_max = q_max;
-	}
-	
-	lst.make(parent);
-	lst.run();
-	
-	lst.onrun = function(){
-		$ds(parent);
-		if(!this.has_data()){
-			parent.innerHTML = '';
-			var dv = $a(parent,'div','help_box');
-			$a(dv,'span').innerHTML = "No " + this.dn + " found. ";
-			
-			var lbl = 'Create the <b>first</b> ' + this.dn + ' for ' + this.doc.name;
-			var sp = $a(dv,'span');
-			sp.nm = this.nm;
-			$(sp).html(lbl).addClass('link_type').click(function(){ newdoc(this.nm); });
-		}
-	}
-}
-
-
-// get sates on country trigger
-// -----------------------------
-cur_frm.cscript.get_states=function(doc,dt,dn){
-   $c('runserverobj', args={'method':'check_state', 'docs':compress_doclist([doc])},
-    function(r,rt){
-      if(r.message) {
-        set_field_options('state', r.message);
-      }
-    }  
-  );
-
-}
-
-cur_frm.cscript.country = function(doc, dt, dn) {
-  cur_frm.cscript.get_states(doc, dt, dn);
-}
-
-// territory help - cutsomer + sales partner
-// -----------------------------------------
-cur_frm.cscript.TerritoryHelp = function(doc,dt,dn){
-  var call_back = function(){
-
-    var sb_obj = new SalesBrowser();        
-    sb_obj.set_val('Territory');
-  }
-  loadpage('Sales Browser',call_back);
-}
-
-// get query select Territory
-// ---------------------------
-if(cur_frm.fields_dict['territory']){
-	cur_frm.fields_dict['territory'].get_query = function(doc,dt,dn) {
-		return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s"  ORDER BY  `tabTerritory`.`name` ASC LIMIT 50';
-	}
-}
-
-
-// =======================================================================================================
-
-// contact list
-// --------------
-ContactList = function(parent,dt,dn,dsn){
-	
-	var me = this;
-	
-	this.dt = dt;
-	this.dn = dn;
-	this.dsn = dsn ? dsn : dn;
-
-	this.wrapper = $a(parent,'div');
-	me.get_list();
-}
-
-// add contact
-// ------------
-ContactList.prototype.add_contact = function(){
-	var me = this;
-	
-	// onload - set default values
-	var cont = LocalDB.create('Contact');
-
-	var c = locals['Contact'][cont];
-	
-	if(me.dt == 'Customer')	{
-		c.is_customer = 1;
-		c.customer = me.dn;
-		c.customer_name = me.dsn;
-	}
-	else if(me.dt == 'Supplier'){
-		c.is_supplier = 1;
-		c.supplier = me.dn;
-		c.supplier_name = me.dsn;
-	}
-	else if(me.dt == 'Sales Partner'){
-		c.is_sales_partner = 1;
-		c.sales_partner = me.dn;
-		//c.sales_partner_name = me.dsn;
-	}
-	
-	loaddoc('Contact',c.name);
-}
-
-// get contact list
-// -----------------
-ContactList.prototype.get_list = function(){
-	var me = this;
-	
-	me.make_list();
-	
-	var dt = me.dt.toLowerCase().split(' ').join('_');
-	
-	// build query
-	me.lst.get_query = function(){
-		this.query = repl("select name, first_name, last_name, concat_ws(' ', first_name, last_name), email_id, contact_no, department, designation, is_primary_contact, has_login, disable_login from tabContact where %(dt)s = '%(dn)s' and docstatus != 2",{'dt':dt, 'dn':me.dn});
-
-		this.query_max = repl("select count(name) from tabContact where %(dt)s = '%(dn)s' and docstatus != 2",{'dt':dt, 'dn':me.dn});
-	}
-	
-	// render list ui
-	me.lst.show_cell = function(cell,ri,ci,d){
-		me.render_list(cell,ri,ci,d);
-	}
-	
-	// run query
-	me.lst.run();
-	
-	// onrun
-	me.lst.onrun = function(){
-		if(!this.has_data()){
-			this.rec_label.innerHTML = '';
-			
-			$a(this.rec_label,'span').innerHTML = "You do not have any contact. ";
-			$($a(this.rec_label,'span')).html('Add a new contact').addClass('link_type').click(function(){ me.add_contact(); });
-			
-			$dh(this.results);
-		}
-		else{
-			$ds(this.results);
-		}
-	}	
-}
-
-// make list
-// -----------
-ContactList.prototype.make_list = function(){
-	var me = this;
-	
-	var l = new Listing();
-	l.colwidths = ['5%','30%','30%','20%','20%'];
-	l.colnames = ['Sr.','Contact Name','Email Id','Contact No', 'Action'];
-	l.page_len = 10;
-  
-	me.lst = l;
-	
-	l.make(me.wrapper);
-	
-	// Add contact button
-	me.add_btn = $btn(l.btn_area,'+ Add Contact', function(){ me.add_contact();}, {fontWeight:'bold'});
-}
-
-// make contact cell
-// ------------------
-ContactList.prototype.render_list = function(cell,ri,ci,d){
-	var me = this;
-
-	// name
-	if(ci == 0){
-		var nm = $a($a(cell,'div'),'span','',{cursor:'pointer'});
-		nm.innerHTML = d[ri][3];
-		nm.id = d[ri][0];
-		
-		nm.onclick = function(){
-			loaddoc('Contact', this.id);
-			
-			// on save callback - refresh list
-		}
-
-		// department and designation
-		var des = d[ri][7] ? d[ri][7] : '';
-		var dep = d[ri][6] ? d[ri][6] : '';
-		
-		var sp = $a(cell,'div','comment');
-		sp.innerHTML = des + (dep ? (', ' + dep) : ''); 
-	}
-	
-	// email id, contact no, department, designation
-	// -----------------------------------------------------
-	if(ci == 1) cell.innerHTML = d[ri][4] ? d[ri][4] : '-';
-	if(ci == 2) cell.innerHTML = d[ri][5] ? d[ri][5] : '-';
-	
-	// actions
-	// --------------------------------------
-	if(ci== 3) me.make_actions(cell,ri,ci,d);
-}
-
-// make actions
-// ---------------
-ContactList.prototype.make_actions = function(cell,ri,ci,d){
-	var me = this;
-	
-	var tab = make_table(cell,1,2,'100%',['40%','60%']);
-
-	// Edit and Delete
-	var t = make_table($td(tab,0,0),1,2);
-	
-	var edit = $a($td(t,0,0),'div','wn-icon ic-doc_edit');
-	$(edit).click(function(){ loaddoc('Contact',d[ri][0]); });
-	
-	edit.setAttribute('title','Edit');
-
-// Below code should be uncommented once customer/venodr invitation process is stable
-// ===========================================================================
-/* 
-	var del = $a($td(t,0,1),'div','wn-icon ic-trash');
-	$(del).click(function(){ me.delete_contact(d[ri][0],d[ri][4]) });
-
-	set_custom_tooltip(del, 'Delete');
-	
-	//  Invite, Enable and Disable - Integrate after gateway logic incorporated
-
-	if(d[ri][9] == 'Yes')	{
-		if(d[ri][10] == 'Yes'){
-			var enb = $a($td(tab,0,1),'div','wn-icon ic-checkmark');
-			$(enb).click(function(){ me.enable_login(d[ri][0], d[ri][4]); });
-		}
-		else{
-			var dsb = $a($td(tab,0,1),'div','wn-icon ic-delete');
-			$(dsb).click(function(){ me.disable_login(d[ri][0], d[ri][4]) });
-		}
-	}
-	else{
-		var inv = $a($td(tab,0,1),'div','wn-icon ic-mail');
-		$(inv).click(function(){ me.invite_contact(d[ri][0], d[ri][4], d[ri][1], d[ri][2]) });
-	}*/
-}
-
-// enable login
-// ----------------------------------------------------------
-ContactList.prototype.enable_login = function(id, email_id){
-	var me = this;
-	
-	var callback = function(r,rt){
-		me.get_list();
-		
-		if(!r.exc) msgprint('Login for contact enabled',1);
-		else errprint(r.exc);
-	}
-	
-	var args = {};
-	args.contact = id;
-	args.email = email_id;
-	
-	$c_obj('Contact Control','enable_login',JSON.stringify(args),callback);
-}
-
-// disable login
-// -------------------------------------------------------------
-ContactList.prototype.disable_login = function(id, email_id){
-	var me = this;
-	
-	var callback = function(r,rt){
-		me.get_list();
-		
-		if(!r.exc) msgprint('Login for contact disabled',1);
-		else errprint(r.exc);
-	}
-
-	var args = {};
-	args.contact = id;
-	args.email = email_id;
-		
-	$c_obj('Contact Control','disable_login',JSON.stringify(args),callback);
-}
-
-// delete contact
-// -----------------
-ContactList.prototype.delete_contact = function(id,email_id,has_login){
-	var me = this;
-	
-	var callback = function(r,rt){
-		me.get_list();
-		
-		if(!r.exc) msgprint('Contact deleted successfully');
-		else errprint(r.exc);
-	}
-	
-	var args = {};
-	args.contact = id;
-	args.email = email_id;
-	args.has_login = has_login;
-	
-	$c_obj('Contact Control','delete_contact',JSON.stringify(args),callback);
-}
-
-// invite user
-// --------------------------------------------------------
-ContactList.prototype.invite_contact = function(id,email_id,first_name,last_name){
-	var me = this;
-
-	if(!email_id){
-		msgprint("Please add email id and save the contact first. You can then invite contact to view transactions.")
-	}
-	else{
-		var callback = function(r,rt){
-			if(!r.exc) msgprint('Invitation sent');
-			else errprint(r.exc);
-		}
-	
-		var args = {
-			'contact' : id,
-			'email' : email_id,
-			'first_name' : first_name ? first_name : '',
-			'last_name' : last_name ? last_name : '',
-			'usert_type' : 'Partner'
-		};
-		
-		$c_obj('Contact Control','invite_contact',JSON.stringify(args),callback);	
-	}
-}
-
-
-// address list
-// --------------
-AddressList = function(parent,dt,dn,dsn,dsa){
-	
-	var me = this;
-	
-	this.dt = dt;
-	this.dn = dn;
-	this.dsn = dsn ? dsn : dn;
-        this.dsa = dsa ? dsa : '';
-
-	this.wrapper = $a(parent,'div');
-	me.get_addr_list();
-}
-
-
-// add contact
-// ------------
-AddressList.prototype.add_address = function(){
-	var me = this;
-	
-	// onload - set default values
-	var addr = LocalDB.create('Shipping Address');
-
-	var a = locals['Shipping Address'][addr];
-	
-	a.customer = me.dn;
-	a.customer_name = me.dsn;
-        a.customer_address = me.dsa;	
-	loaddoc('Shipping Address',a.name);
-}
-
-
-// get address list
-// -----------------
-AddressList.prototype.get_addr_list = function(){
-	var me = this;
-	
-	me.make_addr_list();
-	
-	var dt = me.dt.toLowerCase().split(' ').join('_');
-	
-	// build query
-	me.lst.get_query = function(){
-		this.query = repl("select name, ship_to, shipping_address, is_primary_address, shipping_details from `tabShipping Address` where %(dt)s = '%(dn)s' and docstatus != 2",{'dt':dt, 'dn':me.dn});
-
-		this.query_max = repl("select count(name) from `tabShipping Address` where %(dt)s = '%(dn)s'",{'dt':dt, 'dn':me.dn});
-	}
-	
-	// render list ui
-	me.lst.show_cell = function(cell,ri,ci,d){
-		me.render_list(cell,ri,ci,d);
-	}
-	
-	// run query
-	me.lst.run();
-	
-	// onrun
-	me.lst.onrun = function(){
-		if(!this.has_data()){
-			this.rec_label.innerHTML = '';
-			
-			$a(this.rec_label,'span').innerHTML = "You do not have any shipping address.";
-			$($a(this.rec_label,'span')).html('Add a new address').addClass('link_type').click(function(){ me.add_address(); });
-			
-			$dh(this.results);
-		}
-		else{
-			$ds(this.results);
-		}
-	}	
-}
-
-
-// make list
-// -----------
-AddressList.prototype.make_addr_list = function(){
-	var me = this;
-	
-	var l = new Listing();
-	l.colwidths = ['5%', '15%', '25%','10%','35%','10%'];
-	l.colnames = ['Sr.', 'Ship To', 'Shipping Address','Primary Address', 'Shipping Details', 'Action'];
-    l.page_len = 10;
-  
-	me.lst = l;
-	
-	l.make(me.wrapper);
-	
-	// Add address button
-	me.add_btn = $btn(l.btn_area,'+ Add Address', function(){ me.add_address();}, {fontWeight:'bold'});
-}
-
-
-
-// make address cell
-// ------------------
-AddressList.prototype.render_list = function(cell,ri,ci,d){
-	var me = this;
-
-	// name
-	if(ci == 0){
-		var nm = $a($a(cell,'div'),'span','',{cursor:'pointer'});
-		nm.innerHTML = d[ri][1];
-		nm.id = d[ri][0];
-		
-		nm.onclick = function(){
-			loaddoc('Shipping Address', this.id);
-		}
-	}
-	
-	// shipping address, primary address, shipping details
-	// ----------------------------------------------------
-	if(ci == 1) cell.innerHTML = d[ri][2] ? d[ri][2] : '-';
-	if(ci == 2) cell.innerHTML = d[ri][3] ? d[ri][3] : '-';
-	if(ci == 3) cell.innerHTML = d[ri][4] ? d[ri][4] : '-';
-	
-	// actions
-	// --------------------------------------
-	if(ci== 4) me.make_actions(cell,ri,ci,d);
-}
-
-// make actions
-// ---------------
-AddressList.prototype.make_actions = function(cell,ri,ci,d){
-	var me = this;
-	
-	var tab = make_table(cell,1,2,'100%',['40%','60%']);
-
-	// Edit and Delete
-	var t = make_table($td(tab,0,0),1,2);
-	
-	var edit = $a($td(t,0,0),'div','wn-icon ic-doc_edit');
-	$(edit).click(function(){ loaddoc('Shipping Address',d[ri][0]); });
-	
-	edit.setAttribute('title','Edit');
-}
diff --git a/erpnext/setup/doctype/contact_control/contact_control.py b/erpnext/setup/doctype/contact_control/contact_control.py
deleted file mode 100644
index 3c25d7f..0000000
--- a/erpnext/setup/doctype/contact_control/contact_control.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# Please edit this list and import only required elements
-import webnotes
-
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
-from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild, removechild, getchildren, make_autoname, SuperDocType
-from webnotes.model.doclist import getlist, copy_doclist
-from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
-from webnotes import session, form, is_testing, msgprint, errprint
-
-set = webnotes.conn.set
-sql = webnotes.conn.sql
-get_value = webnotes.conn.get_value
-in_transaction = webnotes.conn.in_transaction
-convert_to_lists = webnotes.conn.convert_to_lists
-	
-# -----------------------------------------------------------------------------------------
-
-
-class DocType:
-  def __init__(self,doc,doclist=[]):
-    self.doc = doc
-    self.doclist = doclist
-    
-  def enable_login(self,arg):
-    arg = eval(arg)
-    sql("update tabContact set disable_login = 'No' where name=%s",arg['contact'])
-    sql("update tabProfile set enabled=1 where name=%s",arg['email'])
-    
-  def disable_login(self,arg):
-    arg = eval(arg)
-    sql("update tabContact set disable_login = 'Yes' where name=%s",arg['contact'])
-    sql("update tabProfile set enabled=0 where name=%s",arg['email'])
-    
-  def create_login(self,arg):
-    arg = eval(arg)
-    cont_det = sql("select * from tabContact where name=%s",(arg['contact']),as_dict=1)
-    if cont_det[0]['docstatus'] !=0:
-      msgprint('Please save the corresponding contact first')
-      raise Exception
-      
-    if sql("select name from tabProfile where name=%s",cont_det[0]['email_id']):
-      msgprint('Profile with same name already exist.')
-      raise Exception
-    else:
-      p = Document('Profile')
-      p.name = cont_det[0]['email_id']
-      p.first_name = cont_det[0]['first_name']
-      p.last_name = cont_det[0]['last_name']
-      p.email = cont_det[0]['email_id']
-      p.cell_no = cont_det[0]['contact_no']
-      p.password = 'password'
-      p.enabled = 1
-      p.user_type = 'Partner';
-      p.save(1)
-      
-      get_obj(doc=p).on_update()
-      
-      role = []
-      if cont_det[0]['contact_type'] == 'Individual':
-        role = ['Customer']
-      else:
-        if cont_det[0]['is_customer']:
-          role.append('Customer')
-        if cont_det[0]['is_supplier']:
-          role.append('Supplier')
-        if cont_det[0]['is_sales_partner']:
-          role.append('Partner')
-
-      if role:
-        prof_nm = p.name
-        for i in role:
-          r = Document('UserRole')
-          r.parent = p.name
-          r.role = i
-          r.parenttype = 'Profile'
-          r.parentfield = 'userroles'
-          r.save(1)
-        
-          if i == 'Customer':
-            def_keys = ['from_company','customer_name','customer']
-            def_val = cont_det[0]['customer_name']
-            self.set_default_val(def_keys,def_val,prof_nm)
-
-          if i == 'Supplier':
-            def_keys = ['supplier_name','supplier']
-            def_val = cont_det[0]['supplier_name']
-            self.set_default_val(def_keys,def_val,prof_nm)
-
-      sql("update tabContact set has_login = 'Yes' where name=%s",cont_det[0]['name'])
-      sql("update tabContact set disable_login = 'No' where name=%s",cont_det[0]['name'])
-      msgprint('User login is created.')
-      
- #------set default values---------
-  def set_default_val(self,def_keys,def_val,prof_nm):
-    for d in def_keys:
-      kv = Document('DefaultValue')
-      kv.defkey = d
-      kv.defvalue = def_val
-      kv.parent = prof_nm
-      kv.parenttype = 'Profile'
-      kv.parentfield = 'defaults'
-      kv.save(1)
\ No newline at end of file
diff --git a/erpnext/setup/doctype/contact_control/contact_control.txt b/erpnext/setup/doctype/contact_control/contact_control.txt
deleted file mode 100644
index b9e84ad..0000000
--- a/erpnext/setup/doctype/contact_control/contact_control.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-# DocType, Contact Control
-[
-
-	# These values are common in all dictionaries
-	{
-		'creation': '2010-08-08 17:08:56',
-		'docstatus': 0,
-		'modified': '2010-09-20 14:06:57',
-		'modified_by': 'yogesh@webnotestech.com',
-		'owner': 'Administrator'
-	},
-
-	# These values are common for all DocType
-	{
-		'colour': 'White:FFF',
-		'doctype': 'DocType',
-		'in_create': 1,
-		'issingle': 1,
-		'module': 'Setup',
-		'name': '__common__',
-		'read_only': 1,
-		'section_style': 'Simple',
-		'server_code_error': ' ',
-		'show_in_menu': 0,
-		'version': 25
-	},
-
-	# These values are common for all DocField
-	{
-		'doctype': 'DocField',
-		'fieldtype': 'Text',
-		'name': '__common__',
-		'parent': 'Contact Control',
-		'parentfield': 'fields',
-		'parenttype': 'DocType',
-		'permlevel': 0
-	},
-
-	# These values are common for all DocPerm
-	{
-		'create': 0,
-		'doctype': 'DocPerm',
-		'idx': 1,
-		'name': '__common__',
-		'parent': 'Contact Control',
-		'parentfield': 'permissions',
-		'parenttype': 'DocType',
-		'permlevel': 0,
-		'read': 1,
-		'role': 'System Manager',
-		'write': 1
-	},
-
-	# DocType, Contact Control
-	{
-		'doctype': 'DocType',
-		'name': 'Contact Control'
-	},
-
-	# DocPerm
-	{
-		'doctype': 'DocPerm'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'header',
-		'idx': 1,
-		'label': 'Header'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'customer_intro',
-		'idx': 2,
-		'label': 'Customer Intro'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'supplier_intro',
-		'idx': 3,
-		'label': 'Supplier Intro'
-	}
-]
\ No newline at end of file
diff --git a/erpnext/setup/doctype/role/__init__.py b/erpnext/setup/doctype/role/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/setup/doctype/role/__init__.py
+++ /dev/null
diff --git a/erpnext/setup/doctype/role/role.js b/erpnext/setup/doctype/role/role.js
deleted file mode 100644
index 672f4ac..0000000
--- a/erpnext/setup/doctype/role/role.js
+++ /dev/null
@@ -1,6 +0,0 @@
-class DocType:
-  def __init__(self, d, dl):
-    self.doc, self.doclist = d, dl
-
-  def t1(self):
-    msgprint('role')
\ No newline at end of file
diff --git a/erpnext/setup/doctype/role/role.py b/erpnext/setup/doctype/role/role.py
deleted file mode 100644
index 4c9d7f5..0000000
--- a/erpnext/setup/doctype/role/role.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Please edit this list and import only required elements
-import webnotes
-
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
-from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild, removechild, getchildren, make_autoname, SuperDocType
-from webnotes.model.doclist import getlist, copy_doclist
-from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
-from webnotes import session, form, is_testing, msgprint, errprint
-
-set = webnotes.conn.set
-sql = webnotes.conn.sql
-get_value = webnotes.conn.get_value
-in_transaction = webnotes.conn.in_transaction
-convert_to_lists = webnotes.conn.convert_to_lists
-	
-# -----------------------------------------------------------------------------------------
-
-
-class DocType:
-  def __init__(self, d, dl):
-    self.doc, self.doclist = d, dl
-
-  def t1(self):
-    msgprint('role')
\ No newline at end of file
diff --git a/erpnext/setup/doctype/role/role.txt b/erpnext/setup/doctype/role/role.txt
deleted file mode 100644
index afebb31..0000000
--- a/erpnext/setup/doctype/role/role.txt
+++ /dev/null
@@ -1,114 +0,0 @@
-# DocType, Role
-[
-
-	# These values are common in all dictionaries
-	{
-		'creation': '2009-05-12 11:19:11',
-		'docstatus': 0,
-		'modified': '2010-12-28 17:02:39',
-		'modified_by': 'Administrator',
-		'owner': 'Administrator'
-	},
-
-	# These values are common for all DocType
-	{
-		'_last_update': '1307624201',
-		'allow_copy': 0,
-		'allow_email': 0,
-		'allow_print': 0,
-		'autoname': 'field:role_name',
-		'colour': 'White:FFF',
-		'doctype': 'DocType',
-		'hide_heading': 0,
-		'hide_toolbar': 0,
-		'idx': 0,
-		'issingle': 0,
-		'istable': 0,
-		'module': 'Setup',
-		'name': '__common__',
-		'read_only': 0,
-		'section_style': 'Simple',
-		'server_code_error': ' ',
-		'show_in_menu': 0,
-		'version': 1
-	},
-
-	# These values are common for all DocField
-	{
-		'doctype': 'DocField',
-		'name': '__common__',
-		'parent': 'Role',
-		'parentfield': 'fields',
-		'parenttype': 'DocType',
-		'permlevel': 0
-	},
-
-	# These values are common for all DocPerm
-	{
-		'cancel': 0,
-		'create': 1,
-		'doctype': 'DocPerm',
-		'execute': 0,
-		'idx': 1,
-		'name': '__common__',
-		'parent': 'Role',
-		'parentfield': 'permissions',
-		'parenttype': 'DocType',
-		'permlevel': 0,
-		'read': 1,
-		'role': 'Administrator',
-		'submit': 0,
-		'write': 1
-	},
-
-	# DocType, Role
-	{
-		'doctype': 'DocType',
-		'name': 'Role'
-	},
-
-	# DocPerm
-	{
-		'doctype': 'DocPerm'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'module',
-		'fieldtype': 'Select',
-		'idx': 1,
-		'label': 'Module',
-		'oldfieldname': 'module',
-		'oldfieldtype': 'Select',
-		'options': 'link:Module Def',
-		'reqd': 1
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'role_name',
-		'fieldtype': 'Data',
-		'idx': 2,
-		'label': 'Role Name',
-		'oldfieldname': 'role_name',
-		'oldfieldtype': 'Data',
-		'reqd': 1
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'defaults',
-		'fieldtype': 'Table',
-		'hidden': 0,
-		'idx': 3,
-		'label': 'Defaults',
-		'oldfieldname': 'defaults',
-		'oldfieldtype': 'Table',
-		'options': 'DefaultValue',
-		'reqd': 0,
-		'search_index': 0
-	}
-]
\ No newline at end of file
diff --git a/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt b/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt
index f59ab73..7cc2350 100644
--- a/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt
+++ b/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2012-02-02 11:50:33',
+		'creation': '2012-02-22 15:45:56',
 		'docstatus': 0,
-		'modified': '2012-02-21 16:11:29',
+		'modified': '2012-02-22 15:45:56',
 		'modified_by': u'Administrator',
 		'owner': u'Administrator'
 	},
diff --git a/erpnext/utilities/doctype/doctype_label/__init__.py b/erpnext/utilities/doctype/doctype_label/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/utilities/doctype/doctype_label/__init__.py
+++ /dev/null
diff --git a/erpnext/utilities/doctype/doctype_label/doctype_label.txt b/erpnext/utilities/doctype/doctype_label/doctype_label.txt
deleted file mode 100644
index 12f0cf8..0000000
--- a/erpnext/utilities/doctype/doctype_label/doctype_label.txt
+++ /dev/null
@@ -1 +0,0 @@
-[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2010-06-10 10:41:58', 'search_fields': None, 'module': 'Application Internal', 'doctype': 'DocType', 'change_log': None, 'print_outline': '', 'owner': 'Administrator', 'in_dialog': None, 'in_create': None, 'read_only': None, 'allow_email': None, 'dt_template': None, 'hide_heading': None, 'issingle': None, 'allow_rename': None, 'smallicon': None, 'allow_attach': None, 'show_in_menu': None, 'max_attachments': None, 'version': 2, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': 'field:dt', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'DocType Label', 'idx': None, 'hide_toolbar': None, 'colour': 'White:FFF', 'client_script': None, 'modified': '2010-09-20 14:06:57', 'server_code_error': ' ', 'name_case': '', 'parenttype': None, 'read_only_onload': None, 'server_code_core': None, 'server_code_compiled': None, 'parent_node': None, 'parentfield': None}, {'cancel': None, 'amend': None, 'execute': None, 'modified_by': 'Administrator', 'name': 'PERM01036', 'parent': 'DocType Label', 'read': 1, 'create': 1, 'creation': '2010-06-10 10:41:58', 'modified': '2010-06-10 10:44:09', 'submit': None, 'doctype': 'DocPerm', 'write': 1, 'idx': 1, 'parenttype': 'DocType', 'role': 'Administrator', 'owner': 'Administrator', 'docstatus': 0, 'permlevel': 0, 'match': None, 'parentfield': 'permissions'}, {'no_copy': None, 'oldfieldtype': 'Select', 'creation': '2010-06-10 10:41:58', 'doctype': 'DocField', 'oldfieldname': 'dt', 'owner': 'Administrator', 'reqd': 1, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Select DocType', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'DocType Label', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL05322', 'idx': 1, 'default': None, 'colour': None, 'modified': '2010-06-10 10:44:09', 'parenttype': 'DocType', 'fieldname': 'dt', 'fieldtype': 'Select', 'options': 'link:DocType', 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2010-06-10 10:41:58', 'doctype': 'DocField', 'oldfieldname': 'dt_label', 'owner': 'Administrator', 'reqd': 1, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'DocType Label', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'DocType Label', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL05323', 'idx': 2, 'default': None, 'colour': None, 'modified': '2010-06-10 10:44:09', 'parenttype': 'DocType', 'fieldname': 'dt_label', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/erpnext/utilities/doctype/doctype_property_setter/__init__.py b/erpnext/utilities/doctype/doctype_property_setter/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/utilities/doctype/doctype_property_setter/__init__.py
+++ /dev/null
diff --git a/erpnext/utilities/doctype/doctype_property_setter/doctype_property_setter.py b/erpnext/utilities/doctype/doctype_property_setter/doctype_property_setter.py
deleted file mode 100644
index 28eccd4..0000000
--- a/erpnext/utilities/doctype/doctype_property_setter/doctype_property_setter.py
+++ /dev/null
@@ -1,15 +0,0 @@
-class DocType:
-  def __init__(self,d,dl):
-    self.doc, self.doclist = d, dl
-    
-  def update_dt(self):
-    sql("update tabDocType set module=%s, autoname=%s, read_only_onload=%s, section_style=%s, description=%s where name=%s limit 1", (self.doc.module, self.doc.autoname, self.doc.show_print_format_first, self.doc.page_style, self.doc.description, self.doc.select_doctype))
-    
-  def get_details(self):
-    ret = sql("select module, autoname, read_only_onload, section_style, description from tabDocType where name=%s", (self.doc.select_doctype))    
-    self.doc.module = ret[0][0] or ''
-    self.doc.autoname = ret[0][1] or ''
-    self.doc.show_print_format_first = ret[0][2] or 0
-    self.doc.page_style = ret[0][3] or 'Simple'
-    self.doc.description = ret[0][4] or ''
-    
\ No newline at end of file
diff --git a/erpnext/utilities/doctype/doctype_property_setter/doctype_property_setter.txt b/erpnext/utilities/doctype/doctype_property_setter/doctype_property_setter.txt
deleted file mode 100644
index f0d17d8..0000000
--- a/erpnext/utilities/doctype/doctype_property_setter/doctype_property_setter.txt
+++ /dev/null
@@ -1,138 +0,0 @@
-# DocType, DocType Property Setter
-[
-
-	# These values are common in all dictionaries
-	{
-		'creation': '2010-08-08 17:08:59',
-		'docstatus': 0,
-		'modified': '2010-09-20 14:06:57',
-		'modified_by': 'Administrator',
-		'owner': 'Administrator'
-	},
-
-	# These values are common for all DocType
-	{
-		'colour': 'White:FFF',
-		'doctype': 'DocType',
-		'issingle': 1,
-		'module': 'Utilities',
-		'name': '__common__',
-		'section_style': 'Simple',
-		'server_code_error': ' ',
-		'version': 4
-	},
-
-	# These values are common for all DocField
-	{
-		'doctype': 'DocField',
-		'name': '__common__',
-		'parent': 'DocType Property Setter',
-		'parentfield': 'fields',
-		'parenttype': 'DocType',
-		'permlevel': 0
-	},
-
-	# These values are common for all DocPerm
-	{
-		'create': 1,
-		'doctype': 'DocPerm',
-		'idx': 1,
-		'name': '__common__',
-		'parent': 'DocType Property Setter',
-		'parentfield': 'permissions',
-		'parenttype': 'DocType',
-		'permlevel': 0,
-		'read': 1,
-		'role': 'System Manager',
-		'write': 1
-	},
-
-	# DocType, DocType Property Setter
-	{
-		'doctype': 'DocType',
-		'name': 'DocType Property Setter'
-	},
-
-	# DocPerm
-	{
-		'doctype': 'DocPerm'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'select_doctype',
-		'fieldtype': 'Select',
-		'idx': 1,
-		'label': 'Select DocType',
-		'options': 'link:DocType'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldtype': 'Button',
-		'idx': 2,
-		'label': 'Get Details',
-		'options': 'get_details',
-		'trigger': 'Server'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'module',
-		'fieldtype': 'Link',
-		'idx': 3,
-		'label': 'Module',
-		'options': 'Module Def'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'autoname',
-		'fieldtype': 'Data',
-		'idx': 4,
-		'label': 'Autoname'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'page_style',
-		'fieldtype': 'Select',
-		'idx': 5,
-		'label': 'Page Style',
-		'options': 'Simple\nTabbed\nTray'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'show_print_format_first',
-		'fieldtype': 'Check',
-		'idx': 6,
-		'label': 'Show Print Format First'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldname': 'description',
-		'fieldtype': 'Text Editor',
-		'idx': 7,
-		'label': 'Description',
-		'width': '300px'
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
-		'fieldtype': 'Button',
-		'idx': 8,
-		'label': 'Update',
-		'options': 'update_dt',
-		'trigger': 'Server'
-	}
-]
\ No newline at end of file
diff --git a/erpnext/utilities/page/file_browser/__init__.py b/erpnext/utilities/page/file_browser/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/utilities/page/file_browser/__init__.py
+++ /dev/null
diff --git a/erpnext/utilities/page/file_browser/file_browser.html b/erpnext/utilities/page/file_browser/file_browser.html
deleted file mode 100644
index d30409e..0000000
--- a/erpnext/utilities/page/file_browser/file_browser.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<div style="margin: 0px;">
-<div id="fb_header">&nbsp;</div>
-<!--
-<table style="border: 1px solid #cccccc; width: 100%; background-color: #dfe1fd; vertical-align: middle; border-collapse: collapse;" border="0">
-<tbody>
-<tr>
-<td style="width: 70%; padding-left: 8px;">
-<h2>File Browser</h2>
-</td>
-<td style="width: 30%; text-align: right; padding-right: 8px; vertical-align: middle;"><span class="link_type" title="Close"> <img style="cursor:pointer" mce_style="cursor:pointer" onclick="nav_obj.show_last_open()" src="images/icons/close.gif" mce_src="images/icons/close.gif" alt="" /> </span></td>
-</tr>
-</tbody>
-</table>
--->
-<div style="width: 100%;">
-<table style="border: 1px solid #cccccc; width: 100%; border-collapse: collapse;" border="0">
-<tbody>
-<tr>
-<td style="border: 1px solid #cccccc; padding: 8px; width: 40%; border-collapse: collapse;">
-<table style="width: 100%;" border="0">
-<tbody>
-<tr>
-<td id="fb_gen_action" style="width: 100%; vertical-align: middle;">&nbsp;</td>
-</tr>
-<tr>
-<td id="fb_tree_div" style="width: 100%; padding-top: 20px;">&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</td>
-<td style="border: 1px solid #cccccc; padding: 8px; width: 60%; border-collapse: collapse;">
-<table style="width: 100%;" border="0">
-<tbody>
-<tr>
-<td id="fb_file_action" style="width: 100%; vertical-align: middle;">&nbsp;</td>
-</tr>
-<tr>
-<td id="fb_grp_action" style="width: 100%; vertical-align: middle;">&nbsp;</td>
-</tr>
-<tr>
-<td id="fb_display_div" style="width: 100%; vertical-align: middle;">&nbsp;</td>
-</tr>
-<tr>
-<td id="unselect">
-<h2 style="color:#AAA">You have not selected anything.</h2>
-</td>
-</tr>
-</tbody>
-</table>
-</td>
-</tr>
-</tbody>
-</table>
-</div>
-</div>
\ No newline at end of file
diff --git a/erpnext/utilities/page/file_browser/file_browser.js b/erpnext/utilities/page/file_browser/file_browser.js
deleted file mode 100644
index 279bbed..0000000
--- a/erpnext/utilities/page/file_browser/file_browser.js
+++ /dev/null
@@ -1,992 +0,0 @@
-pscript['onload_File Browser'] = function(){
-	
-	// header and toolbar
-	var h = new PageHeader('fb_header','File Management','Upload and share your file across users');
-	//$dh(h.toolbar); $y(h.toolbar,{width:'0px', height:'0px'})
-	
-	if(!pscript.fb_tree)
-		pscript.create_browser_tree();
-	pscript.get_root_file_grps();
-	
-	pscript.create_action_widget();
-	pscript.create_display_div();
-
-	pscript.create_n_file_grp_obj();
-	pscript.create_n_file_obj();
-	pscript.create_attach_obj();
-	
-	pscript.get_all_roles();
-	
-	$ds(pscript.gen_div);
-	$dh(pscript.grp_div);
-	$dh(pscript.file_div);
-	
-	$ds($i('unselect'));
-}
-
-// Get all roles
-pscript.get_all_roles = function(){
-	if(!pscript.fg_all_roles){
-		var callback = function(r,rt){
-			pscript.fg_all_roles = r.message ? r.message : '';
-			pscript.create_share_obj();
-			pscript.fg_share.make(r.message);
-		}
-		$c_obj('File Browser Control','get_all_roles','',callback);
-	}
-}
-
-
-// Creating File Browser tree.
-pscript.create_browser_tree = function() {
-
-	$i('fb_tree_div').innerHTML = '';
-	var tree = new Tree($i('fb_tree_div'), '100%');
-	pscript.fb_tree = tree;
-	
-	pscript.fb_tree.std_onclick = function(node) { /*pass*/ }		   // on click
-	pscript.fb_tree.std_onexp = function(node) { /*PASS*/ }			 // on expand
-	
-	$ds(pscript.gen_div);
-	$dh(pscript.grp_div);
-	$dh(pscript.file_div);
-	
-	$dh(pscript.f_file_display);
-}
-
-// Creating a Share Privilege object.
-pscript.create_share_obj = function(){
-	
-	var d = new Dialog(400,400,'Assign Privilege');
-	var me = d;
-	d.inputs = {};
-	
-	d.make_body([
-		['HTML','Privilege','<div id="fg_share_div" style="overflow-y:auto; height:300px"></div>'],
-		['Button','Update']
-	]);
-	
-	
-	d.make = function(all_roles){
-		optn_header = make_table('fg_share_div',1,2,'100%',['60%','40%'],{padding:'4px'});
-
-		for(var c=0;c<2;c++){
-			if(c==1)
-				$td(optn_header,0,c).innerHTML = '<b>Privilege</b>';
-			else
-				$td(optn_header,0,c).innerHTML = '<b>Role</b>';
-		}
-		
-		optn_tbl = make_table('fg_share_div',all_roles.length,2,'100%',['60%','40%'],{padding:'4px'});
-		
-		for(var i=0;i<all_roles.length;i++){
-
-			var v=$a($td(optn_tbl, i,0),'div');
-			v.innerHTML=all_roles[i];
-
-			// make select
-			var sel = $a($td(optn_tbl, i,1),'select');
-			add_sel_options(sel,['None','Edit','View'],'None');
-			
-			sel.r_nm = all_roles[i];
-			d.inputs[sel.r_nm] = sel;
-			
-			sel.onchange = function(){}
-		}
-	}
-
-	// Assigning roles in Share Privilege object.
-	d.assign = function(all_roles,edit_roles,view_roles){
-
-		if(all_roles == undefined) all_roles = '';		
-		if(edit_roles == undefined) edit_roles = '';
-		if(view_roles == undefined) view_roles = '';
-		
-		for(var i=0;i<all_roles.length;i++){
-			var ele = all_roles[i];
-			var sel = me.inputs[ele];
-			
-			if(in_list(edit_roles,ele))
-				sel.value = 'Edit';
-			else if(in_list(view_roles,ele))
-				sel.value = 'View';
-			else
-				sel.value = 'None';
-		}
-	}
-	
-	//on update
-	d.widgets['Update'].onclick = function(){
-		var edit_roles = []; var view_roles = [];
-		
-		for(var i=0;i<pscript.fg_all_roles.length;i++){
-			var ele = pscript.fg_all_roles[i]; var sel = me.inputs[ele];
-
-			if(sel_val(sel) == 'Edit')
-				edit_roles.push(ele)
-			else if(sel_val(sel) == 'View')
-				view_roles.push(ele)
-		}
-
-		var args = {}; args.name = pscript.f_cur_node_name; args.type = pscript.f_cur_node_type;
-		args.edit_roles = edit_roles.join(','); args.view_roles = view_roles.join(',');
-		
-		$c_obj('File Browser Control','update_privileges',docstring(args),function(r,rt){me.hide();});
-	}
-	
-	d.onshow = function(){}	
-	d.onhide = function(){}
-	pscript.fg_share = d;
-}
-
-// Action Widget
-pscript.create_action_widget = function(){
-
-	// General Actions.
-	// new action widget
-	pscript.gen_div = $i('fb_gen_action');
-	
-	//refresh tree
-	f_refresh = $a(pscript.gen_div,'span','',{marginRight:'15px'});
-	f_refresh.innerHTML = '<img src="images/icons/page_refresh.gif" style="margin-right:5px; vertical-align:middle"/><span class="link_type" style="vertical-align:middle">Refresh</span>';
-	f_refresh.onclick = function(){
-		pscript.fb_refresh(); 
-		$dh(pscript.f_file_display);
-	}
-
-	// new group
-	f_new_grp = $a(pscript.gen_div,'span','',{marginRight:'15px'});
-	f_new_grp.innerHTML = '<img src="images/icons/folder.gif" style="margin-right: 5px; vertical-align:middle"><span class="link_type" style="vertical-align:middle">New</span>';
-	f_new_grp.onclick = function(){ pscript.fb_show_grp(''); $ds(pscript.f_file_display); $dh($i('unselect')); }
-
-	// Group actions.	
-	pscript.grp_div = $i('fb_grp_action');
-	
-	// share group
-	f_share_grp = $a(pscript.grp_div,'span','',{marginRight:'15px'});
-	f_share_grp.innerHTML = '<img src="images/icons/user.png" style="margin-right: 5px; vertical-align:middle"><span class="link_type" style="vertical-align:middle">Share</span>';
-	f_share_grp.onclick = function(){ pscript.fb_share(); }
-	
-	//Delete group.
-	f_del_grp = $a(pscript.grp_div,'span','',{marginRight:'15px'});
-	f_del_grp.innerHTML = '<img src="images/icons/cancel.gif" style="margin-right: 5px; vertical-align:middle"><span class="link_type" style="vertical-align:middle">Delete</span>';
-	f_del_grp.onclick = function(){ pscript.fb_delete(); }
-	
-	// Add file to group.
-	f_new_file = $a(pscript.grp_div,'span','',{marginRight:'15px'});
-	f_new_file.innerHTML = '<img src="images/icons/page_add.gif" style="margin-right: 5px; vertical-align:middle"><span class="link_type" style="vertical-align:middle">Upload</span>';
-	f_new_file.onclick = function(){ pscript.fb_create_new_file(); }
-   // $dh(f_new_file);
-	
-	// file actions
-	pscript.file_div = $i('fb_file_action');
-
-
-	//share file
-	f_share_file = $a(pscript.file_div,'span','',{marginRight:'15px'});
-	f_share_file.innerHTML = '<img src="images/icons/user.png" style="margin-right: 5px; vertical-align:middle"><span class="link_type" style="vertical-align:middle">Share</span>';
-	f_share_file.onclick = function(){ pscript.fb_share(); };
-	
-	// delete file
-	f_del_file = $a(pscript.file_div,'span','',{marginRight:'15px'});
-	f_del_file.innerHTML = '<img src="images/icons/cancel.gif" style="margin-right: 5px; vertical-align:middle"><span class="link_type" style="vertical-align:middle">Delete</span>';
-	f_del_file.onclick = function(){ pscript.fb_delete(); };
-	
-		
-	//edit file
-	f_edit_file = $a(pscript.file_div,'span','',{marginRight:'15px'});
-	f_edit_file.innerHTML = '<img src="images/icons/table_edit.png" style="margin-right: 5px; vertical-align:middle"><span class="link_type" style="vertical-align:middle">Edit</span>';
-	f_edit_file.onclick = function(){ pscript.fb_edit_file(); };
-}
-
-
-// Refresh tree
-pscript.fb_refresh = function(){
-	pscript.create_browser_tree();
-	pscript.get_root_file_grps();
-	
-	$ds(pscript.gen_div);
-	$dh(pscript.grp_div);
-	$dh(pscript.file_div);
-	
-	if(!pscript.f_cur_node_name){ $dh($i('unselect')); } else{ $ds($i('unselect')); }
-}
-
-// Show selected / create a new file group.
-pscript.fb_show_grp = function(grp){
-	var parent = pscript.f_file_display;
-
-	if(!grp || grp == undefined){
-		parent.f_file_title.innerHTML = 'New File Group';
-		pscript.n_file_grp.show('');
-	}
-	else{
-		var callback = function(r,rt){
-
-			var grp_det = r.message ? r.message : '';
-
-			parent.f_file_title.innerHTML = grp_det['Group Name']; 
-			if(has_common(grp_det['Can Edit'].split(','),user_roles) || user==grp_det['Owner']){ $ds(pscript.grp_div); }
-			else{ $dh(pscript.grp_div); }
-			
-			pscript.n_file_grp.show(grp_det);
-		}
-		$c_obj('File Browser Control','get_fg_details',grp,callback);
-	}
-	$ds(parent); $ds(parent.f_file_content);
-}
-
-//share privileges.
-pscript.fb_share = function(){
-	var callback = function(r,rt){
-		pscript.fg_edit_roles = r.message[0][0] ? r.message[0][0].split(',') : '';
-		pscript.fg_view_roles = r.message[0][1] ? r.message[0][1].split(',') : '';
-		
-		pscript.fg_share.assign(pscript.fg_all_roles,pscript.fg_edit_roles,pscript.fg_view_roles);
-		pscript.fg_share.show();
-	}
-	var args = {};
-	args.dt = pscript.f_cur_node_type;
-	args.dn = pscript.f_cur_node_name;
-	$c_obj('File Browser Control','get_privileges',docstring(args),callback);
-}
-
-// delete group
-pscript.fb_delete = function(){
-	pscript.delete_node('File Browser Control',pscript.f_cur_node_type,pscript.f_cur_node_name,'');
-	$dh(pscript.f_file_display);
-}
-
-// Create a new file.
-pscript.fb_create_new_file = function(){
-	var parent = pscript.f_file_display;
-	
-	pscript.f_cur_parent = pscript.f_cur_node;
-	
-	parent.f_file_title.innerHTML = 'New File';
-	pscript.n_file.show(0,'frm_node');
-}
-
-// If file other than image then download file.
-pscript.fb_show_txt_file = function(){
-	$i('file_link').href = repl('cgi-bin/getfile.cgi?ac=%(acc)s&name=%(f_nm)s',{acc:session.account_name, f_nm:pscript.f_cur_node_file});
-	$i('file_link').target = "_blank";
-}
-
-// Area to display content.
-pscript.create_display_div = function(){
-
-	var d = $a($i('fb_display_div'),'div');
-	
-	d.f_file_title = $a(d,'div','',{fontSize:'14px',fontWeight:'bold'});
-	$y($a(d,'div'),{margin:'5px 0px 5px 0px',borderBottom:'1px solid #333'});
-
-	d.f_file_content = $a(d,'div','',{marginTop:'20px'});
-	pscript.f_file_display = d;
-	$dh(d);
-}
-
-// function to create a new File Group object.
-pscript.create_n_file_grp_obj = function(){
-	var n_file_grp = new pscript.n_file_grp_Obj();
-	pscript.n_file_grp = n_file_grp;
-}
-
-// Create a new File object.
-pscript.create_n_file_obj = function(){
-	var n_file = new pscript.n_file_Obj();
-	pscript.n_file = n_file;
-}
-
-// Create a new Attachement object.
-pscript.create_attach_obj = function(){
-	var attach_obj = new pscript.attach_Obj();
-	pscript.attach_obj = attach_obj;
-}
-
-// File Group object.
-pscript.n_file_grp_Obj = function() {
-  
-	this.inputs = {}; var me = this; this.fg_field_lst = [];
-	
-	this.make_section = function(label, tp, css) {
-
-		var div = $a(this.wrapper,'div','',{marginBottom:'8px'});
-		var t = make_table(div,1,2,'90%',['35%','65%']);
-
-		if(tp=='button'){
-			var element = $a($td(t,0,1), 'button', 'button');
-			element.innerHTML = label;
-		}
-		else if(tp == 'link'){
-			var element = make_field({fieldtype:'link', 'label':label, 'options':'File Group'}, '', $td(t,0,1), this, 0, 1);
-			$y($td(t,0,1),{width:'100%'})
-			element.in_filter = 1; element.refresh();
-			
-			$td(t,0,0).innerHTML = label;
-			element.display_div = $a($td(t,0,1),'div', '', {width:'80%'});
-			me.fg_field_lst.push(label);
-		}
-		else {
-			var element = $a($td(t,0,1),tp, '', {width:'80%'});
-			$td(t,0,0).innerHTML = label;
-			
-			element.display_div = $a($td(t,0,1),'div', '', {width:'80%'});
-			$dh(element.display_div);
-			me.fg_field_lst.push(label);
-		}
-		
-		if(css){
-			$y($td(t,0,0),css);
-		}
-		
-		element.wrapper = div;
-		
-		if(label) me.inputs[label] = element;
-		return element;
-	}
-  
-	this.make = function() {
-
-		this.wrapper = document.createElement('div');
-
-		this.make_section('Group Name','input',{color:'red'});
-		this.make_section('Parent Group','link');
-		this.make_section('Description','textarea');
-		$y(this.inputs['Description'],{height:'140px'});
-		
-		this.make_section('Save','button');
-
-		// cancel
-		this.inputs['Cancel'] = $a(this.inputs['Save'].parentNode, 'button', 'button');
-		this.inputs['Cancel'].innerHTML = 'Cancel';
-		$y(this.inputs['Cancel'], {marginLeft:'8px'});
-	}
-  
-	this.show = function(grp_det){
-		
-		if(! me.wrapper) me.make();
-
-		var field_lst = me.fg_field_lst;
-
-		if(!grp_det || grp_det == undefined){
-			pscript.fg_edit_roles = ''; pscript.fg_view_roles = ''; me.inputs['Save'].disabled = false;
-		
-			for(i in field_lst){
-				var fld_nm = field_lst[i] ? field_lst[i] : '';
-				var fld = me.inputs[fld_nm] ? me.inputs[fld_nm] : '';
-				fld.display_div.innerHTML = '';
-				
-				if(fld_nm == 'Parent Group'){ fld.txt.value = ''; $ds(fld.input_area); }
-				else{ fld.value = ''; $ds(fld); }
-				
-				$dh(fld.display_div); 
-			}
-			me.inputs['Save'].onclick = function(){ me.save(''); }
-		}
-		else{
-			pscript.fg_edit_roles = grp_det['Can Edit'] ? grp_det['Can Edit'].split(',') : '';
-			pscript.fg_view_roles = grp_det['Can View'] ? grp_det['Can View'].split(',') : '';		
-			for(i in field_lst){
-				var fld_nm = field_lst[i] ? field_lst[i] : '';
-				var fld = me.inputs[fld_nm] ? me.inputs[fld_nm] : '';
-				fld.display_div.innerHTML = grp_det[fld_nm] ? grp_det[fld_nm] : '';
-
-				if(fld_nm == 'Parent Group') fld.txt.value = grp_det[fld_nm] ? grp_det[fld_nm] : '';
-				else fld.value = grp_det[fld_nm] ? grp_det[fld_nm] : '';
-									
-				if(has_common(pscript.fg_edit_roles,user_roles) || user == grp_det['Owner']){
-					if(fld_nm == 'Parent Group') $ds(fld.input_area); else $ds(fld); 
-					$dh(fld.display_div); me.inputs['Save'].disabled = false;
-				}
-				else{
-					if(fld_nm == 'Parent Group') $dh(fld.input_area); else $dh(fld);
-					$ds(fld.display_div); me.inputs['Save'].disabled = true;
-				}
-			}
-			me.inputs['Save'].onclick = function(){ me.save(grp_det['Name']); }
-		}
-		me.show_as();
-		me.inputs['Cancel'].onclick = function() { me.cancel(); me.hide();}
-	}
-  
-	this.save = function(name) {
-		var grp_nm = me.inputs['Group Name'].value; grp_nm = strip(grp_nm," ");
-		var parent_grp = me.inputs['Parent Group'].get_value(); parent_grp = strip(parent_grp," ");
-		var desc = me.inputs['Description'].value; desc = strip(desc," ");
-		
-		if(grp_nm == '') msgprint('Please enter group name');
-		else{ var args = {}; args.grp_nm = grp_nm; args.parent_grp = parent_grp; args.desc = desc; }
-		
-		if(!name || name == undefined){
-			args.name = '';
-			var callback = function(r,rt){
-				pscript.f_cur_node_name = r.message ? r.message : '';
-				pscript.fb_show_grp(pscript.f_cur_node_name);
-				pscript.fb_refresh();
-				//if(!pscript.f_cur_parent){ pscript.fb_refresh(); pscript.f_cur_node_name = }
-				//else{ pscript.load_child_nodes(); }
-			}
-			$c_obj('File Browser Control','create_new_grp',docstring(args),callback);
-		}
-		else{
-			args.name = name;
-			var callback = function(r,rt){
-				var grp = r.message ? r.message : '';
-				pscript.fb_show_grp(grp);
-				pscript.fb_refresh();
-			}
-			$c_obj('File Browser Control','update_grp',docstring(args),callback);
-		}
-		
-	}
-  
-	this.cancel = function(){
-		$dh(pscript.f_file_display);this.hide();
-	}
-  
-	this.show_as = function() {
-		if(me.wrapper.parentNode) me.wrapper.parentNode.removeChild(me.wrapper);
-		
-		var parent = pscript.f_file_display;
-		pscript.remove_child_nodes(parent.f_file_content);
-
-		parent.f_file_content.appendChild(me.wrapper);
-		$ds(pscript.f_file_display); $ds(me.wrapper);
-	}
-  
-	this.hide = function() {
-		$dh(me.wrapper); me.display = 0;
-	}
-}
-
-// File Object.
-pscript.n_file_Obj = function() {
-
-	this.inputs = {};
-	var me = this;
-	
-	this.make_section = function(label, tp, css) {
-
-		var div = $a(this.wrapper,'div','',{marginBottom:'8px'});
-		var t = make_table(div,1,2,'90%',['38%','62%']);
-		
-		if(tp=='button'){
-			var element = $a($td(t,0,1), 'button', 'button');
-			element.innerHTML = label;
-		}
-		else if(tp=='Note'){
-			var element = $a($td(t,0,1),'span','',{color:'red'});
-			element.innerHTML = 'Fields in red are mandatory.'
-		}
-		else if(tp=='link'){
-			var element = make_field({fieldtype:'link', 'label':label, 'options':'File Group'}, '', $td(t,0,1), this, 0, 1);
-			$y($td(t,0,1),{width:'100%'})
-			element.in_filter = 1; element.refresh();
-			
-			$td(t,0,0).innerHTML = label;
-			element.display_div = $a($td(t,0,1),'div', '', {width:'80%'});
-			element.txt.onchange = function(){ pscript.set_file_det_value(pscript.attach_obj,pscript.n_file); }
-		}
-		else {
-			var element = $a($td(t,0,1),tp, '', {width:'95%'});
-			$td(t,0,0).innerHTML = label;
-			element.onchange = function(){ pscript.set_file_det_value(pscript.attach_obj,pscript.n_file); }
-		}
-
-		//---css to label---
-		if(css){
-			$y($td(t,0,0),css);
-		}
-	
-		element.wrapper = div;
-		
-		if(label) me.inputs[label] = element;
-		return element;
-	}
-
-	this.make = function() {
-
-		this.wrapper = document.createElement('div');
-		
-		// note
-		this.make_section('','Note');
-		
-		// upload area
-		this.ul_area = $a(this.wrapper,'div','',{marginBottom:'8px'});
-		$dh(this.ul_area);
-		
-		// file group and description
-		this.make_section('File Group','link',{color:'red'});
-		this.make_section('Description','textarea');
-		$y(this.inputs['Description'],{height:'140px'});
-
-		//save
-		this.make_section('Save','button');$dh(this.inputs['Save']);
-
-		// cancel
-		this.inputs['Cancel'] = $a(this.inputs['Save'].parentNode, 'button', 'button');
-		this.inputs['Cancel'].innerHTML = 'Cancel'; $dh(this.inputs['Cancel']);
-		$y(this.inputs['Cancel'], {marginLeft:'8px'});
-	}
-  
-	this.show = function(edit,frm){
-		if(! me.wrapper) me.make();
-		
-		if(edit){
-			var callback1 = function(r,rt){
-				file_det = r.message;
-			
-				me.inputs['Description'].value = file_det['description'] ? file_det['description'] : '';
-				me.inputs['File Group'].txt.value = file_det['file_group'] ? file_det['file_group'] : '';
-
-				pscript.f_cur_node_file = file_det['file_list'] ? file_det['file_list'].split(NEWLINE)[0].split(',')[1] : '';
-
-				me.inputs['Save'].file_id = file_det['name'] ? file_det['name'] : '';
-				me.inputs['Save'].onclick = function(){ me.save(this.file_id);}
-				pscript.attach_obj.show(me, me.ul_area, 1, file_det);
-			}
-			$ds(me.ul_area); $di(me.inputs['Save']); $di(me.inputs['Cancel']);
-			$c_obj('File Browser Control','get_file_details',pscript.f_cur_node_name,callback1);
-		}
-		else{
-			$ds(me.ul_area); $dh(me.inputs['Save']); $dh(me.inputs['Cancel']);
-
-			me.inputs['Description'].value = '';
-			if(frm == 'frm_node') me.inputs['File Group'].txt.value = pscript.f_cur_node_label;
-			var parent = pscript.f_file_display;
-			parent.f_file_title.innerHTML = 'New File';
-			
-			$ds(parent);
-			me.inputs['Save'].onclick = function(){ me.save('');}
-			pscript.attach_obj.show(me,me.ul_area,0,'');
-		}
-		me.inputs['Cancel'].onclick = function() { me.cancel(); me.hide(); }
-	}
-  
-	this.save = function(name) {
-
-		var desc = me.inputs['Description'].value; desc = strip(desc," ");
-		file_grp = me.inputs['File Group'].txt.value; file_grp = strip(file_grp," ");
-		
-		if(file_grp == '') msgprint('Please select file group');
-
-		var args = {}; args.desc = desc; args.file_grp = file_grp;
-		
-		if(name){
-			args.name = name;
-			var callback = function(){
-				//pscript.fb_edit_file();
-				
-				//refreshing parent
-				pscript.load_child_nodes();
-			}
-			$c_obj('File Browser Control','update_file',docstring(args),callback);
-		}
-		else{
-			args.name = ''
-			var callback = function(r,rt){
-				var f = eval('var a='+r.message+';a');
-				
-				//refreshing node
-				pscript.load_child_nodes();
-				
-				//pscript.f_cur_node_name = f.name; pscript.f_cur_node_label = f.label;
-				//pscript.fb_edit_file();
-			}
-			$c_obj('File Browser Control','create_new_file',docstring(args),callback);
-		}
-	}
-  
-	this.cancel = function(){
-		$dh(pscript.f_file_display); this.hide();
-	}
-  
-	this.show_as = function(edit) {
-	    if(me.wrapper.parentNode) me.wrapper.parentNode.removeChild(me.wrapper);
-	
-		var parent = pscript.f_file_display;
-		pscript.remove_child_nodes(parent.f_file_content);
-
-		parent.f_file_content.appendChild(me.wrapper);
-		$ds(pscript.f_file_display); $ds(parent.f_file_content);
-		$ds(me.wrapper);
-	}
-  
-	this.hide = function() {
-		$dh(me.wrapper);
-		me.display = 0;
-	}
-}
-
-// File Attachement object.
-pscript.attach_Obj = function(){
-
-	var me = this;
-		
-	this.show = function(obj,parent,edit,dict){
-		var me = this;
-		if(!me.wrapper) { me.make(); }
-
-		me.show_as(obj,parent,edit,dict);
-		obj.show_as(edit);
-	}
-
-	this.make = function(){
-		var me = this;
-		this.wrapper = document.createElement('div');
-		
-		var div = $a(this.wrapper,'div',{marginBottom:'8px', border:'1px solid #AAA'});
-		
-		var t1 = make_table(div,1,2,'90%',['38%','62%']);
-		
-		lbl_area = $a($td(t1,0,0),'div');
-		lbl_area.innerHTML = '<img src="images/icons/paperclip.gif"><span style="margin-left4px; color:red;">File:</span><br>';
-	
-		main_area = $a($td(t1,0,1),'div');
-		
-		this.upload_div = $a(main_area,'div');
-		this.download_div = $a(main_area,'div');
-			
-		me.make_ul_area();
-		me.make_dl_area();
-	}
-	
-	//image upload area
-	this.make_ul_area = function(){
-		var me = this;
-		
-		this.upload_div.innerHTML = '';
-
-		var div = $a(this.upload_div,'div');
-		div.innerHTML = '<iframe id="fb_iframe" name="fb_iframe" src="blank1.html" style="width:0px; height:0px; border:0px"></iframe>';
-
-		var div = $a(this.upload_div,'div');
-		div.innerHTML = '<form method="POST" enctype="multipart/form-data" action="'+outUrl+'" target="fb_iframe"></form>';
-
-		var ul_form = div.childNodes[0];
-		
-		this.upload_div.ul_form = ul_form;
-		
-		var f_list = [];
-
-		// file data
-		var inp_fdata = $a_input($a(ul_form,'span'),'file',{name:'filedata'});
-
-		var inp_btn = $a_input($a(ul_form,'span'),'hidden',{name:'cmd'}); inp_btn.value = 'upload_many';
-		var inp = $a_input($a(ul_form,'span'),'hidden',{name:'form_name'}); inp.value = 'File Browser';
-		var inp = $a_input($a(ul_form,'span'),'submit'); inp.value = 'Upload';
-		
-		this.inp_file = $a_input($a(ul_form,'span'),'hidden',{name:'file_id'});
-		this.file_det = $a_input($a(ul_form,'span'),'hidden',{name:'file_det'});
-
-		inp_btn.onclick = function(){
-			pscript.set_file_det_value(pscript.attach_obj,pscript.n_file);
-		}
-	}
-	
-	//download link
-	this.make_dl_area = function(){
-		var me = this;
-		var download_tbl = make_table(this.download_div,1,2,'100%',['70%','30%']);
-		
-		var download_link = $a($td(download_tbl,0,0),'a','link_type');
-		
-		this.download_div.download_link = download_link;
-		
-		var remove_link = $a($td(download_tbl,0,1),'span','link_type',{textAlign:'right',marginLeft:'20px'});
-		remove_link.innerHTML = 'Remove';
-		
-		this.download_div.remove_link = remove_link;		
-	}
-	
-	this.show_as = function(obj,parent,edit,dict){
-		var me = this;
-		
-		// add to parent
-		if(me.wrapper.parentNode) me.wrapper.parentNode.removeChild(me.wrapper);
-		parent.appendChild(me.wrapper);
-		$ds(me.wrapper);
-		
-		if(edit){
-			pscript.set_file_det_value(pscript.attach_obj,pscript.n_file);
-			me.inp_file.value = dict.name ? dict.name : '';
-   
-			if(dict.file_list){ $dh(me.upload_div); $ds(me.download_div); }
-			else{ $ds(me.upload_div); $dh(me.download_div); }
-			
-			// download
-			me.download_div.download_link.innerHTML = dict.file_list ? dict.file_list.split(',')[0] : '';
-			me.download_div.download_link.onclick = function(){
-				this.href = repl('cgi-bin/getfile.cgi?ac=%(acc)s&name=%(f_nm)s',{acc:session.account_name, f_nm:pscript.f_cur_node_file});
-				this.target = "_blank";
-			}
-			
-			// remove
-			me.download_div.remove_link.onclick = function(){
-				$c_obj('File Browser Control','remove_file',docstring(dict),function(r,rt){
-					pscript.n_file.show(0,'frm_remove');
-				});
-				$ds(me.upload_div); $dh(me.download_div);
-			}
-		}
-		else{
-			$ds(me.upload_div); $dh(me.download_div);
-			me.inp_file.value = '';
-			pscript.set_file_det_value(pscript.attach_obj,pscript.n_file);
-		}
-	}
-}
-
-// Get all root file groups(where Parent Group is null).
-pscript.get_root_file_grps = function(){
-
-	if (pscript.fb_tree){
-		pscript.fb_tree.body.innerHTML = '';
-	}
-  
-	var callback1 = function(r,rt){
-		var cl = r.message ? r.message : ''; var n = pscript.fb_tree.allnodes[cl]; var has_children = true;
-		
-		for(var i=0; i<cl.length;i++){
-			if(!cl[i][2] || cl[i][2] == undefined) cl[i][2] = ''; if(!cl[i][3] || cl[i][3] == undefined) cl[i][3] = '';
-			if(has_common(cl[i][2].split(','),user_roles) || has_common(cl[i][3].split(','),user_roles) || user == cl[i][4]){
-				var r = pscript.fb_tree.addNode(null, cl[i][0],'', pscript.show_hide_link , has_children ? pscript.fb_get_children : null, null, cl[i][1]);
-				r.rec = cl[i]; r.rec.name = cl[i][0]; r.rec.label = cl[i][1]; r.rec.parent_grp = ''; r.rec.file_list = ''; r.rec.type = 'File Group';
-			}
-		}
-	}
-	$c_obj('File Browser Control','get_root_file_grps','',callback1);
-}
-
-// Onclick of a tree node will show / hide corresponding actions from action widget.
-pscript.show_hide_link = function(node){
-
-	$dh($i('unselect'));
-	$dh(pscript.f_file_display);
-	
-	pscript.f_cur_node = node;
-	
-	if(node.parent){
-		pscript.f_cur_parent = node.parent;
-	}
-	else{ pscript.f_cur_parent = ''; }
-	
-	pscript.f_cur_node_name = node.rec.name;
-
-	if(node.rec.label){ pscript.f_cur_node_label = node.rec.label; }
-	else{ pscript.f_cur_node_label = ''; }
-	
-	if(node.rec.type){ pscript.f_cur_node_type = node.rec.type; }
-	else{ pscript.f_cur_node_type = ''; }
-	
-	if(node.rec.file_list){ pscript.f_cur_node_file = node.rec.file_list.split(NEWLINE)[0].split(',')[1]; }
-	else{ pscript.f_cur_node_file = ''; }
-
-	img_extns = ['jpg','jpeg','gif','png','biff','cgm','dpof','exif','img','mng','pcx','pic','pict','raw','tga','wmf']
-	extn = node.rec.file_list ? node.rec.file_list.split(NEWLINE)[0].split(',')[0].split('.')[1] : '';
-
-	var dsp_div = pscript.f_file_display;
-	dsp_div.f_file_title.innerHTML = pscript.f_cur_node_label;
-
-	if(node.rec.type == 'File Group'){
-		$dh(pscript.file_div);
-		$ds(pscript.grp_div);
-		pscript.fb_show_grp(pscript.f_cur_node_name);
-	}
-	else if(node.rec.type == 'File'){
-		$dh(pscript.grp_div);
-		$ds(pscript.file_div);
-		if(pscript.f_cur_node_file){
-			if(inList(img_extns,extn)){
-				pscript.fb_show_img();
-			}
-			else{
-				// IE FIX
-				pscript.remove_child_nodes(dsp_div.f_file_content);
-				
-				var div = document.createElement('div');
-				div.innerHTML = '<a class="link_type" onclick="pscript.fb_show_txt_file()" id="file_link">Click to Open/ Download file.</span>';				
-				dsp_div.f_file_content.appendChild(div);
-				$ds(dsp_div);
-			}
-		}
-		else{
-			dsp_div.f_file_content.innerHTML = 'No attachement found.';
-			$ds(pscript.f_file_display);
-			
-			$ds(pscript.file_div);
-			$dh(pscript.grp_div);			
-		}
-		pscript.show_edit_file_link(node.rec.name);
-	}
-	else{
-		$dh(pscript.grp_div);
-		$dh(pscript.file_div);
-	}
-}
-
-// Onexpand of a tree node get all childrens(Files / File Groups).
-pscript.fb_get_children = function(node){
-	if(node.expanded_once) return;
-	$ds(node.loading_div);
-	
-	var callback = function(r,rt){
-		var p = pscript.fb_tree.allnodes[r.message.parent_grp];
-		$dh(node.loading_div);
-
-		var fl = r.message.fl ? r.message.fl : '';
-		if(fl){
-			for(var i=0; i<fl.length; i++){
-				if(fl[i][3] == undefined) fl[i][3] = '';
-				if(fl[i][4] == undefined) fl[i][4] = '';
-				
-				if(has_common(fl[i][3].split(','),user_roles) || has_common(fl[i][4].split(','),user_roles) || (user == fl[i][5])){
-					var imgsrc = 'images/icons/page.gif'; var has_children = false; 
-					if(fl[i][1]) var label = fl[i][1]; else var label = fl[i][0];
-
-					var n = pscript.fb_tree.addNode(p,fl[i][0],imgsrc,pscript.show_hide_link,has_children ? pscript.fb_get_children:null,null,label);
-					n.rec = fl[i]; n.rec.name = fl[i][0]; n.rec.parent_grp = r.message.parent_grp;
-					n.rec.label = fl[i][1]; n.rec.file_list = fl[i][2]; n.rec.type = 'File';
-				}
-			}
-		}
-		
-		var fl_grp = r.message.fl_grp ? r.message.fl_grp : '';
-		if(fl_grp){
-			for(var i=0;i<fl_grp.length;i++){
-				if(fl_grp[i][2] == undefined) fl_grp[i][2] = '';
-				if(fl_grp[i][3] == undefined) fl_grp[i][3] = '';
-
-				if(has_common(fl_grp[i][2].split(','),user_roles) || has_common(fl_grp[i][3].split(','),user_roles) || (user == fl_grp[i][4])){
-					var imgsrc = 'images/icons/folder.gif'; var has_children = true;
-					var label = fl_grp[i][1] ? fl_grp[i][1] : fl_grp[i][0];
-
-					var n = pscript.fb_tree.addNode(p,fl_grp[i][0],imgsrc,pscript.show_hide_link,has_children ? pscript.fb_get_children:null,null,label);
-					n.rec = fl_grp[i]; n.rec.name = fl_grp[i][0]; n.rec.parent_grp = r.message.parent_grp;
-					n.rec.label = fl_grp[i][1]; n.rec.file_list = ''; n.rec.type='File Group';
-				}
-			}
-		}
-	}
-	$c_obj('File Browser Control','get_children',node.rec.name,callback);
-}
-
-// If image file then display image.
-pscript.fb_show_img = function(){
-
-	var parent = pscript.f_file_display;
-
-	parent.f_file_title.innerHTML = pscript.f_cur_node_label;
-	pscript.remove_child_nodes(parent.f_file_content);
-
-	var a = $a(parent.f_file_content,'a');
-	
-	var img = $a(a,'img','',{textAlign:'center',cursor:'pointer'}); 
-	img.src = repl('cgi-bin/getfile.cgi?ac=%(acc)s&name=%(f_nm)s&thumbnail=300',{acc:session.account_name, f_nm:pscript.f_cur_node_file});
-	$ds(pscript.f_file_display);
-
-	a.onclick = function(){
-		this.href = repl('cgi-bin/getfile.cgi?ac=%(acc)s&name=%(f_nm)s',{acc:session.account_name, f_nm:pscript.f_cur_node_file});
-		this.target = "_blank";
-	}
-}
-
-// Enable/ disable Edit File action.
-pscript.show_edit_file_link = function(){
-	
-	var callback = function(r,rt){
-			pscript.f_edit_roles = r.message[0][0] ? r.message[0][0].split(',') : '';
-			pscript.f_view_roles = r.message[0][1] ? r.message[0][1].split(',') : '';
-			
-			if(has_common(pscript.f_edit_roles,user_roles) || user == r.message[0][2]){
-				$ds(pscript.file_div);
-			}
-			else{ $dh(pscript.file_div); }
-	}
-	
-	var args = {};
-	args.dt = pscript.f_cur_node_type;
-	args.dn = pscript.f_cur_node_name;
-	$c_obj('File Browser Control','get_privileges',docstring(args),callback);
-}
-
-// Set file detail in attachement object.
-pscript.set_file_det_value = function(att,file){
-	if(file.inputs['Description'].value) file_desc = file.inputs['Description'].value; else file_desc = 'NIL';
-	if(file.inputs['File Group'].txt.value) file_grp = file.inputs['File Group'].txt.value; else file_grp = 'NIL';
-	att.file_det.value = file_desc + '~~' + file_grp;
-}
-
-// Edit selected file.
-pscript.fb_edit_file = function(){
-	var parent = pscript.f_file_display;
-	parent.f_file_title.innerHTML = pscript.f_cur_node_label;
-	pscript.n_file.show(1,'frm_node');
-}
-
-//delete dialog structure
-
-pscript.delete_node = function(sdt,dt,dn,callback){
-	if(!pscript.delete_dialog){
-		var delete_dialog = new Dialog(400,200);
-
-		delete_dialog.make_body([
-			['HTML','Message',''],
-			['HTML','Response',''],
-			['HTML','Delete Record','<div id="delete_record" style="height:25px"></div>']
-		]);
-		
-		delete_dialog.y_btn = $a($i('delete_record'),'button','button');
-		delete_dialog.y_btn.innerHTML = 'Ok';
-		delete_dialog.y_btn.onclick = function(){
-			delete_dialog.widgets['Response'].innerHTML = 'Deleting...';
-			var args = {};
-			args.dt = delete_dialog.dt; args.dn = delete_dialog.dn;
-			
-			var callback1 = function(r,rt){
-				delete_dialog.onhide = delete_dialog.callback;
-				delete_dialog.hide();
-				
-				//refreshing node
-				pscript.load_child_nodes();
-			}
-			$c_obj(sdt,'delete',docstring(args),callback1);
-		}
-		
-		delete_dialog.n_btn = $a($i('delete_record'),'button','button');
-		delete_dialog.n_btn.innerHTML = 'Cancel';
-		
-		delete_dialog.n_btn.onclick = function(){
-			delete_dialog.widgets['Response'].innerHTML = '';
-			delete_dialog.onhide = '';
-			delete_dialog.hide();
-		}
-
-		delete_dialog.widgets['Message'].innerHTML = 'Note: All data will be deleted permanantly. Do you want to continue?';
-		pscript.delete_dialog = delete_dialog;
-	}
-	//if(!delete_dialog.display) delete_dialog.show();
-	pscript.delete_dialog.show();
-	pscript.delete_dialog.widgets['Response'].innerHTML = '';
-	pscript.delete_dialog.sdt = sdt; pscript.delete_dialog.dt=dt; pscript.delete_dialog.dn=dn; pscript.delete_dialog.callback = callback;
-}
-
-pscript.remove_child_nodes = function(parent){
-	var len = parent.childNodes.length;
-	if(len){
-		for(l=0; l<len; l++){
-			var c = parent.childNodes[0];
-			parent.removeChild(c);
-		}
-	}
-}
-
-pscript.load_child_nodes = function(){
-	if(pscript.f_cur_parent){
-		pscript.f_cur_parent.clear_child_nodes();
-		pscript.f_cur_parent.expand();
-		pscript.f_cur_parent.select();
-	}
-	else{ pscript.fb_refresh(); }
-}
\ No newline at end of file
diff --git a/erpnext/utilities/page/file_browser/file_browser.txt b/erpnext/utilities/page/file_browser/file_browser.txt
deleted file mode 100644
index b4496f9..0000000
--- a/erpnext/utilities/page/file_browser/file_browser.txt
+++ /dev/null
@@ -1,121 +0,0 @@
-# Page, File Browser
-[
-
-	# These values are common in all dictionaries
-	{
-		'creation': '2010-10-12 15:19:31',
-		'docstatus': 0,
-		'modified': '2010-12-27 11:09:52',
-		'modified_by': 'Administrator',
-		'owner': 'Administrator'
-	},
-
-	# These values are common for all Page
-	{
-		'doctype': 'Page',
-		'module': 'Utilities',
-		'name': '__common__',
-		'page_name': 'File Browser',
-		'show_in_menu': 1,
-		'standard': 'Yes'
-	},
-
-	# These values are common for all Page Role
-	{
-		'doctype': 'Page Role',
-		'name': '__common__',
-		'parent': 'File Browser',
-		'parentfield': 'roles',
-		'parenttype': 'Page'
-	},
-
-	# Page, File Browser
-	{
-		'doctype': 'Page',
-		'name': 'File Browser'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 1,
-		'role': 'Administrator'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 2,
-		'role': 'Sales User'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 3,
-		'role': 'Sales Manager'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 4,
-		'role': 'System Manager'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 5,
-		'role': 'Purchase User'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 6,
-		'role': 'Purchase Manager'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 7,
-		'role': 'Accounts User'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 8,
-		'role': 'Accounts Manager'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 9,
-		'role': 'Production User'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 10,
-		'role': 'Production Manager'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 11,
-		'role': 'Material User'
-	},
-
-	# Page Role
-	{
-		'doctype': 'Page Role',
-		'idx': 12,
-		'role': 'Customer'
-	}
-]
\ No newline at end of file
diff --git a/erpnext/utilities/page/messages/__init__.py b/erpnext/utilities/page/messages/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/utilities/page/messages/__init__.py
+++ /dev/null
diff --git a/erpnext/utilities/page/messages/messages.html b/erpnext/utilities/page/messages/messages.html
deleted file mode 100644
index ded3393..0000000
--- a/erpnext/utilities/page/messages/messages.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<div id="message_header" style="margin-bottom: 8px"></div>
-<div id="inbox_tabs"></div>
\ No newline at end of file
diff --git a/erpnext/utilities/page/messages/messages.js b/erpnext/utilities/page/messages/messages.js
deleted file mode 100644
index 43b4bd7..0000000
--- a/erpnext/utilities/page/messages/messages.js
+++ /dev/null
@@ -1,931 +0,0 @@
-pscript.onload_Messages = function() {
-  var p = new PageHeader($i('message_header'),'Messages');
-  pscript.msg_struct = new Message();
-}
-
-pscript.onshow_Messages = function() {
-  pscript.msg_struct.show_inbox();
-}
-
-function Message(){
-  if(!this.mytabs) this.make_body();
-}
-
-Message.prototype.make_body = function() {
-  var me = this;
-  this.mytabs = new TabbedPage($i('inbox_tabs'));
-  $y(this.mytabs.body_area, {padding:'16px'})
-
-  me.make_inbox();
-  me.make_compose();
-  me.make_sent();
-  
-  this.mytabs.tabs['Inbox'].show();
-}
-
-Message.prototype.make_inbox = function() {
-  var me = this;
-  
-  //inbox tab
-  me.mytabs.add_tab('Inbox', function() { 
-    me.inbox_lst.generate_unread_lst();
-    me.inbox_lst.msg_li.run(); 
-    me.cur_inbox_list = me.inbox_lst.msg_li; // for refresh
-  });
-  
-  if(!this.inbox_lst) this.inbox_lst = new MessageList(me.mytabs.tabs['Inbox'].tab_body, 'inbox msg');
-  this.inbox_lst.msg_li.get_query = function() {
-    //me.checked_msg_lst = [];
-    me.all_msg = {};
-    this.query = repl("select distinct t1.name, t1.last_updated_on, t1.last_updated_by, t1.subject, t3.first_name, t3.file_list, t1.message_date, t1.owner, t1.message, t1.previous_updated_by from `tabMail` t1, `tabMail Participant Details` t2, `tabProfile` t3 where t1.is_main_thread='Yes' and t2.participant_name='%(user)s' and (t2.delete_status is NULL or t2.delete_status = 'No') and t1.name = t2.parent and ((t1.last_updated_by = t3.name and t1.last_updated_by!='%(user)s') or (t1.previous_updated_by = t3.name and t1.previous_updated_by!='%(user)s')) order by t1.modified desc", {'user':user});
-    
-    this.query_max = repl("select distinct count(t1.name) from `tabMail` t1, `tabMail Participant Details` t2, `tabProfile` t3 where t1.is_main_thread='Yes' and t2.participant_name='%(user)s' and (t2.delete_status is NULL or t2.delete_status = 'No') and t1.name = t2.parent and ((t1.last_updated_by = t3.name and t1.last_updated_by!='%(user)s') or (t1.previous_updated_by = t3.name and t1.previous_updated_by!='%(user)s')) order by t1.modified desc", {'user':user});
-  }
-  
-  this.inbox_lst.generate_unread_lst();  
-  this.inbox_lst.msg_li.run();
-  this.inbox_lst.msg_li.onrun = function(){ me.inbox_lst.show_if_no_msg(me.inbox_lst.msg_li); }
-}
-
-Message.prototype.make_compose = function() {
-  var me = this;
-  
-  me.mytabs.add_tab('Compose', function() { 
-    if(!pscript.compose_msg_obj){
-      pscript.compose_msg_obj = new MessageThread(me.mytabs.tabs['Compose'].tab_body, me.mytabs.tabs['Inbox'], me.inbox_lst.lst_wrapper, 'My Inbox'); 
-      //pscript.compose_msg_obj.show_msg(0, me.mytabs.tabs['Compose'].tab_body, me.mytabs.tabs['Inbox'], me.inbox_lst.lst_wrapper, 'My Inbox', me.mytabs.tabs['Sent'], me.sent_lst.lst_wrapper);
-    }
-    pscript.compose_msg_obj.show_msg(0, me.mytabs.tabs['Compose'].tab_body, me.mytabs.tabs['Inbox'], me.inbox_lst.lst_wrapper, 'My Inbox', me.mytabs.tabs['Sent'], me.sent_lst.lst_wrapper);
-    
-    this.cur_inbox_list = null;
-  });
-}
-
-Message.prototype.make_sent = function() {
-  var me = this;
-  
-  // sent msg tab
-  me.mytabs.add_tab('Sent', function() { 
-    me.sent_lst.msg_li.run(); 
-    me.cur_inbox_list = me.sent_lst.msg_li; // for refresh
-  });
-  
-  if(!this.sent_lst) this.sent_lst = new MessageList(me.mytabs.tabs['Sent'].tab_body, 'sent msg');
-  this.sent_lst.msg_li.get_query = function() {
-    //me.checked_msg_lst = [];
-    me.all_msg = {};
-    
-    this.query = repl("select distinct t1.name, t1.last_updated_on, t1.last_updated_by, t1.subject, t3.first_name, t3.file_list, t1.message_date, t1.owner, t1.message from `tabMail` t1, `tabProfile` t3, `tabMail Participant Details` t2 where t1.is_main_thread='Yes' and t1.last_updated_by='%(user)s' and t1.last_updated_by = t3.name and t2.participant_name = '%(user)s' and (t2.delete_status is NULL or t2.delete_status = 'No') and t2.parent = t1.name order by t1.modified desc", {'user':user});
-    this.query_max = repl("select distinct count(t1.name) from `tabMail` t1, `tabProfile` t3, `tabMail Participant Details` t2 where t1.is_main_thread='Yes' and t1.last_updated_by='%(user)s' and t1.last_updated_by = t3.name and t2.participant_name = '%(user)s' and (t2.delete_status is NULL or t2.delete_status = 'No') and t2.parent = t1.name order by t1.modified desc", {'user':user});
-  }
-  this.sent_lst.msg_li.run();
-  this.sent_lst.msg_li.onrun = function(){ me.sent_lst.show_if_no_msg(me.sent_lst.msg_li); }
-}
-
-Message.prototype.show_inbox = function(){
-  var me = this;
-  if(me.inbox_lst){
-    me.inbox_lst.msg_li.run();
-  }
-  me.mytabs.tabs['Inbox'].show();
-}
-
-MessageList = function(parent_tab, req_frm) {
-  this.checked_msg_lst = [];
-  this.unread_msg_lst = [];
-  this.all_msg = {};
-  this.parent_tab = parent_tab;
-  this.req_frm = req_frm;
-  this.make();
-}
-
-MessageList.prototype.make = function(){
-  var me = this;
-  
-  this.lst_wrapper = $a(me.parent_tab, 'div');
-  
-  //toolbar
-  this.toolbar_area = $a(this.lst_wrapper, 'div', '', {paddingTop:'12px'});
-  this.create_toolbar();
-  
-  //no inbox msg div
-  this.no_lst_wrapper = $a(me.parent_tab, 'div', '', {padding:'8px',backgroundColor:'#FFE4AA'});
-  $dh(this.no_lst_wrapper);
-  
-  //view inbox msg div
-  this.view_msg_wrapper = $a(me.parent_tab, 'div');
-  
-  this.msg_li = new Listing("Recent Messages",1);
-  this.msg_li.colwidths = ['90%'];
-  this.msg_li.opts.no_border = 1;
-  this.msg_li.opts.show_empty_tab = 0;
-  this.msg_li.opts.no_border = 1;
-  
-  this.msg_li.show_cell = function(cell,ri,ci,d) {
-    if(ri % 2)$y(cell,{backgroundColor:'#E1E3DE'});
-    if(ci ==0){
-      this.msg_lst = new MessagePreview(cell, me.req_frm, d[ri][0], d[ri][1], d[ri][2], d[ri][3], d[ri][4], d[ri][5], d[ri][6], d[ri][7], d[ri][8], d[ri][9], me.lst_wrapper, me.view_msg_wrapper, me.unread_msg_lst, me.all_msg);
-    }
-  }
-  this.msg_li.make(this.lst_wrapper);
-  $dh(this.msg_li.btn_area);
-}
-
-MessageList.prototype.create_toolbar = function(){
-  var me = this;
-  
-  this.toolbar_tbl = make_table(me.toolbar_area, 1, 2, '100%', ['85%', '15%']);
-  
-  this.select_all_lnk = $a($td(this.toolbar_tbl, 0, 0), 'span', 'link_type');
-  this.select_all_lnk.innerHTML = 'Select All';
-  $dh(this.select_all_lnk);
-  
-  this.unselect_all_lnk = $a($td(this.toolbar_tbl, 0, 0), 'span', 'link_type');
-  this.unselect_all_lnk.innerHTML = 'Unselect All';
-  $dh(this.unselect_all_lnk);
-  
-  this.select_all_lnk.onclick = function(){
-    $ds(me.unselect_all_lnk);
-    $dh(me.select_all_lnk);
-    for(m in me.all_msg){
-      me.all_msg[m].checked = true;
-    }
-  }
-  
-  this.unselect_all_lnk.onclick = function(){
-    $ds(me.select_all_lnk);
-    $dh(me.unselect_all_lnk);
-    for(m in me.all_msg){
-      me.all_msg[m].checked = false;
-    }
-  }
-  
-  this.delete_selected_btn = $a($td(this.toolbar_tbl, 0, 1), 'button', 'button', {align:'right'});
-  this.delete_selected_btn.innerHTML = 'Delete Selected';
-  $dh(this.delete_selected_btn);
-  this.delete_selected_btn.onclick = function(){
-    me.checked_msg_lst = [];    
-    for(m in me.all_msg){
-      if(me.all_msg[m].checked == true)
-        me.checked_msg_lst.push(m);
-    }
-    me.delete_selected();
-  }
-}
-
-MessageList.prototype.show_if_no_msg = function(lst_data){
-  var me = this;
-  $dh(me.view_msg_wrapper);
-  
-  if(!lst_data.has_data()){  
-    $ds(me.no_lst_wrapper);
-    $dh(me.lst_wrapper);
-    if(me.req_frm == 'inbox msg'){
-      me.no_lst_wrapper.innerHTML = "You have no messages in your Inbox.";      
-    }
-    else if(me.req_frm == 'sent msg'){
-      me.no_lst_wrapper.innerHTML = "You have no messages in your Sent messages list.";
-    }
-  } else {    
-    $dh(me.no_lst_wrapper); 
-    $ds(me.lst_wrapper);
-    $dh(me.no_lst_wrapper); 
-    $ds(me.lst_wrapper);
-    $dh(this.unselect_all_lnk);
-    $ds(this.select_all_lnk);
-    $ds(this.delete_selected_btn);
-  }
-}
-
-MessageList.prototype.generate_unread_lst = function(){
-  var me = this;
-  
-  var msg_callback = function(r, rt){
-    if(r.message.ur_lst){
-      me.unread_msg_lst = r.message.ur_lst;
-    }
-  }
-  $c('runserverobj', {doctype:'Message Control',method:'get_unread_msg_lst',arg:user}, msg_callback);
-}
-
-MessageList.prototype.delete_selected = function(){
-  var me = this;
-  
-  if(me.checked_msg_lst.length >= 1) me.msg_li.msg_lst.delete_msg(me.checked_msg_lst);
-  else  msgprint("error:Please select the message to delete");
-}
-
-function MessagePreview(parent, req_frm, msg_id, last_updated_on, last_updated_by, subject, first_name, profile_pic, msg_date, msg_owner, message, previous_updated_by, lst_wrapper, view_msg_wrapper, unread_msg_lst, all_msg_dict) { 
-  this.create_structure(parent);
-  
-  if(req_frm) this.req_frm = req_frm;
-  this.msg_id = msg_id;
-  this.subject = subject;
-  this.message = message;
-  this.msg_date = msg_date;
-  this.msg_owner = msg_owner;
-  this.first_name = first_name;
-  this.lst_wrapper = lst_wrapper;
-  this.view_msg_wrapper = view_msg_wrapper;
-  if(profile_pic) this.profile_pic = profile_pic;
-  if(last_updated_on) this.last_updated_on = last_updated_on;
-  if(last_updated_by) this.last_updated_by = last_updated_by;
-  if(previous_updated_by) this.previous_updated_by = previous_updated_by;
-	this.unread_msg_lst = unread_msg_lst;
-  this.all_msg = all_msg_dict;
-  
-  this.show_msg_sender();
-  this.show_msg_subject();
-  this.show_delete_lnk();
-}
-
-MessagePreview.prototype.create_structure = function(parent){
-  this.wrapper = $a(parent,'div');
-  this.t = make_table(this.wrapper, 1, 4, '100%', ['5%','10%','80%','5%']);
-}
-
-MessagePreview.prototype.show_msg_sender = function(){
-  var me = this;
-  
-  // checkbox
-  var chk_box = $a($td(this.t, 0, 0),'div');
-  if(isIE) {
-    chk_box.innerHTML = '<input type="checkbox" style="border: 0px">'; // IE fix
-    this.inp = chk_box.childNodes[0];
-  } else {
-    this.inp = $a(chk_box, 'input');
-    this.inp.type = 'checkbox';
-  }
-  
-  this.inp.onclick = function() { 
-    for(m in me.all_msg){
-      if(m == me.msg_id)
-        me.all_msg[m].checked = me.inp.checked;
-    }
-  }
-  
-  me.all_msg[me.msg_id] = this.inp;
-  
-  //sender or receiver
-  // photo
-  if(this.profile_pic) {
-    var img = $a($td(this.t, 0, 1),'img');
-    var img_src = this.profile_pic.split(NEWLINE)[0].split(',')[0]
-    img.src = repl('cgi-bin/getfile.cgi?name=%(fn)s&thumbnail=32',{fn:img_src})
-  }
-  //name
-  var div = $a($td(this.t, 0, 1),'div');
-  div.innerHTML = this.first_name;
-}
-
-MessagePreview.prototype.show_msg_subject = function() {
-  var me = this;
-  // message
-  var div1 = $a($td(this.t, 0, 2),'div', '', {paddingBottom:'4px'});
-  var sp = $a(div1,'span','link_type', {fontSize:'12px'});
-  sp.innerHTML = 'Sub : ' +me.subject;
-  
-  var div = $a($td(this.t, 0, 2),'div', 'comment',{paddingBottom:'8px'});
-  div.innerHTML = 'created by: ' + me.msg_owner +' | created on: ' + dateutil.str_to_user(me.msg_date)+ ' | last updated on: ' + dateutil.str_to_user(me.last_updated_on);
-  
-  if (me.req_frm == 'inbox msg' && inList(me.unread_msg_lst, me.msg_id)) {
-    $y(sp,{fontWeight:'bold',color:'Black'});
-    $y(div,{fontWeight:'bold',color:'Black'});
-  }
-  
-  sp.style.cursor = 'pointer';
-  sp.msg_id = me.msg_id; sp.req_frm = me.req_frm;
-  
-  sp.onclick = function() {
-    $dh(me.lst_wrapper);
-    if(this.req_frm == 'inbox msg'){
-      if(!pscript.inbox_msg_obj){
-        pscript.inbox_msg_obj = new MessageThread(me.view_msg_wrapper, pscript.msg_struct.mytabs.tabs['Inbox'], me.lst_wrapper, 'My Inbox'); 
-      }
-      pscript.inbox_msg_obj.show_msg(this.msg_id, me.view_msg_wrapper, pscript.msg_struct.mytabs.tabs['Inbox'], me.lst_wrapper, 'My Inbox', pscript.msg_struct.mytabs.tabs['Sent'], me.lst_wrapper);
-      
-      //mark for already read
-      if (this.req_frm == 'inbox msg' && inList(me.unread_msg_lst,this.msg_id)) {
-        me.mark_as_read(this.msg_id);
-      }
-    }
-    else if(this.req_frm == 'sent msg'){
-      if(!pscript.sent_msg_obj){
-        pscript.sent_msg_obj = new MessageThread(me.view_msg_wrapper, pscript.msg_struct.mytabs.tabs['Sent'], me.lst_wrapper, 'My Inbox'); 
-      }
-      pscript.sent_msg_obj.show_msg(this.msg_id, me.view_msg_wrapper, pscript.msg_struct.mytabs.tabs['Sent'], me.lst_wrapper, 'My Inbox', pscript.msg_struct.mytabs.tabs['Sent'], me.lst_wrapper); 
-    }
-  }
-}
-
-MessagePreview.prototype.mark_as_read = function(msg_id){
-  this.msg_id = msg_id;
-  var me = this;
-  
-  args = {'user' : user, 'msg':this.msg_id,'read':'Yes'}
-  $c_obj('Message Control','read_unread_message',docstring(args),function(r,rt){
-    me.remove_element(me.unread_msg_lst, me.msg_id);
-  });
-}
-
-MessagePreview.prototype.delete_msg = function(msg_nm_lst){
-  this.msg_nm_lst = msg_nm_lst;
-  var me = this; 
-  var delete_msg_dialog;
-  
-  set_delete_msg_dialog = function() {
-    delete_msg_dialog = new Dialog(400, 200, 'Delete Message');
-    delete_msg_dialog.make_body([
-      ['HTML', 'Message', '<div class = "comment">Are you sure, you want to delete message(s) ?</div>'],
-      ['HTML', 'Response', '<div class = "comment" id="delete_msg_dialog_response"></div>'],
-      ['HTML', 'Delete Msg', '<div></div>']
-    ]);
-    
-    var delete_msg_btn1 = $a($i(delete_msg_dialog.widgets['Delete Msg']), 'button', 'button');
-    delete_msg_btn1.innerHTML = 'Yes';
-    delete_msg_btn1.onclick = function(){ delete_msg_dialog.add(); }
-    
-    var delete_msg_btn2 = $a($i(delete_msg_dialog.widgets['Delete Msg']), 'button', 'button');
-    delete_msg_btn2.innerHTML = 'No';
-    $y(delete_msg_btn2,{marginLeft:'4px'});
-    delete_msg_btn2.onclick = function(){ delete_msg_dialog.hide();}
-    
-    delete_msg_dialog.onshow = function() {
-      $i('delete_msg_dialog_response').innerHTML = '';
-    }
-    
-    delete_msg_dialog.add = function() {
-      // sending...
-      $i('delete_msg_dialog_response').innerHTML = 'Processing...';
-      var m_arg = user+ '~~' + this.msg_nm_lst;
-      
-      var call_back = function(r,rt) { 
-        if(r.message == 'true'){
-          $i('delete_msg_dialog_response').innerHTML = 'Message Deleted';
-          delete_msg_dialog.hide();
-          
-          for(m=0; m<me.msg_nm_lst.length; m++){
-            if(inList(me.unread_msg_lst, me.msg_nm_lst[m]))
-              me.remove_element(me.unread_msg_lst, me.msg_nm_lst[m]);
-          }
-          pscript.msg_struct.inbox_lst.msg_li.run();
-          pscript.msg_struct.sent_lst.msg_li.run();
-        }
-      }
-      $c('runserverobj', {doctype:'Message Control',method:'delete_message',arg:m_arg}, call_back); 
-    }
-  }  
-  
-  if(!delete_msg_dialog){
-    set_delete_msg_dialog();
-  }  
-  delete_msg_dialog.msg_nm_lst = this.msg_nm_lst;
-  delete_msg_dialog.show();
-}
-
-MessagePreview.prototype.remove_element = function(arrayName, arrayElement){
-  for(var i=0; i<arrayName.length;i++ )
-  { 
-    if(arrayName[i]==arrayElement)
-    arrayName.splice(i,1); 
-  }
-}
-
-MessagePreview.prototype.show_delete_lnk = function() {
-  var me = this;
-  var div = $a($td(this.t, 0, 3), 'span', 'link_type');
-  div.innerHTML = 'Delete';
-  div.msg_id = me.msg_id;
-  
-  div.onclick = function() {
-    me.delete_msg(me.msg_id);
-  }
-}
-
-MessagePart = function(parent){
-  var me = this;
-  
-  this.parent = parent;
-  this.inputs = {};
-  
-  me.make_header();
-  me.make_reply();
-  me.make_post();
-}
-
-MessagePart.prototype.make = function(label, ele, comment){
-  var me = this;
-  
-  var div = $a(this.parent,'div','',{marginBottom:'12px'});
-  var t = make_table(div,2,1,'70%',['100%']);
-  
-  if( ele == 'button'){
-    var element = $a($td(t,0,0), 'button');
-    element.innerHTML = label;
-  }
-  else {
-    var element = $a($td(t,1,0),ele);
-
-    // large fonts for inputs
-    if(in_list(['input','textarea'],ele.toLowerCase())) {
-      $y(element,{fontSize:'14px', width:'100%'})
-    }
-    $td(t,0,0).innerHTML = label;
-  }
-
-  if(comment) {
-    var div2 = $a(div,'div','',{fontSize:'11px', color:'#888', marginTop:'2px'});
-    div2.innerHTML = comment;
-  }
-  
-  element.wrapper = div;
-  if(label) me.inputs[label] = element;
-  return element;
-}
-
-MessagePart.prototype.make_header = function(){
-  var me = this;
-  
-  this.back_link_div = $a(me.make('','div'),'span', 'link_type', {paddingTop:'12px'});
-  this.back_link_div.innerHTML = 'Back to List';
-  
-  me.make('To','textarea','Enter Email Ids separated by commas (,)');
-  $y(me.inputs['To'],{overflow :'auto', height : '50px'});
-  me.make('Subject','input');
-}
-
-MessagePart.prototype.make_reply = function(){
-  var me = this;
-  this.inputs.Thread = $a(this.parent, 'div', '', {margin:'16px 0px'})
-}
-
-MessagePart.prototype.make_post = function(){
-  var me = this;
-  
-  me.make('Message','textarea');
-  $y(me.inputs['Message'],{height:'240px'});
-
-  // send + cancel
-  var d = $a(this.parent, 'div');
-  me.inputs.Send = $btn(d, 'Send');
-  me.inputs.Reply = $a(d, 'Reply')
-}
-
-MessagePart.prototype.add_header_values = function(to_list, subject){
-  var me = this;
-  
-  //thread_participants
-  me.inputs['To'].value = to_list.join(',');
-  me.inputs['To'].disabled = true;
-  
-  // subject
-  me.inputs['Subject'].value = subject;
-  me.inputs['Subject'].disabled = true;
-}
-
-MessagePart.prototype.add_reply_thread = function(thread){
-  var me = this;
-  // prev messages
-  var t = me.inputs['Thread'];
-  t.innerHTML = ''; // clear previous threads
-  
-  var w = $a(t,'div','',{width:'70%'});
-  var tab = make_table(w,thread.length,2,'100%',['20%','80%'], {padding:'8px 0px', borderBottom:'1px solid #AAA'});
-  
-  for(i=0;i<thread.length;i++) {
-    // ---- photo ---- 
-    if(thread[i][6]) {
-      var img = $a($td(tab,i,0),'img');
-      var img_src = thread[i][6].split(NEWLINE)[0].split(',')[0];
-      img.src = repl('cgi-bin/getfile.cgi?name=%(fn)s&thumbnail=32',{fn:img_src});
-    }
-    
-    // ---- sender name ---- 
-    var d = $a($td(tab,i,0),'div','',{fontSize:'11px'});
-    d.innerHTML = thread[i][5];
-    
-    //----- date ----
-    var d = $a($td(tab,i,1),'div', 'comment', {marginLeft:'8px', color:'#888', fontSize:'11px'}); 
-    d.innerHTML = dateutil.str_to_user(thread[i][3]);
-    
-    //------ message ------
-    var d = $a($td(tab,i,1),'div', 'comment', {fontSize:'14px', marginLeft:'8px'}); 
-    d.innerHTML = replace_newlines(thread[i][1]);
-    $y($td(tab,i,1), {paddingBottom: '8px'});
-  }
-}
-
-//++++++++++++++++++++++++ Message  ++++++++++++++++++++++++
-
-MessageThread = function(parent, view_list_tab, view_list_div, req_frm) {
-  var me = this;
-  this.wrapper = $a(parent,'div');
-  if(!this.msg_parts) this.make(view_list_tab, view_list_div, req_frm);
-}
-
- 
-MessageThread.prototype.add_autosuggest = function() {
-  var me = this;
-  
-  // ---- add auto suggest ---- 
-  var opts = { script: '', json: true, maxresults: 10, timeout: 10000, delay:250, maxentries:500, cache:false};
-
-  wn.require('lib/js/legacy/widgets/autosuggest.js');
-  
-  var as = new AutoSuggest(me.msg_parts.inputs['To'], opts);
-  as.custom_select = function(txt, sel) {
-    // ---- add to the last comma ---- 
-    
-    var r = '';
-    var tl = txt.split(',');
-    for(var i=0;i<tl.length-1;i++) r=r+tl[i]+',';
-    r = r+(r?' ':'')+sel+',';
-    if(r[r.length-1]==NEWLINE) { r=substr(0,r.length-1);}
-    return r;
-  }
-  
-  // ---- override server call ---- 
-  as.doAjaxRequest = function(txt) {
-    var pointer = as; var q = '';
-    
-    // ---- get last few letters typed ---- 
-    var last_txt = txt.split(',');
-    last_txt = last_txt[last_txt.length-1];
-    
-    // ---- show options ---- 
-    var call_back = function(r,rt) {
-      as.aSug = [];
-      var jsondata = r.message;  
-      for (var i=0;i<jsondata.results.length;i++) {
-        as.aSug.push({'id':jsondata.results[i].id, 'value':jsondata.results[i].value, 'info':jsondata.results[i].info});
-      }
-      as.idAs = "as_for_to_message";
-      
-      //old create list
-      as.createList(as.aSug);        
-    }
-    
-    $c_obj('Message Control', 'get_to_list', (last_txt ? last_txt : '%'), call_back);
-    return;
-  }  
-}
-  
-MessageThread.prototype.make = function(view_list_tab, view_list_div, req_frm) {
-  var me = this;
-  
-  me.view_list_tab = view_list_tab;
-  me.view_list_div = view_list_div;
-  me.req_frm = req_frm;
-  
-  this.msg_parts = new MessagePart(me.wrapper);
-
-  this.msg_parts.back_link_div.onclick = function() { 
-    me.hide(); 
-    
-    if(me.in_compose) {
-      if(me.req_frm == 'My Inbox') { me.view_list_tab.show(); $ds(me.view_list_div); }
-    }
-  }
-  
-  // autosuggest
-  me.add_autosuggest();
-}
-
-MessageThread.prototype.set_inbox_editor = function(editor) { 
-  pscript.inbox_text_editor_set = 1;
-}
-
-MessageThread.prototype.view_existing_msg = function(args){
-  var me = this;
-  
-  $c_obj('Message Control', 'get_thread_details', docstring(args), 
-    function(r, rt){
-      var tl = r.message.tl;
-      var to_list = r.message.to_list;
-      
-      //to and subject
-      me.msg_parts.add_header_values(to_list, tl[0][0]);
-      
-      //reply thread
-      me.msg_parts.add_reply_thread(tl);
-      
-      //post area
-      if(me.inbox_editor && pscript.inbox_text_editor_set == 1){
-        me.inbox_editor.editor.setContent('');
-      }
-      else{
-        me.msg_parts.inputs['Message'].value = '';
-      }
-      me.show_as(true);
-    }
-  );
-}
-
-MessageThread.prototype.view_blank_form = function(){
-  var me = this;
-  
-  $ds(me.msg_parts.inputs['To'].wrapper);
-  
-  me.msg_parts.inputs['To'].disabled = false;
-  me.msg_parts.inputs['To'].value = '';    
-  
-  me.msg_parts.inputs['Subject'].disabled = false;    
-  me.msg_parts.inputs['Subject'].value = '';
-  
-  me.msg_parts.inputs['Thread'].innerHTML = '';
-  
-  if(me.inbox_editor && pscript.inbox_text_editor_set == 1){
-    me.inbox_editor.editor.setContent('');
-  }
-  else{
-    me.msg_parts.inputs['Message'].value = '';
-  }    
-  me.show_as(false);
-}
-  
-//  msg_id = mesage id, 
-//  parent = div/tab from where msg will be shown, 
-//  view_list_tab = name of tab in which list will be viewed, 
-//  view_list_div = name of div in which list will be viewed, 
-//  req_frm = my inbox / group / event, 
-//  show_on_send_tab = tab to be viewed on sending/replying to msg, 
-//  show_on_send_div = div to be viewed on sending/replying to msg, 
-//  receiver_lst = list of msg receiver
-
-MessageThread.prototype.show_msg = function(msg_id, parent, view_list_tab, view_list_div, req_frm, show_on_send_tab, show_on_send_div, receiver_lst) {
-  var me = this;
-  
-  // set tinymce editor
-  if(!me.inbox_editor) {
-    pscript.inbox_text_editor_set = 0;
-    var theme_adv_btn1 ="fontselect,fontsizeselect,formatselect,indicime,indicimehelp,emotions";
-    var theme_adv_btn2 ="bold,italic,underline,|,undo,redo,|,code,forecolor,backcolor,link,unlink,hr,|,sub,sup,|,charmap";
-    var theme_adv_btn3 = "";
-    
-    me.inbox_editor = new TextAreaEditor(me.msg_parts.inputs["Message"], null, me.set_inbox_editor, theme_adv_btn1, theme_adv_btn2, theme_adv_btn3, '300px');
-  }
-  
-  me.req_frm = req_frm;
-  me.receiver_lst = receiver_lst;
-  me.parent = parent;
-  me.view_list_tab = view_list_tab;
-  me.view_list_div = view_list_div;
-  me.show_on_send_tab = show_on_send_tab;
-  me.show_on_send_div = show_on_send_div;
-  me.msg_parts.inputs['Send'].btn_click = 0;
-  me.msg_parts.inputs['Reply'].btn_click = 0;
-  
-  if(msg_id) {
-    this.cur_message_id = msg_id;
-    var args = {'user_name':user, 'cur_msg_id': this.cur_message_id};
-    me.view_existing_msg(args);      
-  } 
-  else {
-    this.cur_message_id = null;
-    me.view_blank_form();
-  }  
-  $ds(me.parent);
-  
-  // reply or send btn
-  me.msg_parts.inputs['Send'].onclick = function(){ 
-    if(!this.btn_click){
-      this.btn_click = 1;
-      me.send(me.req_frm, me.receiver_lst, me.show_on_send_tab, me.show_on_send_div); 
-    }
-  }
-  me.msg_parts.inputs['Reply'].onclick = me.msg_parts.inputs['Send'].onclick;
-}
-
-MessageThread.prototype.hide = function() {
-  var me = this;
-  
-  $dh(me.wrapper);
-  $ds(me.view_list_div);
-  me.display = 0;
-}
-
-MessageThread.prototype.show_as = function(reply) {
-  var me = this;
-  
-  if(!reply) {
-    $dh(me.msg_parts.inputs['Thread'].wrapper);
-    $dh(me.msg_parts.inputs['Reply']);
-    $ds(me.msg_parts.inputs['Send']);
-    me.in_compose = 1;
-  }
-  else {
-    $ds(me.msg_parts.inputs['Thread'].wrapper);
-    $ds(me.msg_parts.inputs['Reply']);
-    $dh(me.msg_parts.inputs['Send']);
-    $dh(me.view_list_div);
-    me.in_compose = 1;
-  } 
-  $ds(me.wrapper);
-  me.display = 1;
-}
-
-MessageThread.prototype.send_msg = function(arg){
-  var me = this;
-  var args = arg;
-  
-  var send_call_back = function(r, rt){
-    //var me = this;
-    if(r.message == 'true'){
-      me.msg_parts.inputs['To'].value = '';
-      me.msg_parts.inputs['Subject'].value = '';
-      me.msg_parts.inputs['Thread'].innerHTML = '';
-      
-      if(me.inbox_editor && pscript.inbox_text_editor_set == 1){
-        me.inbox_editor.editor.setContent('');
-      }
-      else{
-        me.msg_parts.inputs['Message'].value = '';
-      }
-      
-      if(me.req_frm == 'My Inbox'){
-        pscript.msg_struct.sent_lst.msg_li.run();
-        me.show_on_send_tab.show();
-        $ds(me.show_on_send_div);
-        $dh(me.parent);
-      }
-    }
-  }
-  
-  if(me.cur_message_id==null){
-    $c_obj('Message Control','send_message',docstring(args), send_call_back);
-  }
-  else{  
-    $c_obj('Message Control','send_reply',docstring(args), send_call_back);
-  }
-}
-
-MessageThread.prototype.send = function(req_frm, receiver_lst, show_on_send_tab, show_on_send_div) {
-  var me = this;
-  me.req_frm = req_frm;
-  me.show_on_send_tab = show_on_send_tab;
-  me.show_on_send_div = show_on_send_div;
-  var args = {'user_name':user};
-  
-  if(me.inbox_editor && pscript.inbox_text_editor_set == 1){
-    args.message = me.inbox_editor.editor.getContent();
-  }
-  else{
-    args.message = me.msg_parts.inputs['Message'].value;
-  }
-  
-  if(me.cur_message_id==null){
-    args.subject = me.msg_parts.inputs['Subject'].value;
-    args.to_list = me.msg_parts.inputs['To'].value;
-    if(!args.to_list) {msgprint('error:Must enter "To:"'); }
-    else if(!args.subject) {msgprint('error:Must enter "Subject"'); }
-    else me.send_msg(args);
-  }
-  else{
-    var subj = me.msg_parts.inputs['Subject'].value;
-    if(!subj.substr(0,3).toLowerCase()=='re:')
-      subj = 'Re: ' + subj;
-    args.subject = subj;
-    args.message_id = me.cur_message_id;
-    
-    me.send_msg(args);
-  }
-}
-
-MessageThread.prototype.delete_msg = function(req_frm, parent, view_list_tab, view_list_div) {
-  var me = this;
-  
-  var msg_lst = [];
-  var delete_message_dialog;
-  me.parent = parent;
-  
-  if(me.cur_message_id)
-    msg_lst.push(me.cur_message_id);
-  
-  if(msg_lst.length >= 1){
-    function set_delete_message_dialog() {
-      delete_message_dialog = new Dialog(400, 400, 'Delete Message');
-      delete_message_dialog.make_body([
-        ['HTML', 'Message', '<div class = "comment">Are you sure, you want to delete this message ?</div>'],
-        ['HTML', 'Response', '<div class = "comment" id="delete_message_dialog_response"></div>'],
-        ['HTML', 'Delete Message', '<div id="delete_message_btn" style ="height:25px;"></div>']
-      ]);
-      
-      var delete_message_btn1 = $a($i('delete_message_btn'), 'button', 'button');
-      delete_message_btn1.innerHTML = 'Yes';
-      delete_message_btn1.onclick = function(){ delete_message_dialog.add();}
-      
-      var delete_message_btn2 = $a($i('delete_message_btn'), 'button', 'button');
-      delete_message_btn2.innerHTML = 'No';
-      $y(delete_message_btn2,{marginLeft:'4px'});
-      
-      delete_message_btn2.onclick = function(){ delete_message_dialog.hide();}
-      
-      delete_message_dialog.onshow = function() {
-        $i('delete_message_dialog_response').innerHTML = '';
-      }
-      
-      delete_message_dialog.add = function() {
-        if(this.req_frm == 'My Inbox'){
-          var args = user + '~~' + this.msg_lst;
-          $c_obj('Message Control', 'delete_message', args, function(r, rt){
-            if(r.message == 'true'){
-              me.hide();
-              me.view_list_tab.show(); 
-              $ds(me.view_list_div);
-              delete_message_dialog.hide();
-            }
-          });  
-        }
-      }
-    }  
-    
-    if(!delete_message_dialog)
-      set_delete_message_dialog();
-    delete_message_dialog.req_frm = req_frm;
-    delete_message_dialog.msg_lst = msg_lst;
-    delete_message_dialog.view_list_tab = view_list_tab;
-    delete_message_dialog.view_list_div = view_list_div;
-    delete_message_dialog.show();
-  }
-}
-
-// ---------------- editor---------------------
-
-var editor_count = 0;
-
-function TextAreaEditor(txt, parent, callback, theme_advanced_btn1, theme_advanced_btn2, theme_advanced_btn3, editor_ht) {
-
-  this.txt = txt;
-  this.parent = parent;
-  this.callback = callback;
-  if(theme_advanced_btn1) this.theme_advanced_btn1 = theme_advanced_btn1;
-  if(theme_advanced_btn2) this.theme_advanced_btn2 = theme_advanced_btn2;
-  if(theme_advanced_btn3) this.theme_advanced_btn3 = theme_advanced_btn3;
-  if(editor_ht) this.editor_ht = editor_ht;
-
-  // load tinyMCE library
-  this.load_tiny_mce_library();
-}
-
-TextAreaEditor.prototype.load_tiny_mce_library = function() {
-
-  var me = this;
-  
-  if(!tinymce_loaded) {
-    tinymce_loaded = 1;
-    tinyMCE_GZ.init(
-      {
-        themes : "advanced",
-        plugins : "style,table,inlinepopups,indicime,emotions",
-        languages : "en",
-        disk_cache : true
-      }, function(){ me.setup_text_area() });
-  }
-  else {
-    me.setup_text_area();
-  }
-}
-
-TextAreaEditor.prototype.setup_text_area = function() {
-
-  var me = this;
-  if(!me.txt) {
-    me.txt = $a(me.parent, 'textarea');
-  }
-  
-  editor_count++;
-  me.id = 'editor_text_' + editor_count;
-  me.txt.setAttribute('id', me.id);
-  
-  tinyMCE.init({
-    theme : "advanced",
-    mode : "exact",
-    elements: me.id,
-    plugins:"table,style,inlinepopups,indicime,emotions",
-    theme_advanced_toolbar_location : "top",
-    theme_advanced_statusbar_location : "bottom",
-    extended_valid_elements: "div[id|dir|class|align|style]",
-    
-    // w/h
-    width: '100%',
-    height: me.editor_ht?me.editor_ht:'50px',
-    
-    // buttons
-    //theme_advanced_buttons1 :"bold,italic,underline,strikethrough,blockquote,forecolor,backcolor,bullist,numlist,|,undo,redo,|,image,code,indicime,indicimehelp,emotions",
-    theme_advanced_buttons1 : me.theme_advanced_btn1?me.theme_advanced_btn1:"bold,italic,underline,forecolor,backcolor,|,undo,redo,|,link,unlink,indicime,indicimehelp,emotions",
-    theme_advanced_buttons2 : me.theme_advanced_btn2?me.theme_advanced_btn2:"",
-    theme_advanced_buttons3 : me.theme_advanced_btn3?me.theme_advanced_btn3:"",
-    
-    // callback function with editor instance.
-    init_instance_callback : "editor_init_callback"
-  });  
-
-  editor_init_callback = function(inst) {
-    me.editor = tinyMCE.get(me.id);
-    me.editor.focus();
-    
-    if(me.callback){
-      me.callback(me.editor);
-    }
-  }  
-}
\ No newline at end of file
diff --git a/erpnext/utilities/page/messages/messages.txt b/erpnext/utilities/page/messages/messages.txt
deleted file mode 100644
index 8369afe..0000000
--- a/erpnext/utilities/page/messages/messages.txt
+++ /dev/null
@@ -1 +0,0 @@
-[{'creation': '2010-06-07 10:34:37', 'module': 'Tools', 'doctype': 'Page', 'owner': 'Administrator', 'style': None, 'modified_by': 'nabin@webnotestech.com', 'script': None, 'show_in_menu': 1, 'content': None, 'page_name': 'Messages', 'menu_index': None, 'docstatus': 0, 'parent': None, 'standard': 'Yes', 'icon': None, 'name': 'Messages', 'idx': None, 'static_content': None, 'modified': '2010-09-25 00:00:00', 'parenttype': None, 'parent_node': None, 'parentfield': None}, {'modified_by': 'nabin@webnotestech.com', 'name': 'PR000137', 'parent': 'Messages', 'creation': '2010-06-07 10:34:37', 'modified': '2010-09-01 14:56:20', 'doctype': 'Page Role', 'idx': 1, 'parenttype': 'Page', 'role': 'Administrator', 'owner': 'Administrator', 'docstatus': 0, 'parentfield': 'roles'}, {'modified_by': 'nabin@webnotestech.com', 'name': 'PR000138', 'parent': 'Messages', 'creation': '2010-06-07 13:35:43', 'modified': '2010-09-01 14:56:20', 'doctype': 'Page Role', 'idx': 2, 'parenttype': 'Page', 'role': 'All', 'owner': 'Administrator', 'docstatus': 0, 'parentfield': 'roles'}]
\ No newline at end of file
diff --git a/erpnext/utilities/page/messages/messages_static.html b/erpnext/utilities/page/messages/messages_static.html
deleted file mode 100644
index 094418b..0000000
--- a/erpnext/utilities/page/messages/messages_static.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<div>
-</div>
\ No newline at end of file
diff --git a/version.num b/version.num
index 70e3603..4aeea8c 100644
--- a/version.num
+++ b/version.num
@@ -1 +1 @@
-648
\ No newline at end of file
+650
\ No newline at end of file
diff --git a/wnf.py b/wnf.py
index 4f18187..fc28232 100755
--- a/wnf.py
+++ b/wnf.py
@@ -56,7 +56,10 @@
 						help="export doc")
 	parser.add_option('--install', nargs=3, metavar = "rootpassword dbname source",
 						help="install fresh db")
-	parser.add_option('--sync_with_gateway', nargs=1, metavar = "1/0", help="Set or Unset Sync with Gateway")
+	parser.add_option('--sync_with_gateway', nargs=1, metavar = "1/0", \
+						help="Set or Unset Sync with Gateway")
+	parser.add_option('--docdiff', nargs=0, \
+						help="Get diff between .txt files and database records")
 
 	return parser.parse_args()
 	
@@ -152,6 +155,10 @@
 		else:
 			webnotes.message_log.append("ERROR: sync_with_gateway can be either 0 or 1")
 	
+	elif options.docdiff is not None:
+		import webnotes.modules.diff
+		webnotes.modules.diff.diff()
+	
 	# print messages
 	if webnotes.message_log:
 		print '\n'.join(webnotes.message_log)
