Sourced wnframework-modules from Google Code as erpnext
diff --git a/tools/Module Def/Tools/Tools.txt b/tools/Module Def/Tools/Tools.txt
new file mode 100644
index 0000000..428f079
--- /dev/null
+++ b/tools/Module Def/Tools/Tools.txt
@@ -0,0 +1,358 @@
+[
+	{
+		'_last_update': None,
+		'creation': '2010-11-30 22:45:03',
+		'disabled': 'Yes',
+		'docstatus': 0,
+		'doctype': 'Module Def',
+		'doctype_list': None,
+		'file_list': None,
+		'idx': None,
+		'is_hidden': None,
+		'last_updated_date': '2011-02-12 11:57:57',
+		'modified': '2010-09-25 00:00:00',
+		'modified_by': 'Administrator',
+		'module_desc': None,
+		'module_icon': 'id_card.png',
+		'module_label': 'Organize',
+		'module_name': 'Tools',
+		'module_page': 'Organize',
+		'module_seq': 3,
+		'name': 'Tools',
+		'owner': 'Administrator',
+		'parent': None,
+		'parentfield': None,
+		'parenttype': None,
+		'trash_reason': None,
+		'widget_code': None
+	},
+	{
+		'click_function': None,
+		'creation': '2010-11-30 22:45:03',
+		'description': 'Shared Calendar of important events, reminders',
+		'display_name': 'Calendar',
+		'doc_name': '_calendar',
+		'doc_type': 'Pages',
+		'docstatus': 0,
+		'doctype': 'Module Def Item',
+		'fields': None,
+		'hide': None,
+		'icon': 'calendar.gif',
+		'idx': 1,
+		'modified': '2011-03-24 15:04:47',
+		'modified_by': 'Administrator',
+		'name': 'MDI00252',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'items',
+		'parenttype': 'Module Def'
+	},
+	{
+		'click_function': None,
+		'creation': '2010-11-30 22:45:03',
+		'description': 'Manage your contact details',
+		'display_name': 'Manage Contacts',
+		'doc_name': 'Contact Page',
+		'doc_type': 'Pages',
+		'docstatus': 0,
+		'doctype': 'Module Def Item',
+		'fields': None,
+		'hide': None,
+		'icon': 'table.gif',
+		'idx': 2,
+		'modified': '2011-03-24 15:04:47',
+		'modified_by': 'Administrator',
+		'name': 'MDI00253',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'items',
+		'parenttype': 'Module Def'
+	},
+	{
+		'click_function': None,
+		'creation': '2010-11-30 22:45:03',
+		'description': 'Standardized business letters',
+		'display_name': 'Business Letters',
+		'doc_name': 'Business Letter',
+		'doc_type': 'Forms',
+		'docstatus': 0,
+		'doctype': 'Module Def Item',
+		'fields': 'to_contact\ntemplate',
+		'hide': None,
+		'icon': 'page.gif',
+		'idx': 3,
+		'modified': '2011-03-24 15:04:47',
+		'modified_by': 'Administrator',
+		'name': 'MDI00254',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'items',
+		'parenttype': 'Module Def'
+	},
+	{
+		'click_function': None,
+		'creation': '2010-11-30 22:45:03',
+		'description': 'Online storage of files in a folder structure that you can share with your users',
+		'display_name': 'File Uploads',
+		'doc_name': 'File Browser',
+		'doc_type': 'Pages',
+		'docstatus': 0,
+		'doctype': 'Module Def Item',
+		'fields': None,
+		'hide': None,
+		'icon': 'folder.gif',
+		'idx': 4,
+		'modified': '2011-03-24 15:04:47',
+		'modified_by': 'Administrator',
+		'name': 'MDI00255',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'items',
+		'parenttype': 'Module Def'
+	},
+	{
+		'click_function': None,
+		'creation': '2010-11-30 22:45:03',
+		'description': None,
+		'display_name': 'SMS Center',
+		'doc_name': 'SMS Center',
+		'doc_type': 'Single DocType',
+		'docstatus': 0,
+		'doctype': 'Module Def Item',
+		'fields': None,
+		'hide': None,
+		'icon': None,
+		'idx': 5,
+		'modified': '2011-03-24 15:04:47',
+		'modified_by': 'Administrator',
+		'name': 'MDI00256',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'items',
+		'parenttype': 'Module Def'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 1,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00059',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Accounts User'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 2,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00060',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Accounts Manager'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 3,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00061',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'HR User'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 4,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00062',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'HR Manager'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 5,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00063',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Material User'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 6,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00064',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Material Master Manager'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 7,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00065',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Material Manager'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 8,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00066',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Purchase User'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 9,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00067',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Purchase Master Manager'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 10,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00068',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Purchase Manager'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 11,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00069',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Production User'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 12,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00070',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Production Manager'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 13,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00071',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'System Manager'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 14,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00072',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Sales User'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 15,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00073',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Sales Master Manager'
+	},
+	{
+		'creation': '2010-11-30 22:45:03',
+		'docstatus': 0,
+		'doctype': 'Module Def Role',
+		'idx': 16,
+		'modified': '2010-11-30 22:45:03',
+		'modified_by': 'Administrator',
+		'name': 'MDR00074',
+		'owner': 'Administrator',
+		'parent': 'Tools',
+		'parentfield': 'roles',
+		'parenttype': 'Module Def',
+		'role': 'Sales Manager'
+	}
+]
\ No newline at end of file
diff --git a/tools/__init__.py b/tools/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/__init__.py
diff --git a/tools/doctype/__init__.py b/tools/doctype/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/__init__.py
diff --git a/tools/doctype/activity_dashboard_control/__init__.py b/tools/doctype/activity_dashboard_control/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/activity_dashboard_control/__init__.py
diff --git a/tools/doctype/activity_dashboard_control/activity_dashboard_control.py b/tools/doctype/activity_dashboard_control/activity_dashboard_control.py
new file mode 100644
index 0000000..fde7552
--- /dev/null
+++ b/tools/doctype/activity_dashboard_control/activity_dashboard_control.py
@@ -0,0 +1,95 @@
+# 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
+    
+    
+    # get dashboard counts
+    # --------------------
+    def get_dashboard_counts(self, dt):
+        dtl = eval(dt)
+        dt = {}
+        
+        for d in dtl:
+            # if Lead
+            if d=='Lead':
+                dt[d] = {'To follow up':sql("select count(name) from tabLead where status!='Converted' and docstatus=1")[0][0] or 0}
+                
+            # if Enquiry
+            elif d=='Enquiries':
+                args = {}
+                args['Quotations to be sent'] = sql("select count(distinct(t2.name)) from `tabQuotation`t1, `tabEnquiry`t2 where t1.enq_no!=t2.name and t2.docstatus=1")[0][0] or 0
+                args['To follow up'] = sql("select count(name) from `tabQuotation` where docstatus=0")[0][0] or 0       #Draft
+                dt[d] = args
+                
+            # if Sales Order
+            elif d=='Sales Order':
+                args = {}
+                args['To be delivered'] = sql("select count(name) from `tabSales Order` where per_delivered<100 and delivery_date>now() and docstatus=1")[0][0] or 0
+                args['To be billed'] = sql("select count(name) from `tabSales Order` where per_billed<100 and docstatus=1")[0][0] or 0  
+                args['Overdue'] = sql("select count(name) from `tabSales Order` where per_delivered<100 and delivery_date<now() and docstatus=1")[0][0] or 0
+                args['To be submitted'] = sql("select count(name) from `tabSales Order` where status='Draft'")[0][0] or 0       #Draft
+                dt[d] = args
+            
+            # if Invoice
+            elif d=='Invoices':
+                args = {}
+                args['To receive payment'] = sql("select count(name) from `tabReceivable Voucher` where docstatus=1 and due_date>now() and outstanding_amount!=0")[0][0] or 0
+                args['Overdue'] = sql("select count(name) from `tabReceivable Voucher` where docstatus=1 and due_date<now() and outstanding_amount!=0")[0][0] or 0  
+                args['To be submitted'] = sql("select count(name) from `tabReceivable Voucher` where docstatus=0")[0][0] or 0       #Draft
+                dt[d] = args
+            
+            # if Indent 
+            elif d=='Indent':
+                args = {}
+                args['Purchase Order to be made'] = sql("select count(name) from `tabIndent` where per_ordered<100 and docstatus=1")[0][0] or 0
+                args['To be submitted'] = sql("select count(name) from `tabIndent` where status='Draft'")[0][0] or 0       #Draft
+                dt[d] = args
+                
+            # if Purchase Order    
+            elif d=='Purchase Order':
+                args = {}
+                args['To receive items'] = sql("select count(name) from `tabPurchase Order` where per_received<100 and docstatus=1")[0][0] or 0
+                args['To be billed'] = sql("select count(name) from `tabPurchase Order` where per_billed<100 and docstatus=1")[0][0] or 0
+                args['To be submitted'] = sql("select count(name) from `tabPurchase Order` where status='Draft'")[0][0] or 0        #Draft
+                dt[d] = args
+            
+            # if Bills
+            elif d=='Bills':
+                args = {}
+                args['To be payed'] = sql("select count(name) from `tabPayable Voucher` where docstatus=1 and outstanding_amount!=0")[0][0] or 0
+                args['To be submitted'] = sql("select count(name) from `tabPayable Voucher` where docstatus=0")[0][0] or 0       #Draft
+                dt[d] = args
+                
+            # if Tasks
+            elif d=='Tasks':
+                dt[d] = {'Open': sql("select count(name) from `tabTicket` where status='Open'")[0][0] or 0}
+                
+            # if Maintenance
+            elif d=='Serial No':
+              args = {}
+              args['AMC to expire this month'] = sql("select count(name) from `tabSerial No` where docstatus=1 and month(getdate()) = month(amc_expiry_date) and year(getdate()) = year(amc_expiry_date)")[0][0] or 0
+              args['Warranty to expire this month'] = ql("select count(name) from `tabSerial No` where docstatus=1 and month(getdate()) = month(warranty_expiry_date) and year(getdate())=year(warranty_expiry_date)")[0][0] or 0
+              dt[d] = args
+              
+        msgprint(dt)
+        return dt
\ No newline at end of file
diff --git a/tools/doctype/activity_dashboard_control/activity_dashboard_control.txt b/tools/doctype/activity_dashboard_control/activity_dashboard_control.txt
new file mode 100644
index 0000000..e55656d
--- /dev/null
+++ b/tools/doctype/activity_dashboard_control/activity_dashboard_control.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2010-04-29 14:44:17', 'search_fields': None, 'module': 'Tools', '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': 1, 'allow_rename': None, 'smallicon': None, 'allow_attach': None, 'show_in_menu': None, 'max_attachments': None, 'version': 43, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': None, 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'nabin@webnotestech.com', 'document_type': None, 'name': 'Activity Dashboard Control', '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}]
\ No newline at end of file
diff --git a/tools/doctype/address/__init__.py b/tools/doctype/address/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/address/__init__.py
diff --git a/tools/doctype/address/address.comp.js b/tools/doctype/address/address.comp.js
new file mode 100644
index 0000000..0f6be69
--- /dev/null
+++ b/tools/doctype/address/address.comp.js
@@ -0,0 +1,2 @@
+
+cur_frm.cscript.onload=function(doc,cdt,cdn){if(doc.customer)cur_frm.add_fetch('customer','customer_name','customer_name');if(doc.supplier)cur_frm.add_fetch('supplier','supplier_name','supplier_name');}
\ No newline at end of file
diff --git a/tools/doctype/address/address.js b/tools/doctype/address/address.js
new file mode 100644
index 0000000..aa1d871
--- /dev/null
+++ b/tools/doctype/address/address.js
@@ -0,0 +1,5 @@
+cur_frm.cscript.onload = function(doc, cdt, cdn) {
+	if(doc.customer) cur_frm.add_fetch('customer', 'customer_name', 'customer_name');
+	if(doc.supplier) cur_frm.add_fetch('supplier', 'supplier_name', 'supplier_name');
+}
+
diff --git a/tools/doctype/address/address.py b/tools/doctype/address/address.py
new file mode 100644
index 0000000..dc17743
--- /dev/null
+++ b/tools/doctype/address/address.py
@@ -0,0 +1,56 @@
+# Please edit this list and import only required elements
+import webnotes
+
+from webnotes.model.doc import Document
+from webnotes import session, form, msgprint, errprint
+
+sql = webnotes.conn.sql
+  
+# -----------------------------------------------------------------------------------------
+
+class DocType:
+  def __init__(self, doc, doclist=[]):
+    self.doc = doc
+    self.doclist = doclist
+
+  def autoname(self):
+    if self.doc.customer:
+      self.doc.name = self.doc.customer + '-' + self.doc.address_type
+    elif self.doc.supplier:
+      self.doc.name = self.doc.supplier + '-' + self.doc.address_type
+    elif self.doc.sales_partner:
+      self.doc.name = self.doc.sales_partner + '-' + self.doc.address_type
+      
+    # filter out bad characters in name
+    self.doc.name = self.doc.name.replace('&','and').replace('.','').replace("'",'').replace('"','').replace(',','').replace('`','')
+
+#----------------------
+# Call to Validate
+#----------------------
+  def validate(self):
+    self.validate_primary_address()
+    self.validate_shipping_address()
+
+#----------------------
+# Validate that there can only be one primary address for particular customer, supplier
+#----------------------
+  def validate_primary_address(self):
+    if self.doc.is_primary_address == 1:
+      if self.doc.customer: 
+        sql("update tabAddress set is_primary_address=0 where customer = '%s'" % (self.doc.customer))
+      elif self.doc.supplier:
+        sql("update tabAddress set is_primary_address=0 where supplier = '%s'" % (self.doc.supplier))
+      elif self.doc.sales_partner:
+        sql("update tabAddress set is_primary_address=0 where sales_partner = '%s'" % (self.doc.sales_partner))
+        
+#----------------------
+# Validate that there can only be one shipping address for particular customer, supplier
+#----------------------
+  def validate_shipping_address(self):
+    if self.doc.is_shipping_address == 1:
+      if self.doc.customer: 
+        sql("update tabAddress set is_shipping_address=0 where customer = '%s'" % (self.doc.customer))
+      elif self.doc.supplier:
+        sql("update tabAddress set is_shipping_address=0 where supplier = '%s'" % (self.doc.supplier))      
+      elif self.doc.sales_partner:
+        sql("update tabAddress set is_shipping_address=0 where sales_partner = '%s'" % (self.doc.sales_partner))      
diff --git a/tools/doctype/address/address.txt b/tools/doctype/address/address.txt
new file mode 100644
index 0000000..ee23f82
--- /dev/null
+++ b/tools/doctype/address/address.txt
@@ -0,0 +1,802 @@
+[
+	{
+		'_last_update': '1306307668',
+		'_user_tags': None,
+		'allow_attach': None,
+		'allow_copy': None,
+		'allow_email': None,
+		'allow_print': None,
+		'allow_rename': None,
+		'allow_trash': 1,
+		'autoname': None,
+		'change_log': None,
+		'client_script': None,
+		'client_script_core': None,
+		'client_string': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:30',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocType',
+		'document_type': 'Master',
+		'dt_template': None,
+		'hide_heading': None,
+		'hide_toolbar': None,
+		'idx': None,
+		'in_create': None,
+		'in_dialog': 1,
+		'is_transaction_doc': None,
+		'issingle': None,
+		'istable': None,
+		'max_attachments': None,
+		'menu_index': None,
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'module': 'Tools',
+		'name': 'Address',
+		'name_case': None,
+		'owner': 'Administrator',
+		'parent': None,
+		'parent_node': None,
+		'parentfield': None,
+		'parenttype': None,
+		'print_outline': None,
+		'read_only': None,
+		'read_only_onload': None,
+		'search_fields': None,
+		'section_style': 'Simple',
+		'server_code': None,
+		'server_code_compiled': None,
+		'server_code_core': None,
+		'server_code_error': None,
+		'show_in_menu': 0,
+		'smallicon': None,
+		'subject': None,
+		'tag_fields': None,
+		'use_template': None,
+		'version': 41
+	},
+	{
+		'amend': None,
+		'cancel': 1,
+		'create': 1,
+		'creation': '2011-05-25 12:59:30',
+		'docstatus': 0,
+		'doctype': 'DocPerm',
+		'execute': None,
+		'idx': 1,
+		'match': None,
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'PERM00884',
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'permissions',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'read': 1,
+		'role': 'All',
+		'submit': None,
+		'write': 1
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': None,
+		'fieldtype': 'Section Break',
+		'hidden': None,
+		'icon': None,
+		'idx': 1,
+		'in_filter': None,
+		'label': 'Address Details',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05072',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': '<em>e.g. Office, Billing, Shipping</em>',
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'address_type',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 2,
+		'in_filter': None,
+		'label': 'Address Type',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05073',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': 1,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'address_line1',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 3,
+		'in_filter': None,
+		'label': 'Address Line1',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05074',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': 1,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'address_line2',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 4,
+		'in_filter': None,
+		'label': 'Address Line2',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05075',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'city',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 5,
+		'in_filter': 1,
+		'label': 'City/Town',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05076',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': 'Suggest',
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': 1,
+		'search_index': 1,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'pincode',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 6,
+		'in_filter': 1,
+		'label': 'Pincode',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05077',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': 1,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'country',
+		'fieldtype': 'Select',
+		'hidden': None,
+		'icon': None,
+		'idx': 7,
+		'in_filter': 1,
+		'label': 'Country',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05078',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': 'link:Country',
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': 1,
+		'search_index': 1,
+		'trigger': 'Client',
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'state',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 8,
+		'in_filter': 1,
+		'label': 'State',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05079',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': 'Suggest',
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': 0,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': None,
+		'fieldtype': 'Column Break',
+		'hidden': None,
+		'icon': None,
+		'idx': 9,
+		'in_filter': None,
+		'label': None,
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05080',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': 0,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': '50%'
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'phone',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 10,
+		'in_filter': None,
+		'label': 'Phone',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05081',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': 1,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'email_id',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 11,
+		'in_filter': None,
+		'label': 'Email Id',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05082',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'fax',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 12,
+		'in_filter': None,
+		'label': 'Fax',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05083',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:30',
+		'default': None,
+		'depends_on': 'eval:!doc.supplier && !doc.sales_partner',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'customer',
+		'fieldtype': 'Link',
+		'hidden': None,
+		'icon': None,
+		'idx': 13,
+		'in_filter': None,
+		'label': 'Customer',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05084',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': 'Customer',
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:31',
+		'default': None,
+		'depends_on': 'eval:!doc.supplier && !doc.sales_partner',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'customer_name',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 14,
+		'in_filter': None,
+		'label': 'Customer Name',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05085',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 1,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:31',
+		'default': None,
+		'depends_on': 'eval:!doc.customer && !doc.sales_partner',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'supplier',
+		'fieldtype': 'Link',
+		'hidden': None,
+		'icon': None,
+		'idx': 15,
+		'in_filter': None,
+		'label': 'Supplier',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05086',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': 'Supplier',
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:31',
+		'default': None,
+		'depends_on': 'eval:!doc.customer && !doc.sales_partner',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'supplier_name',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 16,
+		'in_filter': None,
+		'label': 'Supplier Name',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05087',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 1,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:31',
+		'default': None,
+		'depends_on': 'eval:!doc.customer && !doc.supplier',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'sales_partner',
+		'fieldtype': 'Link',
+		'hidden': None,
+		'icon': None,
+		'idx': 17,
+		'in_filter': None,
+		'label': 'Sales Partner',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05088',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': 'Sales Partner',
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:31',
+		'default': '0',
+		'depends_on': None,
+		'description': 'Check to make primary address',
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'is_primary_address',
+		'fieldtype': 'Check',
+		'hidden': None,
+		'icon': None,
+		'idx': 18,
+		'in_filter': None,
+		'label': 'Is Primary Address',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05089',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-25 12:59:31',
+		'default': '0',
+		'depends_on': None,
+		'description': 'Check to make Shipping Address',
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'is_shipping_address',
+		'fieldtype': 'Check',
+		'hidden': None,
+		'icon': None,
+		'idx': 19,
+		'in_filter': None,
+		'label': 'Is Shipping Address',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05090',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2011-05-25 12:59:31',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'trash_reason',
+		'fieldtype': 'Small Text',
+		'hidden': None,
+		'icon': None,
+		'idx': 20,
+		'in_filter': None,
+		'label': 'Trash Reason',
+		'modified': '2011-05-26 17:45:25',
+		'modified_by': 'Administrator',
+		'name': 'FL05091',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Address',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	}
+]
\ No newline at end of file
diff --git a/tools/doctype/business_letter/__init__.py b/tools/doctype/business_letter/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/business_letter/__init__.py
diff --git a/tools/doctype/business_letter/business_letter.js b/tools/doctype/business_letter/business_letter.js
new file mode 100644
index 0000000..35abc0f
--- /dev/null
+++ b/tools/doctype/business_letter/business_letter.js
@@ -0,0 +1,38 @@
+$import(Tips Common)
+
+cur_frm.fields_dict['template'].get_query=function(doc,cdt,cdn){
+  return "SELECT `tabBusiness Letter Template`.name FROM `tabBusiness Letter Template` WHERE `tabBusiness Letter Template`.letter_type='"+doc.letter_type+"' AND `tabBusiness Letter Template`.name like '%s' LIMIT 50"
+}
+
+cur_frm.cscript.template = function(doc,cdt,cdn){
+  //set title as like template
+  doc.title = doc.template;
+  refresh_field('title');
+
+  //set print heading as title 
+  cur_frm.pformat.print_heading=doc.title;
+  cur_frm.pformat.print_subheading = ' ';
+
+  //call set_content function to pull content as per template selected
+  $c_obj([doc], 'set_content', '',function(r, rt) { refresh_field('content');});
+}
+
+cur_frm.cscript.title= function(doc,cdt,cdn){
+  //set print heading on title change
+  cur_frm.pformat.print_heading=doc.title;
+  cur_frm.pformat.print_subheading = ' ';
+}
+
+cur_frm.cscript.refresh= function(doc,cdt,cdn){
+  cur_frm.cscript.get_tips(doc, cdt, cdn);
+  //set print heading on refresh
+  cur_frm.pformat.print_heading=doc.title;
+  cur_frm.pformat.print_subheading = ' ';
+}
+
+cur_frm.cscript.onload= function(doc,cdt,cdn){
+  cur_frm.cscript.get_tips(doc, cdt, cdn);
+  //set print heading
+  cur_frm.pformat.print_heading=doc.title;
+  cur_frm.pformat.print_subheading = ' ';
+}
diff --git a/tools/doctype/business_letter/business_letter.py b/tools/doctype/business_letter/business_letter.py
new file mode 100644
index 0000000..47de45c
--- /dev/null
+++ b/tools/doctype/business_letter/business_letter.py
@@ -0,0 +1,29 @@
+# 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:
+  #init function
+  def __init__(self,doc,doclist=[]):
+    self.doc = doc
+    self.doclist = doclist
+
+  def set_content(self):
+    ret_content = sql("select content from `tabBusiness Letter Template` where name ='%s'"%self.doc.template)
+    if ret_content: self.doc.content = ret_content[0][0]
+    return ''
\ No newline at end of file
diff --git a/tools/doctype/business_letter/business_letter.txt b/tools/doctype/business_letter/business_letter.txt
new file mode 100644
index 0000000..7be0aba
--- /dev/null
+++ b/tools/doctype/business_letter/business_letter.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2010-04-20 11:10:52', 'search_fields': None, 'module': 'Tools', 'doctype': 'DocType', 'change_log': None, 'print_outline': '', 'owner': 'harshada@webnotestech.com', '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': 12, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': 'Letter/.####', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'harshada@webnotestech.com', 'document_type': 'Master', 'name': 'Business Letter', 'idx': None, 'hide_toolbar': None, 'colour': 'White:FFF', 'client_script': None, 'modified': '2010-10-22 10:37:10', 'server_code_error': ' ', 'name_case': '', 'parenttype': None, 'read_only_onload': 1, 'server_code_core': None, 'server_code_compiled': None, 'parent_node': None, 'parentfield': None}, {'cancel': None, 'amend': None, 'execute': None, 'modified_by': 'harshada@webnotestech.com', 'name': 'PERM00843', 'parent': 'Business Letter', 'read': 1, 'create': 1, 'creation': '2010-04-20 11:10:52', 'modified': '2010-10-22 10:37:10', 'submit': None, 'doctype': 'DocPerm', 'write': 1, 'idx': 1, 'parenttype': 'DocType', 'role': 'All', 'owner': 'harshada@webnotestech.com', 'docstatus': 0, 'permlevel': 0, 'match': 'owner', 'parentfield': 'permissions'}, {'cancel': None, 'amend': None, 'execute': None, 'modified_by': 'harshada@webnotestech.com', 'name': 'PERM00844', 'parent': 'Business Letter', 'read': 1, 'create': 1, 'creation': '2010-04-20 11:10:52', 'modified': '2010-10-22 10:37:10', 'submit': None, 'doctype': 'DocPerm', 'write': 1, 'idx': 2, 'parenttype': 'DocType', 'role': 'System Manager', 'owner': 'harshada@webnotestech.com', 'docstatus': 0, 'permlevel': 0, 'match': None, 'parentfield': 'permissions'}, {'no_copy': None, 'oldfieldtype': 'Select', 'creation': '2010-04-20 11:10:52', 'doctype': 'DocField', 'oldfieldname': 'letter_type', 'owner': 'harshada@webnotestech.com', 'reqd': 0, 'in_filter': None, 'print_hide': 1, 'modified_by': 'harshada@webnotestech.com', 'label': 'Letter Type', 'width': None, 'trigger': '', 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Business Letter', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04796', 'idx': 1, 'default': None, 'colour': 'White:FFF', 'modified': '2010-10-22 10:37:10', 'parenttype': 'DocType', 'fieldname': 'letter_type', 'fieldtype': 'Select', 'options': 'link:Business Letter Type', 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Link', 'creation': '2010-04-20 11:10:52', 'doctype': 'DocField', 'oldfieldname': 'template', 'owner': 'harshada@webnotestech.com', 'reqd': None, 'in_filter': None, 'print_hide': 1, 'modified_by': 'harshada@webnotestech.com', 'label': 'Template', 'width': None, 'trigger': 'Client', 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Business Letter', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04797', 'idx': 2, 'default': None, 'colour': 'White:FFF', 'modified': '2010-10-22 10:37:10', 'parenttype': 'DocType', 'fieldname': 'template', 'fieldtype': 'Link', 'options': 'Business Letter Template', 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Link', 'creation': '2010-04-20 11:10:52', 'doctype': 'DocField', 'oldfieldname': 'to_contact', 'owner': 'harshada@webnotestech.com', 'reqd': 1, 'in_filter': None, 'print_hide': 1, 'modified_by': 'harshada@webnotestech.com', 'label': 'To Contact', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Business Letter', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04798', 'idx': 3, 'default': None, 'colour': None, 'modified': '2010-10-22 10:37:10', 'parenttype': 'DocType', 'fieldname': 'to_contact', 'fieldtype': 'Link', 'options': 'Contact', 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2010-04-20 11:42:39', 'doctype': 'DocField', 'oldfieldname': 'title', 'owner': 'harshada@webnotestech.com', 'reqd': 1, 'in_filter': None, 'print_hide': 1, 'modified_by': 'harshada@webnotestech.com', 'label': 'Title', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Business Letter', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04800', 'idx': 4, 'default': None, 'colour': None, 'modified': '2010-10-22 10:37:10', 'parenttype': 'DocType', 'fieldname': 'title', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Text Editor', 'creation': '2010-04-20 11:10:52', 'doctype': 'DocField', 'oldfieldname': 'content', 'owner': 'harshada@webnotestech.com', 'reqd': 1, 'in_filter': None, 'print_hide': None, 'modified_by': 'harshada@webnotestech.com', 'label': 'Content', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Business Letter', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04799', 'idx': 5, 'default': None, 'colour': None, 'modified': '2010-10-22 10:37:10', 'parenttype': 'DocType', 'fieldname': 'content', 'fieldtype': 'Text Editor', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/business_letter_template/__init__.py b/tools/doctype/business_letter_template/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/business_letter_template/__init__.py
diff --git a/tools/doctype/business_letter_template/business_letter_template.js b/tools/doctype/business_letter_template/business_letter_template.js
new file mode 100644
index 0000000..fe1457d
--- /dev/null
+++ b/tools/doctype/business_letter_template/business_letter_template.js
@@ -0,0 +1,10 @@
+$import(Tips Common)
+
+//--------- ONLOAD -------------
+cur_frm.cscript.onload = function(doc, cdt, cdn) {
+  cur_frm.cscript.get_tips(doc, cdt, cdn);
+}
+
+cur_frm.cscript.refresh = function(doc, cdt, cdn) {
+  cur_frm.cscript.get_tips(doc, cdt, cdn);
+}
\ No newline at end of file
diff --git a/tools/doctype/business_letter_template/business_letter_template.txt b/tools/doctype/business_letter_template/business_letter_template.txt
new file mode 100644
index 0000000..90af060
--- /dev/null
+++ b/tools/doctype/business_letter_template/business_letter_template.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2010-04-20 11:06:16', 'search_fields': None, 'module': 'Tools', 'doctype': 'DocType', 'change_log': None, 'print_outline': '', 'owner': 'harshada@webnotestech.com', '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': 3, '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:title', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'ashwini@webnotestech.com', 'document_type': 'Master', 'name': 'Business Letter Template', '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': 'ashwini@webnotestech.com', 'name': 'PERM00840', 'parent': 'Business Letter Template', 'read': 1, 'create': 1, 'creation': '2010-04-20 11:06:16', 'modified': '2010-09-20 09:03:29', 'submit': None, 'doctype': 'DocPerm', 'write': 1, 'idx': 1, 'parenttype': 'DocType', 'role': 'System Manager', 'owner': 'harshada@webnotestech.com', 'docstatus': 0, 'permlevel': 0, 'match': None, 'parentfield': 'permissions'}, {'cancel': None, 'amend': None, 'execute': None, 'modified_by': 'ashwini@webnotestech.com', 'name': 'PERM00841', 'parent': 'Business Letter Template', 'read': 1, 'create': None, 'creation': '2010-04-20 11:06:16', 'modified': '2010-09-20 09:03:29', 'submit': None, 'doctype': 'DocPerm', 'write': None, 'idx': 2, 'parenttype': 'DocType', 'role': 'All', 'owner': 'harshada@webnotestech.com', 'docstatus': 0, 'permlevel': 0, 'match': None, 'parentfield': 'permissions'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2010-04-20 11:06:16', 'doctype': 'DocField', 'oldfieldname': 'title', 'owner': 'harshada@webnotestech.com', 'reqd': 1, 'in_filter': None, 'print_hide': None, 'modified_by': 'ashwini@webnotestech.com', 'label': 'Title', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Business Letter Template', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04792', 'idx': 1, 'default': None, 'colour': None, 'modified': '2010-09-20 09:03:29', 'parenttype': 'DocType', 'fieldname': 'title', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Link', 'creation': '2010-04-20 11:06:16', 'doctype': 'DocField', 'oldfieldname': 'letter_type', 'owner': 'harshada@webnotestech.com', 'reqd': 1, 'in_filter': None, 'print_hide': None, 'modified_by': 'ashwini@webnotestech.com', 'label': 'Letter Type', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Business Letter Template', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04794', 'idx': 2, 'default': None, 'colour': None, 'modified': '2010-09-20 09:03:29', 'parenttype': 'DocType', 'fieldname': 'letter_type', 'fieldtype': 'Link', 'options': 'Business Letter Type', 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Text Editor', 'creation': '2010-04-20 11:06:16', 'doctype': 'DocField', 'oldfieldname': 'content', 'owner': 'harshada@webnotestech.com', 'reqd': 1, 'in_filter': None, 'print_hide': None, 'modified_by': 'ashwini@webnotestech.com', 'label': 'Content', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Business Letter Template', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04793', 'idx': 3, 'default': None, 'colour': None, 'modified': '2010-09-20 09:03:29', 'parenttype': 'DocType', 'fieldname': 'content', 'fieldtype': 'Text Editor', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/business_letter_type/__init__.py b/tools/doctype/business_letter_type/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/business_letter_type/__init__.py
diff --git a/tools/doctype/business_letter_type/business_letter_type.js b/tools/doctype/business_letter_type/business_letter_type.js
new file mode 100644
index 0000000..fe1457d
--- /dev/null
+++ b/tools/doctype/business_letter_type/business_letter_type.js
@@ -0,0 +1,10 @@
+$import(Tips Common)
+
+//--------- ONLOAD -------------
+cur_frm.cscript.onload = function(doc, cdt, cdn) {
+  cur_frm.cscript.get_tips(doc, cdt, cdn);
+}
+
+cur_frm.cscript.refresh = function(doc, cdt, cdn) {
+  cur_frm.cscript.get_tips(doc, cdt, cdn);
+}
\ No newline at end of file
diff --git a/tools/doctype/business_letter_type/business_letter_type.txt b/tools/doctype/business_letter_type/business_letter_type.txt
new file mode 100644
index 0000000..38a11b8
--- /dev/null
+++ b/tools/doctype/business_letter_type/business_letter_type.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2010-04-20 11:03:59', 'search_fields': None, 'module': 'Tools', 'doctype': 'DocType', 'change_log': None, 'print_outline': '', 'owner': 'harshada@webnotestech.com', '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': 3, '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:letter_type', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'ashwini@webnotestech.com', 'document_type': 'Master', 'name': 'Business Letter Type', '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': 'ashwini@webnotestech.com', 'name': 'PERM00839', 'parent': 'Business Letter Type', 'read': 1, 'create': 1, 'creation': '2010-04-20 11:03:59', 'modified': '2010-09-20 09:03:40', 'submit': None, 'doctype': 'DocPerm', 'write': 1, 'idx': 1, 'parenttype': 'DocType', 'role': 'System Manager', 'owner': 'harshada@webnotestech.com', 'docstatus': 0, 'permlevel': 0, 'match': None, 'parentfield': 'permissions'}, {'cancel': None, 'amend': None, 'execute': None, 'modified_by': 'ashwini@webnotestech.com', 'name': 'PERM00842', 'parent': 'Business Letter Type', 'read': 1, 'create': None, 'creation': '2010-04-20 11:06:28', 'modified': '2010-09-20 09:03:40', 'submit': None, 'doctype': 'DocPerm', 'write': None, 'idx': 2, 'parenttype': 'DocType', 'role': 'All', 'owner': 'harshada@webnotestech.com', 'docstatus': 0, 'permlevel': 0, 'match': None, 'parentfield': 'permissions'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2010-04-20 11:03:59', 'doctype': 'DocField', 'oldfieldname': 'letter_type', 'owner': 'harshada@webnotestech.com', 'reqd': 1, 'in_filter': None, 'print_hide': None, 'modified_by': 'ashwini@webnotestech.com', 'label': 'Letter Type', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Business Letter Type', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04791', 'idx': 1, 'default': None, 'colour': None, 'modified': '2010-09-20 09:03:40', 'parenttype': 'DocType', 'fieldname': 'letter_type', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/contact/__init__.py b/tools/doctype/contact/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/contact/__init__.py
diff --git a/tools/doctype/contact/contact.js b/tools/doctype/contact/contact.js
new file mode 100644
index 0000000..bca1615
--- /dev/null
+++ b/tools/doctype/contact/contact.js
@@ -0,0 +1,54 @@
+//--------- ONLOAD -------------
+cur_frm.cscript.onload = function(doc, cdt, cdn) {
+	if(doc.customer) cur_frm.add_fetch('customer', 'customer_name', 'customer_name');
+	if(doc.supplier) cur_frm.add_fetch('supplier', 'supplier_name', 'supplier_name');
+}
+/*
+//---------- on refresh ----------------------
+cur_frm.cscript.refresh = function(doc,cdt,cdn){
+	
+}
+
+
+//------------- Trigger on customer ---------------------
+cur_frm.cscript.is_customer = function(doc,cdt,cdn){
+	if(!doc.is_customer){
+		doc.customer = doc.customer_name = doc.customer_address = doc.customer_group = '';
+		refresh_many(['customer','customer_name','customer_address','customer_group']);
+	}
+}
+
+//------------- Trigger on supplier -----------------------
+cur_frm.cscript.is_supplier = function(doc,cdt,cdn){
+	if(!doc.is_supplier){
+		doc.supplier = doc.supplier_name = doc.supplier_address = doc.supplier_type = ''; 
+		refresh_many(['supplier','supplier_address','supplier_name','supplier_type']);
+	}
+}
+	
+//--------------- Trigger on sales partner ---------------------
+cur_frm.cscript.is_sales_partner = function(doc,cdt,cdn){
+	if(!doc.is_sales_partner){
+		doc.sales_partner = doc.sales_partner_address = doc.partner_type = '';
+		refresh_many(['sales_partner','sales_partner_address','partner_type']);
+	}
+}
+
+//----------- Trigger on supplier name ------------------------
+cur_frm.cscript.supplier = function(doc,cdt,cdn){
+	arg = {'dt':'Supplier','dn':doc.supplier,'nm':'supplier_name','fld':'supplier_address','type':'supplier_type'};
+	get_server_fields('get_address',docstring(arg),'',doc,cdt,cdn,1);
+}
+
+//------------ Trigger on customer name ------------------------
+cur_frm.cscript.customer = function(doc,cdt,cdn){
+	arg = {'dt':'Customer','dn':doc.customer,'nm':'customer_name','fld':'customer_address','type':'customer_group'};
+	get_server_fields('get_address',docstring(arg),'',doc,cdt,cdn,1);
+}
+
+//------------ Trigger on sales partner ------------------------
+cur_frm.cscript.sales_partner = function(doc,cdt,cdn){
+	arg = {'dt':'Sales Partner','dn':doc.sales_partner,'nm':'partner_name','fld':'sales_partner_address','type':'partner_type'};
+	get_server_fields('get_address',docstring(arg),'',doc,cdt,cdn,1);
+}
+*/
diff --git a/tools/doctype/contact/contact.py b/tools/doctype/contact/contact.py
new file mode 100644
index 0000000..7498619
--- /dev/null
+++ b/tools/doctype/contact/contact.py
@@ -0,0 +1,43 @@
+# Please edit this list and import only required elements
+import webnotes
+
+from webnotes.model.doc import Document
+from webnotes import session, form, msgprint, errprint
+
+sql = webnotes.conn.sql
+  
+# -----------------------------------------------------------------------------------------
+
+class DocType:
+  def __init__(self, doc, doclist=[]):
+    self.doc = doc
+    self.doclist = doclist
+
+  def autoname(self):
+    if self.doc.customer:
+      self.doc.name = self.doc.first_name + (self.doc.last_name and ' ' + self.doc.last_name or '') + '-' + self.doc.customer
+    elif self.doc.supplier:
+      self.doc.name = self.doc.first_name + (self.doc.last_name and ' ' + self.doc.last_name or '') + '-' + self.doc.supplier
+    elif self.doc.sales_partner:
+      self.doc.name = self.doc.first_name + (self.doc.last_name and ' ' + self.doc.last_name or '') + '-' + self.doc.sales_partner  
+    
+    # filter out bad characters in name
+    self.doc.name = self.doc.name.replace('&','and').replace('.','').replace("'",'').replace('"','').replace(',','')      
+
+#----------------------
+# Call to Validate
+#----------------------
+  def validate(self):
+    self.validate_primary_contact()
+
+#----------------------
+# Validate that there can only be one primary contact for particular customer, supplier
+#----------------------
+  def validate_primary_contact(self):
+    if self.doc.is_primary_contact == 1:
+      if self.doc.customer:
+        sql("update tabContact set is_primary_contact=0 where customer = '%s'" % (self.doc.customer))
+      elif self.doc.supplier:
+        sql("update tabContact set is_primary_contact=0 where supplier = '%s'" % (self.doc.supplier))  
+      elif self.doc.sales_partner:
+        sql("update tabContact set is_primary_contact=0 where sales_partner = '%s'" % (self.doc.sales_partner))  
diff --git a/tools/doctype/contact/contact.txt b/tools/doctype/contact/contact.txt
new file mode 100644
index 0000000..81a97a3
--- /dev/null
+++ b/tools/doctype/contact/contact.txt
@@ -0,0 +1,786 @@
+[
+	{
+		'_last_update': '1306748466',
+		'_user_tags': None,
+		'allow_attach': None,
+		'allow_copy': None,
+		'allow_email': None,
+		'allow_print': None,
+		'allow_rename': None,
+		'allow_trash': 1,
+		'autoname': None,
+		'change_log': None,
+		'client_script': None,
+		'client_script_core': None,
+		'client_string': None,
+		'colour': 'White:FFF',
+		'creation': '2010-08-08 17:08:55',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocType',
+		'document_type': 'Master',
+		'dt_template': None,
+		'hide_heading': None,
+		'hide_toolbar': None,
+		'idx': None,
+		'in_create': 0,
+		'in_dialog': 1,
+		'is_transaction_doc': None,
+		'issingle': None,
+		'istable': None,
+		'max_attachments': None,
+		'menu_index': None,
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'module': 'Tools',
+		'name': 'Contact',
+		'name_case': None,
+		'owner': 'Administrator',
+		'parent': None,
+		'parent_node': None,
+		'parentfield': None,
+		'parenttype': None,
+		'print_outline': None,
+		'read_only': None,
+		'read_only_onload': None,
+		'search_fields': None,
+		'section_style': 'Simple',
+		'server_code': None,
+		'server_code_compiled': None,
+		'server_code_core': None,
+		'server_code_error': ' ',
+		'show_in_menu': 0,
+		'smallicon': None,
+		'subject': '%(first_name)s %(last_name)s - Email: %(email_id)s | Contact: %(phone)s | Mobile: %(mobile_no)s',
+		'tag_fields': None,
+		'use_template': None,
+		'version': 245
+	},
+	{
+		'amend': None,
+		'cancel': None,
+		'create': None,
+		'creation': '2010-10-27 14:40:07',
+		'docstatus': 0,
+		'doctype': 'DocPerm',
+		'execute': None,
+		'idx': 1,
+		'match': None,
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'PERM00721',
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'permissions',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'read': 1,
+		'role': 'Sales User',
+		'submit': None,
+		'write': None
+	},
+	{
+		'amend': None,
+		'cancel': None,
+		'create': None,
+		'creation': '2010-10-27 14:40:07',
+		'docstatus': 0,
+		'doctype': 'DocPerm',
+		'execute': None,
+		'idx': 2,
+		'match': None,
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'PERM00722',
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'permissions',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'read': 1,
+		'role': 'Purchase User',
+		'submit': None,
+		'write': None
+	},
+	{
+		'amend': 0,
+		'cancel': 1,
+		'create': 1,
+		'creation': '2010-08-08 17:08:55',
+		'docstatus': 0,
+		'doctype': 'DocPerm',
+		'execute': None,
+		'idx': 3,
+		'match': None,
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'PERM00125',
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'permissions',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'read': 1,
+		'role': 'Sales Master Manager',
+		'submit': 0,
+		'write': 1
+	},
+	{
+		'amend': None,
+		'cancel': 1,
+		'create': 1,
+		'creation': '2010-08-08 17:08:55',
+		'docstatus': 0,
+		'doctype': 'DocPerm',
+		'execute': None,
+		'idx': 4,
+		'match': None,
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'PERM00128',
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'permissions',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'read': 1,
+		'role': 'Purchase Master Manager',
+		'submit': None,
+		'write': 1
+	},
+	{
+		'amend': None,
+		'cancel': 1,
+		'create': 1,
+		'creation': '2010-08-08 17:08:55',
+		'docstatus': 0,
+		'doctype': 'DocPerm',
+		'execute': None,
+		'idx': 5,
+		'match': None,
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'PERM00129',
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'permissions',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'read': 1,
+		'role': 'System Manager',
+		'submit': None,
+		'write': 1
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-27 18:28:50',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': None,
+		'fieldtype': 'Section Break',
+		'hidden': None,
+		'icon': None,
+		'idx': 1,
+		'in_filter': None,
+		'label': 'Contact Details',
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'FL04808',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': 'Section Break',
+		'options': None,
+		'owner': 'ashwini@webnotestech.com',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2011-05-27 18:28:50',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': None,
+		'fieldtype': 'Column Break',
+		'hidden': None,
+		'icon': None,
+		'idx': 2,
+		'in_filter': None,
+		'label': None,
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'FL04809',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': 'Column Break',
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': '50%'
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2010-08-08 17:08:55',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'first_name',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 3,
+		'in_filter': None,
+		'label': 'First Name',
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'FL00758',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': 'first_name',
+		'oldfieldtype': 'Data',
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': 1,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2010-08-08 17:08:55',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'last_name',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 4,
+		'in_filter': None,
+		'label': 'Last Name',
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'FL00759',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': 'last_name',
+		'oldfieldtype': 'Data',
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2010-09-01 15:47:57',
+		'default': None,
+		'depends_on': 'eval:!doc.supplier && !doc.sales_partner',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'customer',
+		'fieldtype': 'Link',
+		'hidden': None,
+		'icon': None,
+		'idx': 5,
+		'in_filter': None,
+		'label': 'Customer',
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'FL03855',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': 'customer',
+		'oldfieldtype': 'Link',
+		'options': 'Customer',
+		'owner': 'harshada@webnotestech.com',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': 0,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': 'Client',
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-17 14:03:55',
+		'default': None,
+		'depends_on': 'eval:!doc.supplier && !doc.sales_partner',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'customer_name',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 6,
+		'in_filter': None,
+		'label': 'Customer Name',
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': '000001020',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 1,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-04-25 18:42:39',
+		'default': None,
+		'depends_on': 'eval:!doc.customer && !doc.sales_partner',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'supplier',
+		'fieldtype': 'Link',
+		'hidden': None,
+		'icon': None,
+		'idx': 7,
+		'in_filter': None,
+		'label': 'Supplier',
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': '000000574',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': 'Supplier',
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': 'Client',
+		'width': None
+	},
+	{
+		'allow_on_submit': 0,
+		'colour': 'White:FFF',
+		'creation': '2011-05-17 14:03:55',
+		'default': None,
+		'depends_on': 'eval:!doc.customer && !doc.sales_partner',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'supplier_name',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 8,
+		'in_filter': None,
+		'label': 'Supplier Name',
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': '000001021',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 1,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-05-17 14:43:27',
+		'default': None,
+		'depends_on': 'eval:!doc.customer && !doc.supplier',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'sales_partner',
+		'fieldtype': 'Link',
+		'hidden': None,
+		'icon': None,
+		'idx': 9,
+		'in_filter': None,
+		'label': 'Sales Partner',
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': '000001030',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': 'Sales Partner',
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2010-08-08 17:08:56',
+		'default': '0',
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'is_primary_contact',
+		'fieldtype': 'Check',
+		'hidden': None,
+		'icon': None,
+		'idx': 10,
+		'in_filter': None,
+		'label': 'Is Primary Contact',
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'FL00776',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': 'is_primary_contact',
+		'oldfieldtype': 'Select',
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2011-05-27 18:28:50',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': None,
+		'fieldtype': 'Column Break',
+		'hidden': None,
+		'icon': None,
+		'idx': 11,
+		'in_filter': None,
+		'label': None,
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'FL04810',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': 'Column Break',
+		'options': None,
+		'owner': 'ashwini@webnotestech.com',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': '50%'
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2010-08-08 17:08:56',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'email_id',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 12,
+		'in_filter': None,
+		'label': 'Email Id',
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'FL00779',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': 'email_id',
+		'oldfieldtype': 'Data',
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': 1,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2010-08-08 17:08:56',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'phone',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 13,
+		'in_filter': None,
+		'label': 'Phone',
+		'modified': '2011-05-30 16:34:29',
+		'modified_by': 'Administrator',
+		'name': 'FL00778',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': 'contact_no',
+		'oldfieldtype': 'Data',
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': 1,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2010-08-08 17:08:56',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'mobile_no',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 14,
+		'in_filter': None,
+		'label': 'Mobile No',
+		'modified': '2011-05-30 16:34:30',
+		'modified_by': 'Administrator',
+		'name': 'FL00780',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': 'mobile_no',
+		'oldfieldtype': 'Data',
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-04-26 12:04:54',
+		'default': None,
+		'depends_on': None,
+		'description': 'Enter department to which this Contact belongs',
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'department',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 15,
+		'in_filter': None,
+		'label': 'Department',
+		'modified': '2011-05-30 16:34:30',
+		'modified_by': 'Administrator',
+		'name': '000000575',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': 'Suggest',
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': 'White:FFF',
+		'creation': '2011-04-26 12:04:54',
+		'default': None,
+		'depends_on': None,
+		'description': 'Enter designation of this Contact',
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'designation',
+		'fieldtype': 'Data',
+		'hidden': None,
+		'icon': None,
+		'idx': 16,
+		'in_filter': None,
+		'label': 'Designation',
+		'modified': '2011-05-30 16:34:30',
+		'modified_by': 'Administrator',
+		'name': '000000576',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': None,
+		'oldfieldtype': None,
+		'options': 'Suggest',
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	},
+	{
+		'allow_on_submit': None,
+		'colour': None,
+		'creation': '2010-08-08 17:08:55',
+		'default': None,
+		'depends_on': None,
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocField',
+		'fieldname': 'trash_reason',
+		'fieldtype': 'Small Text',
+		'hidden': None,
+		'icon': None,
+		'idx': 17,
+		'in_filter': None,
+		'label': 'Trash Reason',
+		'modified': '2011-05-30 16:34:30',
+		'modified_by': 'Administrator',
+		'name': 'FL00755',
+		'no_column': None,
+		'no_copy': None,
+		'oldfieldname': 'trash_reason',
+		'oldfieldtype': 'Small Text',
+		'options': None,
+		'owner': 'Administrator',
+		'parent': 'Contact',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 1,
+		'print_hide': None,
+		'report_hide': None,
+		'reqd': None,
+		'search_index': None,
+		'trigger': None,
+		'width': None
+	}
+]
\ No newline at end of file
diff --git a/tools/doctype/contact_detail/__init__.py b/tools/doctype/contact_detail/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/contact_detail/__init__.py
diff --git a/tools/doctype/contact_detail/contact_detail.txt b/tools/doctype/contact_detail/contact_detail.txt
new file mode 100644
index 0000000..6f58968
--- /dev/null
+++ b/tools/doctype/contact_detail/contact_detail.txt
@@ -0,0 +1 @@
+[{'section_style': 'Tray', 'is_transaction_doc': None, 'creation': '2009-03-30 18:16:41', 'search_fields': None, 'module': 'Tools', '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': '', 'allow_attach': None, 'show_in_menu': 0, 'max_attachments': None, 'version': 5, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': 1, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': 'CD/.#####', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'Contact Detail', 'idx': None, 'hide_toolbar': None, 'colour': 'White:FFF', 'client_script': None, 'modified': '2010-09-20 14:06:57', 'server_code_error': None, 'name_case': '', 'parenttype': None, 'read_only_onload': None, 'server_code_core': None, 'server_code_compiled': None, 'parent_node': None, 'parentfield': None}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-03-30 18:16:41', 'doctype': 'DocField', 'oldfieldname': 'contact_person', 'owner': 'Administrator', 'reqd': 1, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Contact Person', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Contact Detail', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL01574', 'idx': 1, 'default': None, 'colour': None, 'modified': '2009-07-20 19:14:16', 'parenttype': 'DocType', 'fieldname': 'contact_person', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-03-30 18:16:41', 'doctype': 'DocField', 'oldfieldname': 'contact_no', 'owner': 'Administrator', 'reqd': 1, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Contact No', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Contact Detail', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL01575', 'idx': 2, 'default': None, 'colour': None, 'modified': '2009-07-20 19:14:16', 'parenttype': 'DocType', 'fieldname': 'contact_no', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-03-30 18:16:41', 'doctype': 'DocField', 'oldfieldname': 'department', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Department', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Contact Detail', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL01576', 'idx': 3, 'default': None, 'colour': None, 'modified': '2009-07-20 19:14:16', 'parenttype': 'DocType', 'fieldname': 'department', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-05-06 17:14:06', 'doctype': 'DocField', 'oldfieldname': 'designation', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Designation', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Contact Detail', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL02006', 'idx': 4, 'default': None, 'colour': None, 'modified': '2009-07-20 19:14:16', 'parenttype': 'DocType', 'fieldname': 'designation', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Small Text', 'creation': '2009-05-19 10:57:20', 'doctype': 'DocField', 'oldfieldname': 'email_id', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Email Id', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Contact Detail', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL02092', 'idx': 5, 'default': None, 'colour': None, 'modified': '2009-07-20 19:14:16', 'parenttype': 'DocType', 'fieldname': 'email_id', 'fieldtype': 'Small Text', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/file_browser_control/__init__.py b/tools/doctype/file_browser_control/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/file_browser_control/__init__.py
diff --git a/tools/doctype/file_browser_control/file_browser_control.py b/tools/doctype/file_browser_control/file_browser_control.py
new file mode 100644
index 0000000..8008ae9
--- /dev/null
+++ b/tools/doctype/file_browser_control/file_browser_control.py
@@ -0,0 +1,198 @@
+# 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
+        
+    # All root file groups(where parent_group is null).
+    def get_root_file_grps(self):
+        fl_grp = convert_to_lists(sql("select name,group_name,ifnull(can_edit,''),ifnull(can_view,''),owner from `tabFile Group` where (parent_group='' or parent_group is null)"))
+        return fl_grp
+    
+    # Get children of selected file group.
+    def get_children(self,grp):
+        ret = {}
+        ret['parent_grp'] = grp
+            
+        fl_grp = convert_to_lists(sql("select name,group_name,ifnull(can_edit,''),ifnull(can_view,''),owner from `tabFile Group` where parent_group=%s",grp))
+        ret['fl_grp'] = fl_grp or ''
+        fl = convert_to_lists(sql("select name,ifnull(file_name,''),ifnull(file_list,''),ifnull(can_edit,''),ifnull(can_view,''),owner from tabFile where file_group=%s and (file_name != '' and file_name is not null)",grp))
+        ret['fl'] = fl or ''
+
+        return ret
+    
+    # Create a new file group.
+    def create_new_grp(self,arg):
+        arg = eval(arg)
+        
+        grp = Document('File Group')
+        grp.group_name = arg['grp_nm']
+        grp.parent_group = arg['parent_grp']
+        grp.description = arg['desc']
+        grp.name = arg['grp_nm']
+        grp.save(1)
+        msgprint('Created a New Group')
+        return grp.name
+    
+    # Create a new file.
+    def create_new_file(self,arg):
+        arg = eval(arg)
+        
+        f = Document('File')
+        f.file_name = arg['file_name']
+        f.description = arg['desc']
+        f.type = arg['type']
+        f.file_group = arg['file_grp']
+        f_obj = get_obj(doc=f)
+        f_obj.validate()
+        f_obj.doc.save(1)
+        msgprint('Created a New File')
+        ret = {
+            'name'  :   f_obj.doc.name,
+            'label' :   f_obj.doc.file_name
+        }
+        return cstr(ret)
+    
+    # Update changes done to selected file group.
+    def update_grp(self,arg):
+        arg = eval(arg)
+        sql("update `tabFile Group` set group_name=%s, parent_group=%s, description=%s where name=%s",(arg['grp_nm'],arg['parent_grp'],arg['desc'],arg['name']))
+        msgprint("Changes are saved.")
+        return arg['name']
+
+    # Update changes done to selected file.
+    def update_file(self,arg):
+        arg = eval(arg)
+        sql("update `tabFile` set description=%s, file_group=%s where name=%s",(arg['desc'],arg['file_grp'],arg['name']))
+        msgprint("Changes are saved.")        
+        return arg['name']
+        
+    # Get details of selected file.
+    def get_file_details(self,file_id):
+        file_det = convert_to_lists(sql("select name,file_name, description, file_group, file_list from tabFile where name=%s",file_id))
+        file_det = {
+            'name' : file_det[0][0] or '',
+            'file_name' : file_det[0][1] or '',
+            'description' : file_det[0][2] or '',
+            'file_group' : file_det[0][3] or '',
+            'file_list' : file_det[0][4] or ''
+        }
+        return file_det
+    
+    # Delete File Data and File record.
+    def delete(self,arg):
+        arg = eval(arg)
+        if arg['dt'] == 'File Group':
+            sql("delete from `tabFile Group` where name= %s", arg['dn'])
+        elif arg['dt'] == 'File':
+			file_list = sql("select file_list from tabFile where name=%s", arg['dn'])[0][0] or ''
+			f_id = file_list.split(',')[-1]
+			if f_id:
+				sql("delete from `tabFile Data` where name=%s", f_id)
+				sql("delete from tabFile where name = %s", arg['dn'])	
+        else:
+            pass
+			
+    #Move to another group.
+    def move(self,arg):
+        msgprint('need to write code')
+
+    # Upload Image
+    def upload_many(self,form):
+        import os
+        # from file browser
+        if form.getvalue('form_name') == 'File Browser':
+            if form.getvalue('filedata'):
+                i = form['filedata']
+
+                #creat file data                
+                fd = Document('File Data')
+                fd.blob_content = i.file.read()
+                fd.file_name = i.filename
+                
+                file_det = form.getvalue('file_det').split('~~')
+                
+                if(file_det[0] == 'NIL'):
+                    file_desc = ''
+                else:
+                    file_desc = file_det[0]
+                
+                if(file_det[1] == 'NIL'):
+                    file_grp = ''
+                    return 'File Group is mandatory.'
+                    raise Exception
+                else:
+                    file_grp = file_det[1]
+                
+                if "" in fd.file_name:
+                  fd.file_name = fd.file_name.split("")[-1]
+                if '/' in fd.file_name:
+                  fd.file_name = fd.file_name.split('/')[-1]
+                fd.save(1)
+                
+                f = Document('File')
+                f.file_list = fd.file_name + ',' + fd.name
+                f.file_name = fd.file_name
+                f.description = file_desc
+                f.file_group = file_grp
+                f.save(1)
+                
+                ret = {
+                    'name'  :   f.name,
+                    'file_name' :   f.file_name
+                }
+                    
+                return cstr(ret)
+            else:
+                return 'No file found.'
+        else:
+            return 'No file found.'
+    
+    # Get all system roles.
+    def get_all_roles(self):
+        roles = convert_to_lists(sql("select name from tabRole"))
+        return roles
+    
+    # Get details for selected File Group.
+    def get_fg_details(self,grp):
+        grp_det = convert_to_lists(sql("select name,group_name, ifnull(parent_group,''), ifnull(description,''), ifnull(can_edit,''),ifnull(can_view,''),owner from `tabFile Group` where name=%s",grp))
+        grp_det = {
+            'Name' : grp_det[0][0] or '',
+            'Group Name' : grp_det[0][1] or '',
+            'Parent Group' : grp_det[0][2] or '',
+            'Description' : grp_det[0][3] or '',
+            'Can Edit' : grp_det[0][4] or '',
+            'Can View' : grp_det[0][5] or '',
+            'Owner' : grp_det[0][6] or ''
+        }
+        return grp_det
+    
+    # Update Edit/ View privileges to selected File/ File Group.
+    def update_privileges(self,arg):
+        arg = eval(arg)
+        sql("update `tab%s` set can_edit='%s', can_view='%s' where name='%s'" % (arg['type'],arg['edit_roles'], arg['view_roles'], arg['name']))
+        msgprint('Privileges updated.')
+    
+    # Get Edit/ View privileges from selected File/ File Group.
+    def get_privileges(self,arg):
+        arg = eval(arg)
+        privilege = convert_to_lists(sql("select ifnull(can_edit,''), ifnull(can_view,''),owner from `tab%s` where name='%s'" % (arg['dt'],arg['dn'])))
+        return privilege
\ No newline at end of file
diff --git a/tools/doctype/file_browser_control/file_browser_control.txt b/tools/doctype/file_browser_control/file_browser_control.txt
new file mode 100644
index 0000000..08b7f59
--- /dev/null
+++ b/tools/doctype/file_browser_control/file_browser_control.txt
@@ -0,0 +1,55 @@
+[
+	{
+		'allow_attach': None,
+		'allow_copy': None,
+		'allow_email': None,
+		'allow_print': None,
+		'allow_rename': None,
+		'allow_trash': None,
+		'autoname': None,
+		'change_log': None,
+		'client_script': None,
+		'client_script_core': None,
+		'client_string': None,
+		'colour': 'White:FFF',
+		'creation': '2009-10-28 10:25:03',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocType',
+		'document_type': None,
+		'dt_template': None,
+		'hide_heading': None,
+		'hide_toolbar': None,
+		'idx': None,
+		'in_create': None,
+		'in_dialog': None,
+		'is_transaction_doc': None,
+		'issingle': 1,
+		'istable': None,
+		'max_attachments': None,
+		'menu_index': None,
+		'modified': '2010-09-20 14:06:57',
+		'modified_by': 'Administrator',
+		'module': 'Tools',
+		'name': 'File Browser Control',
+		'name_case': None,
+		'owner': 'Administrator',
+		'parent': None,
+		'parent_node': None,
+		'parentfield': None,
+		'parenttype': None,
+		'print_outline': None,
+		'read_only': None,
+		'read_only_onload': None,
+		'search_fields': None,
+		'section_style': 'Simple',
+		'server_code': None,
+		'server_code_compiled': None,
+		'server_code_core': None,
+		'server_code_error': None,
+		'show_in_menu': 0,
+		'smallicon': None,
+		'use_template': None,
+		'version': 81
+	}
+]
\ No newline at end of file
diff --git a/tools/doctype/rating_template/__init__.py b/tools/doctype/rating_template/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/rating_template/__init__.py
diff --git a/tools/doctype/rating_template/rating_template.txt b/tools/doctype/rating_template/rating_template.txt
new file mode 100644
index 0000000..870e125
--- /dev/null
+++ b/tools/doctype/rating_template/rating_template.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2009-11-12 18:12:18', 'search_fields': None, 'module': 'Tools', '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': '', 'allow_attach': None, 'show_in_menu': 0, 'max_attachments': None, 'version': 4, '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:template_name', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'Rating Template', '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': 'PERM00516', 'parent': 'Rating Template', 'read': 1, 'create': 1, 'creation': '2009-11-12 18:12:18', 'modified': '2010-08-06 01:21:20', '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': 'Data', 'creation': '2009-11-12 18:12:18', 'doctype': 'DocField', 'oldfieldname': 'template_name', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Template Name', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Template', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03336', 'idx': 1, 'default': None, 'colour': None, 'modified': '2010-08-06 01:21:20', 'parenttype': 'DocType', 'fieldname': 'template_name', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Int', 'creation': '2009-11-12 18:12:18', 'doctype': 'DocField', 'oldfieldname': 'total_stars', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Total Stars', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Template', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03337', 'idx': 2, 'default': None, 'colour': None, 'modified': '2010-08-06 01:21:20', 'parenttype': 'DocType', 'fieldname': 'total_stars', 'fieldtype': 'Int', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Section Break', 'creation': '2009-11-12 18:12:18', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating Template Details', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Template', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03338', 'idx': 3, 'default': None, 'colour': None, 'modified': '2010-08-06 01:21:20', 'parenttype': 'DocType', 'fieldname': None, 'fieldtype': 'Section Break', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Table', 'creation': '2009-11-12 18:12:18', 'doctype': 'DocField', 'oldfieldname': 'rating_template_details', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating Template Details1', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Template', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03339', 'idx': 4, 'default': None, 'colour': None, 'modified': '2010-08-06 01:21:20', 'parenttype': 'DocType', 'fieldname': 'rating_template_details', 'fieldtype': 'Table', 'options': 'Rating Template Detail', 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/rating_template_detail/__init__.py b/tools/doctype/rating_template_detail/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/rating_template_detail/__init__.py
diff --git a/tools/doctype/rating_template_detail/rating_template_detail.txt b/tools/doctype/rating_template_detail/rating_template_detail.txt
new file mode 100644
index 0000000..31050a5
--- /dev/null
+++ b/tools/doctype/rating_template_detail/rating_template_detail.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2009-11-12 18:13:41', 'search_fields': None, 'module': 'Tools', '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': '', 'allow_attach': None, 'show_in_menu': 0, 'max_attachments': None, 'version': 3, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': 1, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': 'RTD/.#####', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'Rating Template Detail', 'idx': None, 'hide_toolbar': None, 'colour': 'White:FFF', 'client_script': None, 'modified': '2010-09-20 14:06:57', 'server_code_error': None, 'name_case': '', 'parenttype': None, 'read_only_onload': None, 'server_code_core': None, 'server_code_compiled': None, 'parent_node': None, 'parentfield': None}, {'no_copy': None, 'oldfieldtype': 'Int', 'creation': '2009-11-12 18:13:41', 'doctype': 'DocField', 'oldfieldname': 'rating', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Template Detail', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03340', 'idx': 1, 'default': None, 'colour': None, 'modified': '2010-08-06 01:21:10', 'parenttype': 'DocType', 'fieldname': 'rating', 'fieldtype': 'Int', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-11-12 18:13:41', 'doctype': 'DocField', 'oldfieldname': 'description', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Description', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Template Detail', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03341', 'idx': 2, 'default': None, 'colour': None, 'modified': '2010-08-06 01:21:10', 'parenttype': 'DocType', 'fieldname': 'description', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/rating_widget_control/__init__.py b/tools/doctype/rating_widget_control/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/rating_widget_control/__init__.py
diff --git a/tools/doctype/rating_widget_control/rating_widget_control.py b/tools/doctype/rating_widget_control/rating_widget_control.py
new file mode 100644
index 0000000..d5c5bad
--- /dev/null
+++ b/tools/doctype/rating_widget_control/rating_widget_control.py
@@ -0,0 +1,51 @@
+# 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 show_my_rating(self,arg):
+        arg = eval(arg)
+        ret = {}
+        ret['total_stars'] = convert_to_lists(sql("select total_stars from `tabRating Template` where name = %s", arg['template']))
+        ret['avg_rating'] = convert_to_lists(sql("select count(name),round(sum(rating_stars)/count(name)) from `tabRating Widget Record` where rating_doctype = %s and rating_docname = %s and rating_template = %s",(arg['dt'], arg['dn'], arg['template'])))
+        rating_details = convert_to_lists(sql("select name, rating_stars, rating_description, rating_template, rating_by, rating_to, rating_date, rating_time, rating_doctype, rating_docname from `tabRating Widget Record` where rating_by = %s and rating_doctype = %s and rating_docname = %s and rating_template = %s",(arg['by'], arg['dt'], arg['dn'], arg['template'])))
+        if rating_details:
+            ret['rating_details'] = rating_details or ''
+            ret['flag'] = 1
+        else:
+            ret['rating_desc'] = convert_to_lists(sql("select rating, description from `tabRating Template Detail` where parent = %s", arg['template']))
+            ret['flag'] = 0
+        return ret
+        
+    def add_rating(self,arg):
+        import time
+        arg = eval(arg)
+        rw = Document('Rating Widget Record')
+        rw.rating_stars = arg['rating']
+        rw.rating_description = arg['desc']
+        rw.rating_template = arg['template']
+        rw.rating_by = arg['rating_by']
+        rw.rating_to = Document(arg['dt'],arg['dn']).owner
+        rw.rating_date = nowdate()
+        rw.rating_time = time.strftime('%H:%M')
+        rw.rating_doctype = arg['dt']
+        rw.rating_docname = arg['dn']
+        rw.save(1)
\ No newline at end of file
diff --git a/tools/doctype/rating_widget_control/rating_widget_control.txt b/tools/doctype/rating_widget_control/rating_widget_control.txt
new file mode 100644
index 0000000..34c6ccf
--- /dev/null
+++ b/tools/doctype/rating_widget_control/rating_widget_control.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2009-11-12 18:26:54', 'search_fields': None, 'module': 'Tools', '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': 1, 'allow_rename': None, 'smallicon': None, 'allow_attach': None, 'show_in_menu': 0, 'max_attachments': None, 'version': 3, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': None, 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'Rating Widget Control', '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}]
\ No newline at end of file
diff --git a/tools/doctype/rating_widget_record/__init__.py b/tools/doctype/rating_widget_record/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/rating_widget_record/__init__.py
diff --git a/tools/doctype/rating_widget_record/rating_widget_record.txt b/tools/doctype/rating_widget_record/rating_widget_record.txt
new file mode 100644
index 0000000..6c6a0f3
--- /dev/null
+++ b/tools/doctype/rating_widget_record/rating_widget_record.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2009-11-12 18:16:40', 'search_fields': None, 'module': 'Tools', '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': 0, 'max_attachments': None, 'version': 3, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': 'RWR/.#####', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'Rating Widget Record', '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': 'PERM00517', 'parent': 'Rating Widget Record', 'read': 1, 'create': 1, 'creation': '2009-11-12 18:16:40', 'modified': '2010-08-06 01:20:33', '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': 'Int', 'creation': '2009-11-12 18:16:40', 'doctype': 'DocField', 'oldfieldname': 'rating_stars', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating Stars', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Widget Record', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03342', 'idx': 1, 'default': None, 'colour': None, 'modified': '2010-08-06 01:20:33', 'parenttype': 'DocType', 'fieldname': 'rating_stars', 'fieldtype': 'Int', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-11-12 18:16:40', 'doctype': 'DocField', 'oldfieldname': 'rating_description', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating Description', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Widget Record', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03343', 'idx': 2, 'default': None, 'colour': None, 'modified': '2010-08-06 01:20:33', 'parenttype': 'DocType', 'fieldname': 'rating_description', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-11-12 18:16:40', 'doctype': 'DocField', 'oldfieldname': 'rating_template', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating Template', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Widget Record', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03344', 'idx': 3, 'default': None, 'colour': None, 'modified': '2010-08-06 01:20:33', 'parenttype': 'DocType', 'fieldname': 'rating_template', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-11-12 18:16:40', 'doctype': 'DocField', 'oldfieldname': 'rating_by', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating By', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Widget Record', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03345', 'idx': 4, 'default': None, 'colour': None, 'modified': '2010-08-06 01:20:33', 'parenttype': 'DocType', 'fieldname': 'rating_by', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-11-12 18:16:40', 'doctype': 'DocField', 'oldfieldname': 'rating_to', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating To', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Widget Record', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03346', 'idx': 5, 'default': None, 'colour': None, 'modified': '2010-08-06 01:20:33', 'parenttype': 'DocType', 'fieldname': 'rating_to', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Date', 'creation': '2009-11-12 18:16:40', 'doctype': 'DocField', 'oldfieldname': 'rating_date', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating Date', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Widget Record', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03347', 'idx': 6, 'default': None, 'colour': None, 'modified': '2010-08-06 01:20:33', 'parenttype': 'DocType', 'fieldname': 'rating_date', 'fieldtype': 'Date', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-11-12 18:16:40', 'doctype': 'DocField', 'oldfieldname': 'rating_time', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating Time', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Widget Record', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03348', 'idx': 7, 'default': None, 'colour': None, 'modified': '2010-08-06 01:20:33', 'parenttype': 'DocType', 'fieldname': 'rating_time', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-11-12 18:16:40', 'doctype': 'DocField', 'oldfieldname': 'rating_doctype', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating Doctype', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Widget Record', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03349', 'idx': 8, 'default': None, 'colour': None, 'modified': '2010-08-06 01:20:33', 'parenttype': 'DocType', 'fieldname': 'rating_doctype', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-11-12 18:16:40', 'doctype': 'DocField', 'oldfieldname': 'rating_docname', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Rating Docname', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Rating Widget Record', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03350', 'idx': 9, 'default': None, 'colour': None, 'modified': '2010-08-06 01:20:33', 'parenttype': 'DocType', 'fieldname': 'rating_docname', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/receiver_detail/__init__.py b/tools/doctype/receiver_detail/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/receiver_detail/__init__.py
diff --git a/tools/doctype/receiver_detail/receiver_detail.txt b/tools/doctype/receiver_detail/receiver_detail.txt
new file mode 100644
index 0000000..62d7ca2
--- /dev/null
+++ b/tools/doctype/receiver_detail/receiver_detail.txt
@@ -0,0 +1 @@
+[{'section_style': 'Tray', 'is_transaction_doc': None, 'creation': '2009-03-12 17:10:13', 'search_fields': None, 'module': 'Tools', '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': '', 'allow_attach': None, 'show_in_menu': None, 'max_attachments': None, 'version': 2, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': 1, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': None, 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'Receiver Detail', '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}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2010-07-05 13:29:27', 'doctype': 'DocField', 'oldfieldname': 'customer_name', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Customer Name', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Receiver Detail', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL05519', 'idx': 1, 'default': None, 'colour': None, 'modified': '2010-07-05 13:29:27', 'parenttype': 'DocType', 'fieldname': 'customer_name', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-03-12 17:10:13', 'doctype': 'DocField', 'oldfieldname': 'receiver_name', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Receiver Name', 'width': '350px', 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Receiver Detail', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL01344', 'idx': 2, 'default': None, 'colour': None, 'modified': '2010-07-05 13:29:27', 'parenttype': 'DocType', 'fieldname': 'receiver_name', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-03-12 17:10:13', 'doctype': 'DocField', 'oldfieldname': 'mobile_no', 'owner': 'Administrator', 'reqd': 1, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Mobile No', 'width': '200px', 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Receiver Detail', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL01345', 'idx': 3, 'default': None, 'colour': None, 'modified': '2010-07-05 13:29:27', 'parenttype': 'DocType', 'fieldname': 'mobile_no', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/reposting_tool/__init__.py b/tools/doctype/reposting_tool/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/reposting_tool/__init__.py
diff --git a/tools/doctype/reposting_tool/reposting_tool.js b/tools/doctype/reposting_tool/reposting_tool.js
new file mode 100644
index 0000000..8a1d41f
--- /dev/null
+++ b/tools/doctype/reposting_tool/reposting_tool.js
@@ -0,0 +1,63 @@
+var bin_list = [];
+var msg = [];
+var binidx = 0;
+
+cur_frm.cscript['Repost Bin'] = function(doc,cdt,cdn) {
+  args = {'check': 'Bin'};
+  $c_obj('Reposting Tool','get_count_for_reposting', docstring(args), function(r,rt) {
+       bin_list = r.message;
+       repair_bin();
+    });
+} 
+
+function repair_single_bin(){
+  $c_obj('Reposting Tool', 'repair_bin', cstr(bin_list[binidx]), function(r,rt) {
+       for(i = 0; i < r.message.length ; i++){
+         msg.push(r.message[i]);
+       }
+       repair_bin();
+    });
+}
+
+function repair_bin(){
+   if(binidx >= 10) {
+       args = {'msg': msg, 'subject': 'Item Quantity'};
+       $c_obj('Reposting Tool', 'send_mail', docstring(args));
+       alert('Completed');
+       return;
+  }
+  repair_single_bin();
+  binidx ++;
+}
+
+// Batch for Account Balances
+//======================================================
+var acc_list = [];
+var accidx = 0;
+cur_frm.cscript['Repost Account Balances'] = function(doc,cdt,cdn) {
+  args = {'check': 'Account Balance'};
+  $c_obj('Reposting Tool','get_count_for_reposting', docstring(args), function(r,rt) {
+       acc_list = r.message;
+       repair_acc_bal();
+    });
+} 
+
+function repair_single_acc_bal(){
+  $c_obj('Reposting Tool', 'repair_acc_bal', cstr(acc_list[accidx]), function(r,rt) {
+       for(i = 0; i < r.message.length; i++){
+         msg.push(r.message[i]);
+       }
+       repair_acc_bal();
+    });
+}
+
+function repair_acc_bal(){
+  if(accidx >= 15) {
+     args = {'msg' : msg, 'subject': 'Account Balance'};
+     $c_obj('Reposting Tool', 'send_mail', docstring(args));
+     alert('Completed');
+     return;
+  }
+  repair_single_acc_bal();
+  accidx ++;
+}
\ No newline at end of file
diff --git a/tools/doctype/reposting_tool/reposting_tool.py b/tools/doctype/reposting_tool/reposting_tool.py
new file mode 100644
index 0000000..9560650
--- /dev/null
+++ b/tools/doctype/reposting_tool/reposting_tool.py
@@ -0,0 +1,156 @@
+# 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
+    self.msg = []
+
+  def get_count_for_reposting(self, args):
+    args = eval(args)
+    if args['check'] == 'Bin':
+      return [d[0] for d in sql("select name from `tabBin` where item_code = 'Repost Item' " )]
+
+    if args['check'] == 'Account Balance':
+      # message
+      if not self.doc.past_year:
+        msgprint('<div style="color: ORANGE"> Warning: Opening balances were not imported </div>')
+
+      # do not repost from same year
+      if self.doc.past_year == self.doc.name:
+        msgprint("Cannot import from the current year")
+ 
+      return [d[0] for d in sql("select name from `tabAccount` ")]
+
+  def get_bin_qty(self, wh, item):
+    # get actual_qty
+    act_qty = sql("select ifnull(actual_qty, 0) from `tabBin` where warehouse = '%s' and item_code = '%s'" % (wh, item))
+    act_qty = act_qty and flt(act_qty[0][0]) or 0
+
+    # get indented_qty 
+    ind_qty = sql("select sum(if( ifnull(t2.qty, 0) > ifnull(t2.ordered_qty, 0), ifnull(t2.qty, 0) - ifnull(t2.ordered_qty, 0), 0) ) from `tabIndent` t1, `tabIndent Detail`t2 where t1.name = t2.parent and t1.docstatus = 1 and t2.warehouse = '%s' and t2.item_code = '%s'" % (wh, item))
+    ind_qty = ind_qty and flt(ind_qty[0][0]) or 0
+    
+    # get ordered_qty
+    ord_qty = sql("select sum(if ( ifnull(t2.qty, 0) > ifnull(t2.received_qty, 0), (ifnull(t2.qty, 0) - ifnull(t2.received_qty, 0)) * ifnull(t2.conversion_factor, 0) , 0) ) from `tabPurchase Order` t1, `tabPO Detail` t2 where t1.name = t2.parent and t1.docstatus = 1 and t2.warehouse = '%s' and t2.item_code = '%s'" % (wh, item))
+    ord_qty = ord_qty and flt(ord_qty[0][0]) or 0
+
+    # get reserved_qty
+    res_qty =sql("select sum(if ( ifnull(t2.qty, 0) > ifnull(t2.delivered_qty, 0), ifnull(t2.qty, 0) - ifnull(t2.delivered_qty, 0) , 0) ) from `tabSales Order` t1, `tabSales Order Detail` t2 where  t1.name = t2.parent and t1.docstatus = 1 and t2.reserved_warehouse = '%s' and t2.item_code = '%s' " % (wh, item))
+    res_qty = res_qty and flt(res_qty[0][0]) or 0
+
+    # get planned_qty 
+    plan_qty = sql("select sum(if ( ifnull(qty, 0) > ifnull(produced_qty,0), ifnull(qty, 0) - ifnull(produced_qty, 0), 0) ) from `tabProduction Order` where fg_warehouse = '%s' and production_item = '%s' and docstatus = 1" % (wh, item))
+    plan_qty = plan_qty and flt(plan_qty[0][0]) or 0
+
+    return {'actual_qty': act_qty, 'indented_qty': ind_qty, 'ordered_qty': ord_qty, 'reserved_qty': res_qty, 'planned_qty': plan_qty }
+
+  def check_bin_qty(self, bin_obj, qty_dict):
+    label_dict = {'actual_qty': 'Actual Qty', 'indented_qty': 'Indent Qty', 'ordered_qty': 'Ordered Qty', 'reserved_qty': 'Reserved Qty', 'planned_qty': 'Planned Qty'}
+    for f in qty_dict:
+      if flt(bin_obj.doc.fields[f]) != qty_dict[f]:
+        msgprint('<div style="color: RED"> Difference found in %s for Item:= %s and Warehouse:= %s (Before : %s; After : %s)</div>' % (label_dict[f], bin_obj.doc.item_code, bin_obj.doc.warehouse, cstr(bin_obj.doc.fields[f]), cstr(qty_dict[f])))
+        self.msg.append('<div style="color: RED"> Difference found in %s for Item:= %s and Warehouse:= %s (Before : %s; After : %s)</div>' % (label_dict[f], bin_obj.doc.item_code, bin_obj.doc.warehouse, cstr(bin_obj.doc.fields[f]), cstr(qty_dict[f])))
+    
+    # Check projected qty
+    projected_qty = flt(qty_dict['actual_qty']) + flt(qty_dict['indented_qty']) + flt(qty_dict['ordered_qty']) + flt(qty_dict['planned_qty']) - flt(qty_dict['reserved_qty'])
+    if flt(projected_qty) != flt(bin_obj.doc.projected_qty):
+      msgprint('<div style="color: RED">Difference found in Projected Qty for Item:= %s and Warehouse:= %s (Before : %s; After : %s)</div>' % (bin_obj.doc.item_code, bin_obj.doc.warehouse, bin_obj.doc.projected_qty, cstr(projected_qty)))
+      self.msg.append('<div style="color: RED">Difference found in Projected Qty for Item:= %s and Warehouse:= %s (Before : %s; After : %s)</div>' % (bin_obj.doc.item_code, bin_obj.doc.warehouse, bin_obj.doc.projected_qty, cstr(projected_qty)))
+
+  def repair_bin(self, bin):
+    import webnotes
+    bin_obj = get_obj('Bin',bin)
+    bin_act_qty =  flt(bin_obj.doc.actual_qty)
+    try:
+      # udpate actual qty and item valuation
+      bin_obj.update_item_valuation('', '2000-01-01', '00:00')
+      # get bin qty
+      qty_dict = self.get_bin_qty(bin_obj.doc.warehouse, bin_obj.doc.item_code)
+      
+      # check bin qty
+      self.check_bin_qty(bin_obj, qty_dict)
+
+      # update indented_qty, ordered_qty, reserved_qty, planned_qty
+      sql("update `tabBin` set indented_qty = '%s', ordered_qty = '%s', reserved_qty = '%s', planned_qty = '%s' where warehouse = '%s' and item_code = '%s'" % ( flt(qty_dict['indented_qty']), flt(qty_dict['ordered_qty']), flt(qty_dict['reserved_qty']), flt(qty_dict['planned_qty']),  bin_obj.doc.warehouse, bin_obj.doc.item_code))
+ 
+      # update projected_qty
+      sql("update `tabBin` set projected_qty = ifnull(indented_qty, 0) + ifnull(ordered_qty,0) + ifnull(actual_qty, 0) + ifnull(planned_qty, 0) - ifnull(reserved_qty,0) where warehouse = '%s' and item_code = '%s' " % (bin_obj.doc.warehouse, bin_obj.doc.item_code))
+      if not self.msg:
+        msgprint('<div style="color: GREEN"> Reposting of Stock for Item %s and Warehouse %s completed Successfully. </div>' % (bin_obj.doc.item_code, bin_obj.doc.warehouse))
+    except Exception:
+      msgprint('<div style="color: RED"> Handle Item %s and Warehouse %s seprately. </div> <div style="color: RED"> ERROR: %s</div>' % (bin_obj.doc.item_code, bin_obj.doc.warehouse, str(webnotes.utils.getTraceback())))
+      self.msg.append('<div style="color: RED"> ERROR: %s</div>' % (str(webnotes.utils.getTraceback())))
+
+  def repair_opening_bal(self, d, acc_obj, past_yr, fiscal_yr):
+    # check opening balance
+    opbal = sql("select balance from `tabAccount Balance` where account=%s and period = %s", (acc_obj.doc.name, past_yr))
+    if flt(d.opening) != flt(opbal and flt(opbal[0][0]) or 0):
+      msgprint('<div style="color: RED"> Difference found in Opening of Account %s for Period %s in Fiscal Year %s (Before : %s; After : %s) </div>' % (acc_obj.doc.name, d.period, fiscal_yr, flt(d.opening), opbal and flt(opbal[0][0]) or 0)) 
+      self.msg.append('<div style="color: RED"> Difference found in Opening of Account %s for Period %s in Fiscal Year %s (Before : %s; After : %s) </div>'  % (acc_obj.doc.name, d.period, fiscal_yr, flt(d.opening), opbal and flt(opbal[0][0]) or 0))
+      sql("update `tabAccount Balance` set opening = '%s' where period = '%s' and account = '%s' " % (opbal and flt(opbal[0][0]) or 0, fiscal_yr, acc_obj.doc.name))
+
+  def repair_bal(self, d, acc_obj, fiscal_yr):
+    # check balances 
+    ysd = get_value('Fiscal Year', fiscal_yr, 'year_start_date')
+    bal = get_obj('GL Control').get_as_on_balance(acc_obj.doc.name, fiscal_yr, d.end_date, acc_obj.doc.debit_or_credit, acc_obj.doc.is_pl_account, acc_obj.doc.lft, acc_obj.doc.rgt, ysd)
+    if flt(d.balance) != flt(bal):
+      msgprint('<div style="color: RED"> Difference found in Balance of Account %s for Period %s in Fiscal Year %s (Before : %s; After : %s) </div>' % (acc_obj.doc.name, d.period, fiscal_yr, flt(d.balance), flt(bal))) 
+      self.msg.append('<div style="color: RED"> Difference found in Balance of Account %s for Period %s in Fiscal Year %s (Before : %s; After : %s) </div>'  % (acc_obj.doc.name, d.period, fiscal_yr, flt(d.balance), flt(bal)))
+      sql("update `tabAccount Balance` set balance = '%s' where period = '%s' and account = '%s' " % (bal, d.period, acc_obj.doc.name))
+          
+  def repair_acc_bal(self, acc, past_yr = '' , fiscal_yr = ''):
+    # get account obj
+    acc_obj = get_obj('Account', acc, with_children = 1)
+  
+    # get fiscal yr & past yr
+    if not fiscal_yr:
+      import webnotes.utils
+      fiscal_yr = webnotes.utils.get_defaults()['fiscal_year']
+    if not past_yr: past_yr = get_value('Fiscal Year', fiscal_yr, 'past_year')
+
+    # Repair Opening and Balance For Account Balances
+    for d in getlist(acc_obj.doclist, 'account_balances'):
+      if d.fiscal_year == fiscal_yr:
+        if past_yr and (past_yr != fiscal_yr) and d.period == fiscal_yr:
+          self.repair_opening_bal(d, acc_obj, past_yr, fiscal_yr)
+        else:
+          self.repair_bal(d, acc_obj, fiscal_yr)
+
+    # Acknowledge USer
+    if not self.msg:
+      msgprint('<div style="color: GREEN"> Openings & Balances of Account %s for Fiscal Year %s updated successfully. </div>' % ( acc_obj.doc.name, fiscal_yr))
+
+    return self.msg
+  
+  def send_mail(self, args):
+    args = eval(args)
+    self.msg, subject = args['msg'], args['subject']
+    msgprint(self.msg)
+    if self.msg:
+      email_msg = """ Dear Administrator,
+
+In Account := %s User := %s has Reposted %s and following was found:-
+
+%s
+
+""" % (get_value('Control Panel', None,'account_id'), session['user'], subject, '\n'.join(self.msg))
+
+      sendmail(['saumil@iwebnotes.com','nabin@iwebnotes.com'], subject='Repair of ' + cstr(subject), parts = [('text/plain', email_msg)])
diff --git a/tools/doctype/reposting_tool/reposting_tool.txt b/tools/doctype/reposting_tool/reposting_tool.txt
new file mode 100644
index 0000000..9673e3a
--- /dev/null
+++ b/tools/doctype/reposting_tool/reposting_tool.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2010-04-13 09:24:32', 'search_fields': None, 'module': 'Tools', 'doctype': 'DocType', 'change_log': None, 'print_outline': '', 'owner': 'Administrator', 'in_dialog': None, 'in_create': 0, 'read_only': 1, 'allow_email': 1, 'dt_template': None, 'hide_heading': None, 'issingle': 1, 'allow_rename': None, 'smallicon': None, 'allow_attach': None, 'show_in_menu': None, 'max_attachments': None, 'version': 173, 'menu_index': None, 'docstatus': 0, 'allow_copy': 1, 'istable': None, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': 1, 'autoname': None, 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'saumil@webnotestech.com', 'document_type': '', 'name': 'Reposting Tool', 'idx': None, 'hide_toolbar': 1, 'colour': 'Light Blue:DEF', 'client_script': None, 'modified': '2010-10-14 12:15:59', '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': 'saumil@webnotestech.com', 'name': 'PERM00769', 'parent': 'Reposting Tool', 'read': 1, 'create': 1, 'creation': '2010-04-13 09:24:32', 'modified': '2010-10-14 12:15:59', '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': None, 'creation': '2010-04-13 09:24:32', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'saumil@webnotestech.com', 'label': 'Recalculate MAR & Actual Qty', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Reposting Tool', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04638', 'idx': 1, 'default': None, 'colour': None, 'modified': '2010-10-14 12:15:59', 'parenttype': 'DocType', 'fieldname': 'recalculate_mar_&_actual_qty', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': None, 'creation': '2010-07-28 13:34:48', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'jai@webnotestech.com', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'saumil@webnotestech.com', 'label': 'Repost Bin', 'width': None, 'trigger': 'Client', 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Reposting Tool', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL05722', 'idx': 2, 'default': None, 'colour': 'White:FFF', 'modified': '2010-10-14 12:15:59', 'parenttype': 'DocType', 'fieldname': None, 'fieldtype': 'Button', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': None, 'creation': '2010-07-30 09:22:26', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'jai@webnotestech.com', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'saumil@webnotestech.com', 'label': 'Repost Account Balances', 'width': None, 'trigger': 'Client', 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Reposting Tool', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL05758', 'idx': 3, 'default': None, 'colour': None, 'modified': '2010-10-14 12:15:59', 'parenttype': 'DocType', 'fieldname': None, 'fieldtype': 'Button', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/sms_control/__init__.py b/tools/doctype/sms_control/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/sms_control/__init__.py
diff --git a/tools/doctype/sms_control/sms_control.js b/tools/doctype/sms_control/sms_control.js
new file mode 100644
index 0000000..c6cc53e
--- /dev/null
+++ b/tools/doctype/sms_control/sms_control.js
@@ -0,0 +1,93 @@
+function SMSManager() {
+	var me = this;
+	this.get_contact_number = function(contact, key, value) {
+		$c_obj('SMS Control', 'get_contact_number', {
+				contact_name:contact, 
+				value:value,
+				key:key
+			}, function(r,rt) {
+				if(r.exc) { msgprint(r.exc); return; }
+				me.number = r.message;
+				me.show_dialog();
+			}
+		);
+	}
+	this.show = function(contact, key, value, mobile_nos, message) {
+		this.message = message;
+		if (mobile_nos) {
+
+			me.number = mobile_nos;
+			me.show_dialog();
+		} else if (contact){
+			this.get_contact_number(contact, key, value)
+		} else {
+			me.show_dialog();
+		}
+	}
+	this.show_dialog = function() {
+		if(!me.dialog) 
+			me.make_dialog();
+		me.dialog.set_values({
+			'message': me.message,
+			'number': me.number
+		})
+		me.dialog.show();
+	}
+	this.make_dialog = function() {
+		var d = new wn.widgets.Dialog({
+			title: 'Send SMS',
+			width: 400,
+			fields: [
+				{fieldname:'number', fieldtype:'Data', label:'Mobile Number', reqd:1},
+				{fieldname:'message', fieldtype:'Text', label:'Message', reqd:1},
+				{fieldname:'send', fieldtype:'Button', label:'Send'}
+			]
+		})
+		d.make();
+		d.fields_dict.send.input.onclick = function() {
+			var btn = d.fields_dict.send.input;
+			var v = me.dialog.get_values();
+			if(v) {
+				btn.set_working();
+				$c_obj('SMS Control', 'send_form_sms', v, function(r,rt) {
+					btn.done_working();
+					if(r.exc) {msgprint(r.exc); return; }
+					msgprint('Message Sent');
+					me.dialog.hide();
+				})
+			}
+		}
+		this.dialog = d;
+	}
+}
+
+cur_frm.cscript['Send SMS'] = function(doc,dt,dn) {
+	var doc = cur_frm.doc;
+	var sms_man = new SMSManager();
+	var default_msg = {
+		'Lead'				: '',
+		'Enquiry'			: 'Your enquiry has been logged into the system. Ref No: ' + doc.name,
+		'Quotation'			: 'Quotation ' + doc.name + ' has been sent via email. Thanks!',
+		'Sales Order'		: 'Sales Order ' + doc.name + ' has been created against ' 
+					+ (doc.quotation_no ? ('Quote No:' + doc.quotation_no) : '')
+					+ (doc.po_no ? (' for your PO: ' + doc.po_no) : ''),
+		'Delivery Note'		: 'Items has been delivered against delivery note: ' + doc.name
+					+ (doc.po_no ? (' for your PO: ' + doc.po_no) : ''),		
+		'Receivable Voucher': 'Invoice ' + doc.name + ' has been sent via email '
+					+ (doc.po_no ? (' for your PO: ' + doc.po_no) : ''),
+		'Indent'			: 'Indent ' + doc.name + ' has been raised in the system',
+		'Purchase Order'	: 'Purchase Order ' + doc.name + ' has been sent via email',
+		'Purchase Receipt'	: 'Items has been received against purchase receipt: ' + doc.name
+	}
+
+	if (in_list(['Quotation', 'Sales Order', 'Delivery Note', 'Receivable Voucher'], doc.doctype))
+		sms_man.show(doc.contact_person, 'customer', doc.customer, '', default_msg[doc.doctype]);
+	else if (in_list(['Purchase Order', 'Purchase Receipt'], doc.doctype))
+		sms_man.show(doc.contact_person, 'supplier', doc.supplier, '', default_msg[doc.doctype]);
+	else if (doc.doctype == 'Lead')
+		sms_man.show('', '', '', doc.mobile_no, default_msg[doc.doctype]);
+	else if (doc.doctype == 'Enquiry')
+		sms_man.show('', '', '', doc.contact_no, default_msg[doc.doctype]);
+	else if (doc.doctype == 'Indent')
+		sms_man.show('', '', '', '', default_msg[doc.doctype]);
+}
diff --git a/tools/doctype/sms_control/sms_control.py b/tools/doctype/sms_control/sms_control.py
new file mode 100644
index 0000000..de11e90
--- /dev/null
+++ b/tools/doctype/sms_control/sms_control.py
@@ -0,0 +1,190 @@
+# Please edit this list and import only required elements
+import webnotes
+
+from webnotes.utils import cint, flt, load_json, nowdate, cstr
+from webnotes.model.code import get_obj
+from webnotes.model.doc import Document
+from webnotes import session, msgprint
+from webnotes.model.doclist import getlist, copy_doclist
+
+sql = webnotes.conn.sql
+get_value = webnotes.conn.get_value
+	
+# -----------------------------------------------------------------------------------------
+class DocType:
+	def __init__(self, doc, doclist=[]):
+		self.doc = doc
+		self.doclist = doclist
+
+	# validate receiver numbers
+	# =========================================================
+	def validate_receiver_nos(self,receiver_list):
+		validated_receiver_list = []
+		for d in receiver_list:
+			# remove invalid character
+			invalid_char_list = [' ', '+', '-', '(', ')']
+			for x in invalid_char_list:
+				d = d.replace(x, '')
+
+			# mobile no validation for erpnext gateway
+			if get_value('SMS Settings', None, 'sms_gateway_url'):
+				mob_no = d
+			else:
+				if not d.startswith("0") and len(d) == 10:
+					mob_no = "91" + d
+				elif d.startswith("0") and len(d) == 11:
+					mob_no = "91" + d[1:]
+				elif len(d) == 12:
+					mob_no = d
+				else:
+					msgprint("Invalid mobile no : " + cstr(d))
+					raise Exception
+
+				if not mob_no.isdigit():
+					msgprint("Invalid mobile no : " + cstr(mob_no))
+					raise Exception
+
+			validated_receiver_list.append(mob_no)
+
+		if not validated_receiver_list:
+			msgprint("Please enter valid mobile nos")
+			raise Exception
+
+		return validated_receiver_list
+
+
+	# Connect Gateway
+	# =========================================================
+	def connect_gateway(self):
+		"login to gateway"
+		from webnotes.utils.webservice import FrameworkServer
+		fw = FrameworkServer('www.erpnext.com','/','__system@webnotestech.com','password',https=1)
+		return fw
+
+	def get_sender_name(self):
+		"returns name as SMS sender"
+		return webnotes.conn.get_value('Manage Account', None, 'sms_sender_name') or 'ERPNext'
+	
+	def get_contact_number(self, arg):
+		"returns mobile number of the contact"
+		args = load_json(arg)
+		number = sql('select mobile_no, phone from tabContact where name=%s and %s=%s' % ('%s', args['key'], '%s'),\
+			(args['contact_name'], args['value']))
+		return number and (number[0][0] or number[0][1]) or ''
+	
+	def send_form_sms(self, arg):
+		"called from client side"
+		args = load_json(arg)
+		self.send_sms([str(args['number'])], str(args['message']))
+
+ 
+	# Send SMS
+	# =========================================================
+	def send_sms(self, receiver_list, msg, sender_name = ''):
+		receiver_list = self.validate_receiver_nos(receiver_list)
+
+		arg = { 'account_name'	: webnotes.conn.get_value('Control Panel',None,'account_id'),
+				'receiver_list' : receiver_list,
+				'message'		: msg,
+				'sender_name'	: sender_name or self.get_sender_name()
+			}
+
+		# personalized or erpnext gateway
+		if get_value('SMS Settings', None, 'sms_gateway_url'):
+			ret = self.send_via_personalized_gateway(arg)
+			msgprint(ret)
+		else:
+			ret = self.send_via_erpnext_gateway(arg)
+
+	# Send sms via personalized gateway
+	# ==========================================================
+	def send_via_personalized_gateway(self, arg):
+		ss = get_obj('SMS Settings', 'SMS Settings', with_children=1)
+		args = {ss.doc.message_parameter : arg.get('message')}
+		for d in getlist(ss.doclist, 'static_parameter_details'):
+			args[d.parameter] = d.value
+		
+		resp = []
+		for d in arg.get('receiver_list'):
+			args[ss.doc.receiver_parameter] = d
+			resp.append(self.send_request(ss.doc.sms_gateway_url, args))
+
+		return resp
+
+	# Send sms via ERPNext gateway
+	# ==========================================================
+	def send_via_erpnext_gateway(self, arg):
+		fw = self.connect_gateway()
+		ret = fw.run_method(method = 'erpnext_utils.sms_control.send_sms', args = arg)
+
+		if ret.get('exc'):
+			msgprint(ret['exc'])
+			raise Exception
+		elif ret['message']:
+			sms_sent = cint(ret['message']['sms_sent'])
+			sms_bal = cint(ret['message']['sms_balance'])
+			self.create_sms_log(arg, ret['message']['sms_sent'])
+
+			if not sms_sent:
+				if sms_bal < len(arg['receiver_list']):
+					msgprint("You do not have enough SMS balance. Current SMS Balance: " + cstr(sms_bal) + "\nYou can send mail to sales@erpnext.com to buy additional sms packages")
+					raise Exception
+				else:
+					msgprint("Message sent failed. May be numbers are invalid or some other issues.")
+			else:
+				msgprint(cstr(sms_sent) + " message sucessfully sent!\nCurrent SMS Balance: " + cstr(cint(ret['message']['sms_balance']) - cint(ret['message']['sms_sent'])))
+
+
+	# Send Request
+	# =========================================================
+	def send_request(self, gateway_url, args):
+		import httplib, urllib
+		server, api_url = self.scrub_gateway_url(gateway_url)
+		conn = httplib.HTTPConnection(server)  # open connection
+		headers = {}
+		headers['Accept'] = "text/plain, text/html, */*"
+		conn.request('GET', api_url + urllib.urlencode(args), headers = headers)    # send request
+		resp = conn.getresponse()     # get response
+		resp = resp.read()
+		return resp
+
+	# Split gateway url to server and api url
+	# =========================================================
+	def scrub_gateway_url(self, url):
+		url = url.replace('http://', '').strip().split('/')
+		server = url.pop(0)
+		api_url = '/' + '/'.join(url)
+		if not api_url.endswith('?'):
+			api_url += '?'
+		return server, api_url
+
+		
+
+
+	# Create SMS Log
+	# =========================================================
+	def create_sms_log(self, arg, sent_sms):
+		sl = Document('SMS Log')
+		sl.sender_name = arg['sender_name']
+		sl.sent_on = nowdate()
+		sl.receiver_list = cstr(arg['receiver_list'])
+		sl.message = arg['message']
+		sl.no_of_requested_sms = len(arg['receiver_list'])
+		sl.no_of_sent_sms = sent_sms
+		sl.save(new=1)
+
+	# Get SMS Balance
+	# =========================================================
+	def get_sms_balance(self):
+		arg = { 'account_name'	: webnotes.conn.get_value('Control Panel',None,'account_id') }
+		if get_value('SMS Settings', None, 'sms_gateway_url'):
+			ret = {}
+		else:
+			fw = self.connect_gateway()
+			ret = fw.run_method(mothod = 'erpnext_utils.sms_control.get_sms_balance', args = arg)
+
+		if ret.get('exc'):
+			msgprint(ret['exc'])
+			raise Exception
+		else:
+			msgprint("Current SMS Balance: " + cstr(ret['message']) + "\nYou can send mail to sales@erpnext.com to buy sms packages")
diff --git a/tools/doctype/sms_control/sms_control.txt b/tools/doctype/sms_control/sms_control.txt
new file mode 100644
index 0000000..727d41b
--- /dev/null
+++ b/tools/doctype/sms_control/sms_control.txt
@@ -0,0 +1,101 @@
+[
+	{
+		'allow_attach': None,
+		'allow_copy': None,
+		'allow_email': None,
+		'allow_print': None,
+		'allow_rename': None,
+		'allow_trash': None,
+		'autoname': None,
+		'change_log': None,
+		'client_script': None,
+		'client_script_core': None,
+		'client_string': None,
+		'colour': 'White:FFF',
+		'creation': '2010-08-08 17:09:24',
+		'description': None,
+		'docstatus': 0,
+		'doctype': 'DocType',
+		'document_type': None,
+		'dt_template': None,
+		'hide_heading': None,
+		'hide_toolbar': None,
+		'idx': None,
+		'in_create': 0,
+		'in_dialog': None,
+		'is_transaction_doc': None,
+		'issingle': 1,
+		'istable': None,
+		'max_attachments': None,
+		'menu_index': None,
+		'modified': '2011-04-08 16:53:02',
+		'modified_by': 'Administrator',
+		'module': 'Tools',
+		'name': 'SMS Control',
+		'name_case': None,
+		'owner': 'Administrator',
+		'parent': None,
+		'parent_node': '',
+		'parentfield': None,
+		'parenttype': None,
+		'print_outline': None,
+		'read_only': None,
+		'read_only_onload': None,
+		'search_fields': None,
+		'section_style': 'Simple',
+		'server_code': None,
+		'server_code_compiled': None,
+		'server_code_core': None,
+		'server_code_error': ' ',
+		'show_in_menu': 0,
+		'smallicon': None,
+		'use_template': None,
+		'version': 4
+	},
+	{
+		'amend': None,
+		'cancel': None,
+		'create': 1,
+		'creation': '2010-08-08 17:09:24',
+		'docstatus': 0,
+		'doctype': 'DocPerm',
+		'execute': None,
+		'idx': 1,
+		'match': None,
+		'modified': '2011-04-08 16:53:02',
+		'modified_by': 'Administrator',
+		'name': 'PERM00534',
+		'owner': 'Administrator',
+		'parent': 'SMS Control',
+		'parentfield': 'permissions',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'read': 1,
+		'role': 'Administrator',
+		'submit': None,
+		'write': 1
+	},
+	{
+		'amend': None,
+		'cancel': None,
+		'create': None,
+		'creation': '2010-08-08 17:09:24',
+		'docstatus': 0,
+		'doctype': 'DocPerm',
+		'execute': None,
+		'idx': 2,
+		'match': None,
+		'modified': '2011-04-08 16:53:02',
+		'modified_by': 'Administrator',
+		'name': 'PERM00535',
+		'owner': 'Administrator',
+		'parent': 'SMS Control',
+		'parentfield': 'permissions',
+		'parenttype': 'DocType',
+		'permlevel': 1,
+		'read': 1,
+		'role': 'Administrator',
+		'submit': None,
+		'write': None
+	}
+]
\ No newline at end of file
diff --git a/tools/doctype/sms_log/__init__.py b/tools/doctype/sms_log/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/sms_log/__init__.py
diff --git a/tools/doctype/sms_log/sms_log.txt b/tools/doctype/sms_log/sms_log.txt
new file mode 100644
index 0000000..d53835b
--- /dev/null
+++ b/tools/doctype/sms_log/sms_log.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2011-01-11 12:28:39', 'search_fields': None, 'module': 'Tools', 'doctype': 'DocType', 'change_log': None, 'print_outline': None, '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': 0, 'max_attachments': None, 'version': 4, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': 'SMSLOG/.########', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'SMS Log', 'idx': None, 'hide_toolbar': None, 'colour': 'White:FFF', 'client_script': None, 'modified': '2011-01-11 12:51:46', 'server_code_error': None, 'name_case': None, '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': 'PERM00792', 'parent': 'SMS Log', 'read': 1, 'create': 0, 'creation': '2011-01-11 12:28:58', 'modified': '2011-01-11 12:51:46', 'submit': None, 'doctype': 'DocPerm', 'write': 0, 'idx': 1, 'parenttype': 'DocType', 'role': 'System Manager', 'owner': 'Administrator', 'docstatus': 0, 'permlevel': 0, 'match': None, 'parentfield': 'permissions'}, {'no_copy': None, 'oldfieldtype': None, 'creation': '2011-01-11 12:28:40', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': None, 'width': '50%', 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'SMS Log', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04405', 'idx': 1, 'default': None, 'colour': None, 'modified': '2011-01-11 12:51:46', 'parenttype': 'DocType', 'fieldname': None, 'fieldtype': 'Column Break', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': None, 'creation': '2011-01-11 12:28:40', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Sender Name', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'SMS Log', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04399', 'idx': 2, 'default': None, 'colour': None, 'modified': '2011-01-11 12:51:46', 'parenttype': 'DocType', 'fieldname': 'sender_name', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': None, 'creation': '2011-01-11 12:28:40', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Sent On', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'SMS Log', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04400', 'idx': 3, 'default': None, 'colour': None, 'modified': '2011-01-11 12:51:46', 'parenttype': 'DocType', 'fieldname': 'sent_on', 'fieldtype': 'Date', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': None, 'creation': '2011-01-11 12:28:40', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Receiver List', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'SMS Log', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04401', 'idx': 4, 'default': None, 'colour': None, 'modified': '2011-01-11 12:51:46', 'parenttype': 'DocType', 'fieldname': 'receiver_list', 'fieldtype': 'Small Text', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': None, 'creation': '2011-01-11 12:28:40', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': None, 'width': '50%', 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'SMS Log', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04406', 'idx': 5, 'default': None, 'colour': None, 'modified': '2011-01-11 12:51:46', 'parenttype': 'DocType', 'fieldname': None, 'fieldtype': 'Column Break', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': None, 'creation': '2011-01-11 12:28:40', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'No of Requested SMS', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'SMS Log', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04403', 'idx': 6, 'default': None, 'colour': None, 'modified': '2011-01-11 12:51:46', 'parenttype': 'DocType', 'fieldname': 'no_of_requested_sms', 'fieldtype': 'Int', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': None, 'creation': '2011-01-11 12:28:40', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'No of Sent SMS', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'SMS Log', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04404', 'idx': 7, 'default': None, 'colour': None, 'modified': '2011-01-11 12:51:46', 'parenttype': 'DocType', 'fieldname': 'no_of_sent_sms', 'fieldtype': 'Int', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': None, 'creation': '2011-01-11 12:28:40', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Message', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'SMS Log', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL04402', 'idx': 8, 'default': None, 'colour': None, 'modified': '2011-01-11 12:51:46', 'parenttype': 'DocType', 'fieldname': 'message', 'fieldtype': 'Small Text', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/todo_item/__init__.py b/tools/doctype/todo_item/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/todo_item/__init__.py
diff --git a/tools/doctype/todo_item/todo_item.txt b/tools/doctype/todo_item/todo_item.txt
new file mode 100644
index 0000000..d3d014c
--- /dev/null
+++ b/tools/doctype/todo_item/todo_item.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2009-03-12 12:01:55', 'search_fields': None, 'module': 'Tools', 'doctype': 'DocType', 'change_log': None, 'print_outline': '', 'owner': 'Administrator', 'in_dialog': None, 'in_create': 1, 'read_only': 1, 'allow_email': None, 'dt_template': None, 'hide_heading': None, 'issingle': None, 'allow_rename': None, 'smallicon': '', 'allow_attach': None, 'show_in_menu': 0, 'max_attachments': None, 'version': 9, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': '', 'allow_trash': None, 'allow_print': None, 'autoname': 'TDI.########', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'ToDo Item', 'idx': None, 'hide_toolbar': None, 'colour': 'White:FFF', 'client_script': '', 'modified': '2010-09-20 14:06:57', 'server_code_error': ' ', 'name_case': '', 'parenttype': None, 'read_only_onload': None, 'server_code_core': '', 'server_code_compiled': None, 'parent_node': None, 'parentfield': None}, {'cancel': None, 'amend': None, 'execute': None, 'modified_by': 'Administrator', 'name': 'PERM00019', 'parent': 'ToDo Item', 'read': 1, 'create': 1, 'creation': '2009-03-12 12:01:57', 'modified': '2010-05-06 18:12:29', 'submit': None, 'doctype': 'DocPerm', 'write': 1, 'idx': 1, 'parenttype': 'DocType', 'role': 'All', 'owner': 'Administrator', 'docstatus': 0, 'permlevel': None, 'match': None, 'parentfield': 'permissions'}, {'no_copy': None, 'oldfieldtype': 'Text', 'creation': '2009-03-12 12:01:57', 'doctype': 'DocField', 'oldfieldname': 'description', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Description', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'ToDo Item', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL00227', 'idx': 1, 'default': None, 'colour': None, 'modified': '2010-05-06 18:12:29', 'parenttype': 'DocType', 'fieldname': 'description', 'fieldtype': 'Text', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Date', 'creation': '2009-03-12 12:01:57', 'doctype': 'DocField', 'oldfieldname': 'date', 'owner': 'Administrator', 'reqd': 0, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Date', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'ToDo Item', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL00228', 'idx': 2, 'default': None, 'colour': None, 'modified': '2010-05-06 18:12:29', 'parenttype': 'DocType', 'fieldname': 'date', 'fieldtype': 'Date', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-03-12 12:01:57', 'doctype': 'DocField', 'oldfieldname': 'priority', 'owner': 'Administrator', 'reqd': 0, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Priority', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'ToDo Item', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL00229', 'idx': 3, 'default': None, 'colour': None, 'modified': '2010-05-06 18:12:29', 'parenttype': 'DocType', 'fieldname': 'priority', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-03-12 12:01:57', 'doctype': 'DocField', 'oldfieldname': 'reference_type', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Reference Type', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'ToDo Item', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL00230', 'idx': 4, 'default': None, 'colour': None, 'modified': '2010-05-06 18:12:29', 'parenttype': 'DocType', 'fieldname': 'reference_type', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-03-12 12:01:57', 'doctype': 'DocField', 'oldfieldname': 'reference_name', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Reference Name', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'ToDo Item', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL00231', 'idx': 5, 'default': None, 'colour': None, 'modified': '2010-05-06 18:12:29', 'parenttype': 'DocType', 'fieldname': 'reference_name', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Check', 'creation': '2009-03-12 12:01:57', 'doctype': 'DocField', 'oldfieldname': 'checked', 'owner': 'Administrator', 'reqd': 0, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Checked', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'ToDo Item', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL00232', 'idx': 6, 'default': None, 'colour': None, 'modified': '2010-05-06 18:12:29', 'parenttype': 'DocType', 'fieldname': 'checked', 'fieldtype': 'Check', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Link', 'creation': '2009-03-12 12:01:57', 'doctype': 'DocField', 'oldfieldname': 'role', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Role', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'ToDo Item', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL00233', 'idx': 7, 'default': None, 'colour': None, 'modified': '2010-05-06 18:12:29', 'parenttype': 'DocType', 'fieldname': 'role', 'fieldtype': 'Link', 'options': 'Role', 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/trash_control/__init__.py b/tools/doctype/trash_control/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/trash_control/__init__.py
diff --git a/tools/doctype/trash_control/trash_control.py b/tools/doctype/trash_control/trash_control.py
new file mode 100644
index 0000000..644a278
--- /dev/null
+++ b/tools/doctype/trash_control/trash_control.py
@@ -0,0 +1,59 @@
+# 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
+
+  
+  # Get Masters
+  # -----------
+  def get_masters(self):
+    mlist = []
+    res = sql("select distinct t1.name from tabDocType t1, tabDocPerm t2 where ifnull(t1.allow_trash, 0) = 1 and (ifnull(t2.write, 0) = 1 or ifnull(t2.create, 0) = 1) and t2.role in %s and t2.parent = t1.name and t1.module not in ('DocType','Application Internal','Recycle Bin','Development','Testing','Testing System','Test') ORDER BY t1.name" % cstr(tuple(webnotes.user.get_roles())))
+    for r in res:
+      mlist.append(r[0])
+    return mlist
+
+
+  # Get Trash Records
+  # -----------------
+  def get_trash_records(self, mast_name):
+    mlist = []
+    rec_dict = {}
+    if mast_name == 'All':
+      mlist = self.get_masters()
+    else:
+      mlist.append(mast_name)
+    for i in mlist:
+      rec = [r[0] for r in sql("select name from `tab%s` where docstatus = 2" % i)]
+      if rec:
+        rec_dict[i] = rec
+    return rec_dict
+
+
+  # Restore Records
+  # ---------------
+  def restore_records(self, arg):
+    arg = eval(arg)
+    for k in arg:
+      for r in arg[k]:
+        sql("update `tab%s` set docstatus = 0, modified = '%s', trash_reason = '' where name = '%s'" % (k, now(), r))
+        dt_obj = get_obj(k,r)
+        if hasattr(dt_obj, 'on_restore'): dt_obj.on_restore()
\ No newline at end of file
diff --git a/tools/doctype/trash_control/trash_control.txt b/tools/doctype/trash_control/trash_control.txt
new file mode 100644
index 0000000..b38d5a2
--- /dev/null
+++ b/tools/doctype/trash_control/trash_control.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2010-04-19 09:59:18', 'search_fields': None, 'module': 'Tools', 'doctype': 'DocType', 'change_log': None, 'print_outline': '', 'owner': 'Administrator', 'in_dialog': None, 'in_create': 1, 'read_only': 1, 'allow_email': None, 'dt_template': None, 'hide_heading': None, 'issingle': 1, 'allow_rename': None, 'smallicon': '', 'allow_attach': None, 'show_in_menu': None, 'max_attachments': None, 'version': 37, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': None, 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'saumil@webnotestech.com', 'document_type': '', 'name': 'Trash Control', 'idx': None, 'hide_toolbar': None, 'colour': 'White:FFF', 'client_script': None, 'modified': '2010-10-13 16:35:49', 'server_code_error': ' ', 'name_case': '', 'parenttype': None, 'read_only_onload': None, 'server_code_core': None, 'server_code_compiled': None, 'parent_node': None, 'parentfield': None}]
\ No newline at end of file
diff --git a/tools/doctype/tweet/__init__.py b/tools/doctype/tweet/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/tweet/__init__.py
diff --git a/tools/doctype/tweet/tweet.txt b/tools/doctype/tweet/tweet.txt
new file mode 100644
index 0000000..5478912
--- /dev/null
+++ b/tools/doctype/tweet/tweet.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2009-05-13 12:23:54', 'search_fields': None, 'module': 'Tools', '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': '', 'allow_attach': None, 'show_in_menu': 0, 'max_attachments': None, 'version': 6, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': 'TW.######', 'client_script_core': '', 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'Tweet', 'idx': None, 'hide_toolbar': None, 'colour': 'White:FFF', 'client_script': None, 'modified': '2010-09-17 12:48:20', 'server_code_error': None, 'name_case': '', 'parenttype': None, 'read_only_onload': None, 'server_code_core': '', 'server_code_compiled': None, 'parent_node': None, 'parentfield': None}, {'cancel': None, 'amend': None, 'execute': None, 'modified_by': 'Administrator', 'name': 'PERM00289', 'parent': 'Tweet', 'read': 1, 'create': None, 'creation': '2009-05-13 12:23:54', 'modified': '2010-03-31 10:23:27', 'submit': None, 'doctype': 'DocPerm', 'write': None, 'idx': 1, 'parenttype': 'DocType', 'role': 'Administrator', 'owner': 'Administrator', 'docstatus': 0, 'permlevel': 0, 'match': None, 'parentfield': 'permissions'}, {'no_copy': None, 'oldfieldtype': 'Link', 'creation': '2009-05-13 12:23:54', 'doctype': 'DocField', 'oldfieldname': 'by', 'owner': 'Administrator', 'reqd': None, 'in_filter': 1, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'By', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Tweet', 'search_index': 1, 'allow_on_submit': None, 'icon': None, 'name': 'FL02041', 'idx': 1, 'default': None, 'colour': None, 'modified': '2010-03-31 10:23:27', 'parenttype': 'DocType', 'fieldname': 'by', 'fieldtype': 'Link', 'options': 'Profile', 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Text', 'creation': '2009-05-13 12:23:54', 'doctype': 'DocField', 'oldfieldname': 'comment', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Comment', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Tweet', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL02042', 'idx': 2, 'default': None, 'colour': None, 'modified': '2010-03-31 10:23:27', 'parenttype': 'DocType', 'fieldname': 'comment', 'fieldtype': 'Text', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-08-26 01:31:48', 'doctype': 'DocField', 'oldfieldname': 'tag', 'owner': 'Administrator', 'reqd': None, 'in_filter': 1, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Tag', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Tweet', 'search_index': 1, 'allow_on_submit': None, 'icon': None, 'name': 'FL02712', 'idx': 3, 'default': None, 'colour': None, 'modified': '2010-03-31 10:23:27', 'parenttype': 'DocType', 'fieldname': 'tag', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/while_you_were_out/__init__.py b/tools/doctype/while_you_were_out/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/while_you_were_out/__init__.py
diff --git a/tools/doctype/while_you_were_out/while_you_were_out.txt b/tools/doctype/while_you_were_out/while_you_were_out.txt
new file mode 100644
index 0000000..7dc7ccb
--- /dev/null
+++ b/tools/doctype/while_you_were_out/while_you_were_out.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2010-01-08 17:28:22', 'search_fields': None, 'module': 'Tools', 'doctype': 'DocType', 'change_log': None, 'print_outline': '', 'owner': 'dhanalekshmi@webnotestech.com', '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': 0, 'max_attachments': None, 'version': 12, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': 'WYWR/.####', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'While You Were Out', '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': 'PERM00569', 'parent': 'While You Were Out', 'read': 1, 'create': 1, 'creation': '2010-01-08 17:28:22', 'modified': '2010-03-31 09:47:12', 'submit': None, 'doctype': 'DocPerm', 'write': 1, 'idx': 1, 'parenttype': 'DocType', 'role': 'Administrator', 'owner': 'dhanalekshmi@webnotestech.com', 'docstatus': 0, 'permlevel': 0, 'match': None, 'parentfield': 'permissions'}, {'no_copy': None, 'oldfieldtype': 'Section Break', 'creation': '2010-01-08 17:28:22', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'dhanalekshmi@webnotestech.com', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'While You Were Out', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'While You Were Out', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03551', 'idx': 1, 'default': None, 'colour': None, 'modified': '2010-03-31 09:47:12', 'parenttype': 'DocType', 'fieldname': None, 'fieldtype': 'Section Break', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2010-01-08 17:28:22', 'doctype': 'DocField', 'oldfieldname': 'from_user', 'owner': 'dhanalekshmi@webnotestech.com', 'reqd': None, 'in_filter': 1, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'From', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'While You Were Out', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03552', 'idx': 2, 'default': '__user', 'colour': None, 'modified': '2010-03-31 09:47:12', 'parenttype': 'DocType', 'fieldname': 'from_user', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Link', 'creation': '2010-01-08 17:28:22', 'doctype': 'DocField', 'oldfieldname': 'to_user', 'owner': 'dhanalekshmi@webnotestech.com', 'reqd': None, 'in_filter': 1, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'To', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'While You Were Out', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03553', 'idx': 3, 'default': None, 'colour': None, 'modified': '2010-03-31 09:47:12', 'parenttype': 'DocType', 'fieldname': 'to_user', 'fieldtype': 'Link', 'options': 'Profile', 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Text', 'creation': '2010-01-08 17:28:22', 'doctype': 'DocField', 'oldfieldname': 'message', 'owner': 'dhanalekshmi@webnotestech.com', 'reqd': None, 'in_filter': 1, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Message', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'While You Were Out', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03554', 'idx': 4, 'default': None, 'colour': None, 'modified': '2010-03-31 09:47:12', 'parenttype': 'DocType', 'fieldname': 'message', 'fieldtype': 'Text', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/wiki_control/__init__.py b/tools/doctype/wiki_control/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/wiki_control/__init__.py
diff --git a/tools/doctype/wiki_control/wiki_control.py b/tools/doctype/wiki_control/wiki_control.py
new file mode 100644
index 0000000..254ca98
--- /dev/null
+++ b/tools/doctype/wiki_control/wiki_control.py
@@ -0,0 +1,32 @@
+# 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 = d
+    self.doclist = dl
+  
+  def get_wiki_detail(self,arg):
+    arg = eval(arg)
+    ret = {}
+    latest_revision = sql("select max(revision) from `tabWiki History` where reference=%s", arg['dn'])[0][0]
+    
+    ret['detail'] = convert_to_lists(sql("select revision, modified_by,creation from `tabWiki History` where reference=%s and revision=%s", (arg['dn'],latest_revision)))
+    ret['contributors'] = convert_to_lists(sql("select distinct modified_by from `tabWiki History` where reference=%s", arg['dn']))
+    return ret
\ No newline at end of file
diff --git a/tools/doctype/wiki_control/wiki_control.txt b/tools/doctype/wiki_control/wiki_control.txt
new file mode 100644
index 0000000..70f6474
--- /dev/null
+++ b/tools/doctype/wiki_control/wiki_control.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2009-12-08 18:08:48', 'search_fields': None, 'module': 'Tools', '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': 1, 'allow_rename': None, 'smallicon': None, 'allow_attach': None, 'show_in_menu': 0, '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': None, 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'Wiki Control', 'idx': None, 'hide_toolbar': None, 'colour': 'White:FFF', 'client_script': None, 'modified': '2010-09-20 14:06:57', 'server_code_error': None, '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': 'PERM00528', 'parent': 'Wiki Control', 'read': None, 'create': None, 'creation': '2009-12-08 18:08:48', 'modified': '2009-12-09 16:57:54', 'submit': None, 'doctype': 'DocPerm', 'write': None, 'idx': 1, 'parenttype': 'DocType', 'role': 'Administrator', 'owner': 'Administrator', 'docstatus': 0, 'permlevel': 0, 'match': None, 'parentfield': 'permissions'}]
\ No newline at end of file
diff --git a/tools/doctype/wiki_history/__init__.py b/tools/doctype/wiki_history/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/wiki_history/__init__.py
diff --git a/tools/doctype/wiki_history/wiki_history.txt b/tools/doctype/wiki_history/wiki_history.txt
new file mode 100644
index 0000000..3bb1fab
--- /dev/null
+++ b/tools/doctype/wiki_history/wiki_history.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2009-12-08 11:22:40', 'search_fields': None, 'module': 'Tools', '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': 0, 'max_attachments': None, 'version': 5, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': None, 'allow_trash': None, 'allow_print': None, 'autoname': 'WH/.#####', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'Wiki History', 'idx': None, 'hide_toolbar': None, 'colour': 'White:FFF', 'client_script': None, 'modified': '2010-09-20 14:06:57', 'server_code_error': None, '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': 'PERM00527', 'parent': 'Wiki History', 'read': 1, 'create': 1, 'creation': '2009-12-08 11:22:40', 'modified': '2009-12-09 16:57:44', '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': 'Data', 'creation': '2009-12-08 11:22:40', 'doctype': 'DocField', 'oldfieldname': 'reference', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Reference', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Wiki History', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03483', 'idx': 1, 'default': None, 'colour': None, 'modified': '2009-12-09 16:57:44', 'parenttype': 'DocType', 'fieldname': 'reference', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-12-08 11:22:40', 'doctype': 'DocField', 'oldfieldname': 'version_no', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': 1, 'modified_by': 'Administrator', 'label': 'Version No', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': 1, 'permlevel': 0, 'description': None, 'parent': 'Wiki History', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03484', 'idx': 2, 'default': None, 'colour': None, 'modified': '2009-12-09 16:57:44', 'parenttype': 'DocType', 'fieldname': 'version_no', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Int', 'creation': '2009-12-08 17:57:57', 'doctype': 'DocField', 'oldfieldname': 'revision', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Revision', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Wiki History', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03487', 'idx': 3, 'default': None, 'colour': None, 'modified': '2009-12-09 16:57:44', 'parenttype': 'DocType', 'fieldname': 'revision', 'fieldtype': 'Int', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Text Editor', 'creation': '2009-12-08 11:22:40', 'doctype': 'DocField', 'oldfieldname': 'editor', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Editor', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Wiki History', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03485', 'idx': 4, 'default': None, 'colour': None, 'modified': '2009-12-09 16:57:44', 'parenttype': 'DocType', 'fieldname': 'editor', 'fieldtype': 'Text Editor', 'options': None, 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/doctype/wiki_page/__init__.py b/tools/doctype/wiki_page/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/doctype/wiki_page/__init__.py
diff --git a/tools/doctype/wiki_page/wiki_page.txt b/tools/doctype/wiki_page/wiki_page.txt
new file mode 100644
index 0000000..1a6bb4d
--- /dev/null
+++ b/tools/doctype/wiki_page/wiki_page.txt
@@ -0,0 +1 @@
+[{'section_style': 'Simple', 'is_transaction_doc': None, 'creation': '2009-12-04 10:56:29', 'search_fields': None, 'module': 'Tools', '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': 1, 'issingle': None, 'allow_rename': None, 'smallicon': None, 'allow_attach': None, 'show_in_menu': 0, 'max_attachments': None, 'version': 43, 'menu_index': None, 'docstatus': 0, 'allow_copy': None, 'istable': None, 'description': None, 'parent': None, 'server_code': 'class DocType:\n  def __init__(self, d, dl):\n    self.doc, self.doclist = d,dl\n\n  # replace $image\n  # ------------------\n  def validate(self):\n    import re\n    p = re.compile(\'\\$page\\( (?P<name> [^)]*) \\)\', re.VERBOSE)\n    i = re.compile(\'\\$image\\( (?P<name> [^)]*) \\)\', re.VERBOSE)\n    if self.doc.editor:\n      self.doc.editor = p.sub(self.replace_by_link, self.doc.editor)\n      self.doc.editor = i.sub(self.replace_by_img, self.doc.editor)\n  \n  def replace_by_link(self, match):\n    name = match.group(\'name\')\n    \n    # create wiki page if not created\n    if not db_exists(\'Wiki Page\', name):\n      w = Document(\'Wiki Page\')\n      w.page_name = name\n      w.save(1)\n    \n    return \'\'\'<a href="javascript:loaddoc(\'Wiki Page\',\'%s\')">%s</a>\'\'\' % (name, name)\n    \n  def replace_by_img(self, match):\n    name = match.group(\'name\')\n    return \'<img src="cgi-bin/getfile.cgi?ac=%s&name=%s">\' % (session[\'data\'][\'control_panel\'][\'account_id\'], name)    \n    \n  def on_update(self):\n    if not sql("select name from `tabWiki History` where reference=%s", self.doc.name):\n      latest_revision = 0\n      self.make_history(latest_revision)\n    else:\n      latest_revision = sql("select max(revision) from `tabWiki History` where reference=%s", self.doc.name)[0][0]\n      if latest_revision:\n        content = sql("select editor from `tabWiki History` where revision = %s and reference = %s", (latest_revision, self.doc.name))[0][0]\n        \n        if content == self.doc.editor:\n          pass\n        else:\n          self.make_history(latest_revision)\n\n  def make_history(self,revision):\n    wh = Document(\'Wiki History\')\n    wh.reference = self.doc.name\n    wh.editor = self.doc.editor\n    wh.revision = cint(revision) + 1\n    wh.save(1)', 'allow_trash': None, 'allow_print': None, 'autoname': 'field:page_name', 'client_script_core': None, 'client_string': None, 'use_template': None, 'modified_by': 'Administrator', 'document_type': None, 'name': 'Wiki Page', 'idx': None, 'hide_toolbar': 1, 'colour': 'White:FFF', 'client_script': 'cur_frm.cscript.onload = function(doc,dt,dn) {\n  pscript.cur_doc = doc; pscript.cur_dt = dt; pscript.cur_dn = dn;\n  \n  set_field_options(\'Page HTML\', doc.editor);\n  set_field_options(\'Heading\', \'<h1>\'+doc.name+\'</h1>\');\n  \n\n  unhide_field(\'Page HTML\');\n  unhide_field(\'Edit\');\n\n  hide_field(\'editor\');\n  hide_field(\'Done\');\n  \n  pscript.show_wiki_history(doc,dt,dn);\n}\n\ncur_frm.cscript.refresh = function() {\n  \n}\n\ncur_frm.cscript.Edit = function(doc,dt,dn) {\n  hide_field(\'Page HTML\');\n  hide_field(\'Edit\');\n\n  unhide_field(\'editor\');\n  unhide_field(\'Done\');\n}\n\ncur_frm.cscript.Done = function(doc,dt,dn) {\n\n  unhide_field(\'Page HTML\');\n  unhide_field(\'Edit\');\n\n  hide_field(\'editor\');\n  hide_field(\'Done\');\n\n  cur_frm.save(\'Save\', function() {\n    set_field_options(\'Page HTML\', locals[\'Wiki Page\'][doc.name].editor);\n    pscript.show_wiki_history(doc,dt,dn);\n  });\n  //\n}\n\n// Showing wiki detail\npscript.show_wiki_history = function(doc,dt,dn){\n /* $c(\'runserverobj\',args={\'method\':\'get_wiki_detail\',\'docs\':compress_doclist([doc])},\n  function(r,rt){\n    alert(\'in callback\');\n    alert(r.message);\n    detail = r.message.detail;\n    contributors = r.message.contributors;\n    \n    var txt = \'<br>This is Revision - \' + detail[0][0] + \' of \' + dn +\'.\' + \'<br>Last modified by \' + detail[0][1] + \' on \' + dateutil.str_to_user(detail[0][2])\n                  + \'<br><br>Contributors : \' + contributors.join(\', \');\n    set_field_options(\'History HTML\', txt);\n  })*/\n  \n  var callback = function(r,rt){\n    detail = r.message.detail;\n    contributors = r.message.contributors;\n    \n    var txt = \'<br>This is Revision - \' + detail[0][0] + \' of \' + dn +\'.\' + \'<br>Last modified by \' + detail[0][1] + \' on \' + dateutil.str_to_user(detail[0][2])\n                  + \'<br><br>Contributors : \' + contributors.join(\', \');\n    set_field_options(\'History HTML\', txt);\n  }\n  \n  args = {};\n  args.doc = doc; args.dt = dt; args.dn = dn;\n  $c_obj(\'Wiki Control\',\'get_wiki_detail\', docstring(args),callback);\n}\n\n// showing page history (keep this we will use this later)\n/*\npscript.show_page_history = function(){\n  if(!pscript.history_list){\n    history_list = new Listing(\'\',1);\n    history_list.colwidths = [\'30%\',\'30%\',\'40%\'];\n    history_list.colnames = [\'Revision\', \'Date\', \'Modified By\'];\n    pscript.history_list = history_list;\n  }\n  \n  if(!pscript.history_div){ pscript.history_div = document.createElement(\'div\'); }\n  pscript.history_div.innerHTML = \'\';\n\n  pscript.history_list.get_query = function(){\n    this.query = repl("select version_no, creation, modified_by, name from `tabWiki History` where reference=\'%(ref)s\' order by version_no desc", {\'ref\':pscript.cur_dn});\n    this.query_max = repl("select count(name) from `tabWiki History` where reference=\'%(ref)s\'", {\'ref\':pscript.cur_dn});\n  }\n  \n  pscript.history_list.show_cell = function(cell,ri,ci,d){\n    if(ci==0){\n      alert(d[ri][3]);\n      \n      var revision = $a(cell,\'span\',\'link_type\');\n      revision.innerHTML = \'Revision - \' + d[ri][0];\n      revision.name = d[ri][3];\n      \n      revision.onclick = function(){ alert(1); alert(this.name); }\n    }\n    \n    if(ci==1){ cell.innerHTML = dateutil.str_to_user(d[ri][1]); }\n    \n    if(ci==2){ cell.innerHTML = d[ri][2]; }\n  }\n  \n  pscript.history_list.make(pscript.history_div);\n  \n  pscript.history_list.run();\n  \n  pscript.history_list.onrun = function(){\n    //set_field_options\n    var df = get_field(pscript.cur_dt, \'History HTML\', pscript.cur_dn);\n    if(df)df.options = pscript.history_div;\n    alert(df.options);\n    msgprint(df.options);\n    refresh_field(\'History HTML\');\n  }\n}\n\npscript.show_history_content = function(wh){\n  alert(wh);\n}\n*/', 'modified': '2010-09-20 14:06:57', 'server_code_error': '<pre style="text-align: left;"></pre>', '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': 'PERM00526', 'parent': 'Wiki Page', 'read': 1, 'create': 1, 'creation': '2009-12-04 10:56:29', 'modified': '2009-12-09 18:18:55', 'submit': None, 'doctype': 'DocPerm', 'write': 1, 'idx': 1, 'parenttype': 'DocType', 'role': 'All', 'owner': 'Administrator', 'docstatus': 0, 'permlevel': 0, 'match': None, 'parentfield': 'permissions'}, {'no_copy': None, 'oldfieldtype': 'Data', 'creation': '2009-12-04 10:56:29', 'doctype': 'DocField', 'oldfieldname': 'page_name', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Page Name', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Wiki Page', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03472', 'idx': 1, 'default': None, 'colour': None, 'modified': '2009-12-09 18:18:55', 'parenttype': 'DocType', 'fieldname': 'page_name', 'fieldtype': 'Data', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'HTML', 'creation': '2009-12-04 10:56:29', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Heading', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Wiki Page', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03473', 'idx': 2, 'default': None, 'colour': None, 'modified': '2009-12-09 18:18:55', 'parenttype': 'DocType', 'fieldname': None, 'fieldtype': 'HTML', 'options': '', 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Button', 'creation': '2009-12-04 10:56:29', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Done', 'width': None, 'trigger': 'Client', 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Wiki Page', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03474', 'idx': 3, 'default': None, 'colour': None, 'modified': '2009-12-09 18:18:55', 'parenttype': 'DocType', 'fieldname': None, 'fieldtype': 'Button', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'HTML', 'creation': '2009-12-04 10:56:29', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Page HTML', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Wiki Page', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03475', 'idx': 4, 'default': None, 'colour': None, 'modified': '2009-12-09 18:18:55', 'parenttype': 'DocType', 'fieldname': None, 'fieldtype': 'HTML', 'options': '', 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Text Editor', 'creation': '2009-12-04 10:56:29', 'doctype': 'DocField', 'oldfieldname': 'editor', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Editor', 'width': None, 'trigger': '', 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Wiki Page', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03476', 'idx': 5, 'default': None, 'colour': 'White:FFF', 'modified': '2009-12-09 18:18:55', 'parenttype': 'DocType', 'fieldname': 'editor', 'fieldtype': 'Text Editor', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'Button', 'creation': '2009-12-04 10:56:29', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Edit', 'width': None, 'trigger': 'Client', 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Wiki Page', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03477', 'idx': 6, 'default': None, 'colour': 'White:FFF', 'modified': '2009-12-09 18:18:55', 'parenttype': 'DocType', 'fieldname': None, 'fieldtype': 'Button', 'options': None, 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'HTML', 'creation': '2009-12-04 10:56:29', 'doctype': 'DocField', 'oldfieldname': '', 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'Footer HTML', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Wiki Page', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03478', 'idx': 7, 'default': None, 'colour': None, 'modified': '2009-12-09 18:18:55', 'parenttype': 'DocType', 'fieldname': '', 'fieldtype': 'HTML', 'options': '<div style=\'border-top: 1px solid #AAA; margin-top: 32px; padding-top: 8px\'>To create / link another WIki Page, use <span style="font-family: Courier, fixed">$page(New Page Name)</span></div>\n\n<div>To add image, use <span style="font-family:Courier,fixed">$image(filename)</span></div>\n<!--\n<div><span class="link_type" onclick="pscript.show_page_history()">Show page history</span></div> -->', 'report_hide': None, 'parentfield': 'fields'}, {'no_copy': None, 'oldfieldtype': 'HTML', 'creation': '2009-12-07 16:49:50', 'doctype': 'DocField', 'oldfieldname': None, 'owner': 'Administrator', 'reqd': None, 'in_filter': None, 'print_hide': None, 'modified_by': 'Administrator', 'label': 'History HTML', 'width': None, 'trigger': None, 'depends_on': None, 'docstatus': 0, 'hidden': None, 'permlevel': 0, 'description': None, 'parent': 'Wiki Page', 'search_index': None, 'allow_on_submit': None, 'icon': None, 'name': 'FL03482', 'idx': 8, 'default': None, 'colour': None, 'modified': '2009-12-09 18:18:55', 'parenttype': 'DocType', 'fieldname': None, 'fieldtype': 'HTML', 'options': '', 'report_hide': None, 'parentfield': 'fields'}]
\ No newline at end of file
diff --git a/tools/page/__init__.py b/tools/page/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/page/__init__.py
diff --git a/tools/page/file_browser/__init__.py b/tools/page/file_browser/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/page/file_browser/__init__.py
diff --git a/tools/page/file_browser/file_browser.html b/tools/page/file_browser/file_browser.html
new file mode 100644
index 0000000..d30409e
--- /dev/null
+++ b/tools/page/file_browser/file_browser.html
@@ -0,0 +1,55 @@
+<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/tools/page/file_browser/file_browser.js b/tools/page/file_browser/file_browser.js
new file mode 100644
index 0000000..279bbed
--- /dev/null
+++ b/tools/page/file_browser/file_browser.js
@@ -0,0 +1,992 @@
+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/tools/page/file_browser/file_browser.txt b/tools/page/file_browser/file_browser.txt
new file mode 100644
index 0000000..fa4f4a1
--- /dev/null
+++ b/tools/page/file_browser/file_browser.txt
@@ -0,0 +1,194 @@
+[
+	{
+		'content': None,
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page',
+		'icon': '',
+		'idx': None,
+		'menu_index': None,
+		'modified': '2010-09-25 00:00:00',
+		'modified_by': 'Administrator',
+		'module': 'Tools',
+		'name': 'File Browser',
+		'owner': 'Administrator',
+		'page_name': 'File Browser',
+		'parent': None,
+		'parent_node': None,
+		'parentfield': None,
+		'parenttype': None,
+		'script': None,
+		'show_in_menu': 1,
+		'standard': 'Yes',
+		'static_content': '',
+		'style': ''
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 1,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000031',
+		'owner': 'Administrator',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'Administrator'
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 2,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000032',
+		'owner': 'saumil@webnotestech.com',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'Sales User'
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 3,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000033',
+		'owner': 'saumil@webnotestech.com',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'Sales Manager'
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 4,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000034',
+		'owner': 'saumil@webnotestech.com',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'System Manager'
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 5,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000035',
+		'owner': 'saumil@webnotestech.com',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'Purchase User'
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 6,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000036',
+		'owner': 'saumil@webnotestech.com',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'Purchase Manager'
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 7,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000037',
+		'owner': 'saumil@webnotestech.com',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'Accounts User'
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 8,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000038',
+		'owner': 'saumil@webnotestech.com',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'Accounts Manager'
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 9,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000039',
+		'owner': 'saumil@webnotestech.com',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'Production User'
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 10,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000040',
+		'owner': 'saumil@webnotestech.com',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'Production Manager'
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 11,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000041',
+		'owner': 'saumil@webnotestech.com',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'Material User'
+	},
+	{
+		'creation': '2010-11-30 17:25:41',
+		'docstatus': 0,
+		'doctype': 'Page Role',
+		'idx': 12,
+		'modified': '2010-11-30 17:25:41',
+		'modified_by': 'Administrator',
+		'name': 'PR000042',
+		'owner': 'Administrator',
+		'parent': 'File Browser',
+		'parentfield': 'roles',
+		'parenttype': 'Page',
+		'role': 'Customer'
+	}
+]
\ No newline at end of file
diff --git a/tools/page/messages/__init__.py b/tools/page/messages/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/page/messages/__init__.py
diff --git a/tools/page/messages/messages.html b/tools/page/messages/messages.html
new file mode 100644
index 0000000..ded3393
--- /dev/null
+++ b/tools/page/messages/messages.html
@@ -0,0 +1,2 @@
+<div id="message_header" style="margin-bottom: 8px"></div>
+<div id="inbox_tabs"></div>
\ No newline at end of file
diff --git a/tools/page/messages/messages.js b/tools/page/messages/messages.js
new file mode 100644
index 0000000..258961d
--- /dev/null
+++ b/tools/page/messages/messages.js
@@ -0,0 +1,929 @@
+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};
+  
+  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/tools/page/messages/messages.txt b/tools/page/messages/messages.txt
new file mode 100644
index 0000000..8369afe
--- /dev/null
+++ b/tools/page/messages/messages.txt
@@ -0,0 +1 @@
+[{'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/tools/page/messages/messages_static.html b/tools/page/messages/messages_static.html
new file mode 100644
index 0000000..094418b
--- /dev/null
+++ b/tools/page/messages/messages_static.html
@@ -0,0 +1,2 @@
+<div>
+</div>
\ No newline at end of file
diff --git a/tools/page/trash/__init__.py b/tools/page/trash/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/page/trash/__init__.py
diff --git a/tools/page/trash/trash.html b/tools/page/trash/trash.html
new file mode 100644
index 0000000..0fdca75
--- /dev/null
+++ b/tools/page/trash/trash.html
@@ -0,0 +1,2 @@
+<div id="trash_header">&nbsp;</div>
+<div id="trash_div" style="margin: 0px;">&nbsp;</div>
\ No newline at end of file
diff --git a/tools/page/trash/trash.js b/tools/page/trash/trash.js
new file mode 100644
index 0000000..a1b44d4
--- /dev/null
+++ b/tools/page/trash/trash.js
@@ -0,0 +1,128 @@
+pscript['onload_Trash'] = function() {
+
+  // header and toolbar
+  var h = new PageHeader('trash_header','Trash Bin','Restore the documents that you have trashed')
+  
+  if(!pscript.trash_bin) pscript.trash_bin = new pscript.Trash();
+}
+
+pscript.Trash = function() {
+  // create UI elements
+  this.wrapper = $i('trash_div');
+  
+  this.head = $a(this.wrapper, 'div');
+  this.body = $a(this.wrapper, 'div');
+  $y(this.body, {margin:'8px'})
+
+  this.make_head();
+  this.load_masters();
+}
+
+// Make Button
+// ------------
+pscript.Trash.prototype.make_button = function(label, area){
+  var me = this;
+  var w = $a(area, 'div', '', {margin:'8px'});
+  var t = make_table(w,1,1,'400px',['50%','50%']);
+  var s = $a($td(t,0,0),'button');
+  s.innerHTML = label;
+  s.wrapper = w;
+  return s;
+}
+
+
+// Make Head
+// -------------
+pscript.Trash.prototype.make_head = function() {
+  var me = this;
+  
+  var make_select = function(label) {
+    var w = $a(me.head, 'div', '', {margin:'8px'});
+    var t = make_table(w,1,2,'400px',['50%','50%']);
+    $td(t,0,0).innerHTML = label;
+    var s = $a($td(t,0,1),'select','',{width:'140px'});
+    s.wrapper = w;
+    return s;
+  }
+  
+  // Select Master Name
+  this.master_select = make_select('Select Master');
+    
+  var me = this;
+  // Get Records
+  this.get_records_button = me.make_button('Get Records', me.head);
+  this.get_records_button.onclick = function() {
+    me.get_records();
+  }
+}
+
+
+// Load Masters
+// -------------
+pscript.Trash.prototype.load_masters = function(){
+  var me = this;
+  var callback = function(r, rt){
+    // Masters
+    empty_select(me.master_select);
+    add_sel_options(me.master_select,add_lists(['All'], r.message), 'All');
+  }
+  $c_obj('Trash Control','get_masters','',callback);
+}
+
+
+// Get Records
+// -----------
+pscript.Trash.prototype.get_records = function(){
+  var me = this;
+  me.body.innerHTML = '';
+  var callback = function(r, rt){
+    if(r.message) me.generate_trash_records(r.message);
+    else msgprint("No Records Found");
+  }
+  $c_obj('Trash Control','get_trash_records',sel_val(me.master_select),callback);
+}
+
+
+// Generate Trash Records
+// -----------------------
+pscript.Trash.prototype.generate_trash_records = function(rec_dict){
+  var me = this;
+  pscript.all_checkboxes = [];
+  mnames = keys(rec_dict).sort();
+  for(var i = 0; i < mnames.length; i ++){
+    var head = $a(me.body, 'h3'); head.innerHTML = mnames[i];
+    var rec_table = make_table(me.body,rec_dict[mnames[i]].length,2,'375px',['350px','25px'],{border:'1px solid #AAA',padding:'2px'});
+    for(var j = 0; j < rec_dict[mnames[i]].length; j++){
+      $a_input($td(rec_table,j,0), 'data');
+      $td(rec_table,j,0).innerHTML = rec_dict[mnames[i]][j];
+      var chk = $a_input($td(rec_table,j,1), 'checkbox');
+      chk.master = mnames[i];
+      chk.record = rec_dict[mnames[i]][j];
+      pscript.all_checkboxes.push(chk);
+    }
+  }
+  this.restore_button = me.make_button('Restore Selected', me.body);
+  this.restore_button.onclick = function() {
+    me.restore_records(0);
+  }
+  this.restore_all_button = me.make_button('Restore All', me.body);
+  this.restore_all_button.onclick = function() {
+    me.restore_records(1);
+  }
+}
+
+
+// Restore Records
+// ---------------
+pscript.Trash.prototype.restore_records = function(restore_all){
+  var me = this;
+  var out = {};
+  for(i in pscript.all_checkboxes) {
+    c = pscript.all_checkboxes[i];
+    if (restore_all || (!restore_all && c.checked)) {
+      if(!out[c.master]) out[c.master] = [c.record];
+      else {out[c.master].push(c.record);}
+    }
+  }
+  $c_obj('Trash Control','restore_records',JSON.stringify(out),function(r, rt){me.get_records();})
+}
\ No newline at end of file
diff --git a/tools/page/trash/trash.txt b/tools/page/trash/trash.txt
new file mode 100644
index 0000000..9be29a9
--- /dev/null
+++ b/tools/page/trash/trash.txt
@@ -0,0 +1 @@
+[{'creation': '2010-04-17 14:36:24', 'module': 'Tools', 'doctype': 'Page', 'owner': 'Administrator', 'style': None, 'modified_by': 'saumil@webnotestech.com', 'script': None, 'show_in_menu': 0, 'content': None, 'page_name': 'Trash', 'menu_index': None, 'docstatus': 0, 'parent': None, 'standard': 'Yes', 'icon': None, 'name': 'Trash', 'idx': None, 'static_content': None, 'modified': '2010-09-25 00:00:00', 'parenttype': None, 'parent_node': None, 'parentfield': None}, {'modified_by': 'saumil@webnotestech.com', 'name': 'PR000122', 'parent': 'Trash', 'creation': '2010-04-19 10:03:20', 'modified': '2010-09-16 16:50:16', 'doctype': 'Page Role', 'idx': 1, 'parenttype': 'Page', 'role': 'Administrator', 'owner': 'Administrator', 'docstatus': 0, 'parentfield': 'roles'}, {'modified_by': 'saumil@webnotestech.com', 'name': 'PR000123', 'parent': 'Trash', 'creation': '2010-04-21 10:33:38', 'modified': '2010-09-16 16:50:16', 'doctype': 'Page Role', 'idx': 2, 'parenttype': 'Page', 'role': 'Sales Master Manager', 'owner': 'saumil@webnotestech.com', 'docstatus': 0, 'parentfield': 'roles'}, {'modified_by': 'saumil@webnotestech.com', 'name': 'PR000124', 'parent': 'Trash', 'creation': '2010-04-21 10:33:38', 'modified': '2010-09-16 16:50:16', 'doctype': 'Page Role', 'idx': 3, 'parenttype': 'Page', 'role': 'Material Master Manager', 'owner': 'saumil@webnotestech.com', 'docstatus': 0, 'parentfield': 'roles'}, {'modified_by': 'saumil@webnotestech.com', 'name': 'PR000125', 'parent': 'Trash', 'creation': '2010-04-21 10:33:38', 'modified': '2010-09-16 16:50:16', 'doctype': 'Page Role', 'idx': 4, 'parenttype': 'Page', 'role': 'Purchase Master Manager', 'owner': 'saumil@webnotestech.com', 'docstatus': 0, 'parentfield': 'roles'}, {'modified_by': 'saumil@webnotestech.com', 'name': 'PR000126', 'parent': 'Trash', 'creation': '2010-04-21 10:33:38', 'modified': '2010-09-16 16:50:16', 'doctype': 'Page Role', 'idx': 5, 'parenttype': 'Page', 'role': 'Accounts Manager', 'owner': 'saumil@webnotestech.com', 'docstatus': 0, 'parentfield': 'roles'}]
\ No newline at end of file
diff --git a/tools/page/wip_monitor/__init__.py b/tools/page/wip_monitor/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/page/wip_monitor/__init__.py
diff --git a/tools/page/wip_monitor/wip_monitor.html b/tools/page/wip_monitor/wip_monitor.html
new file mode 100644
index 0000000..b7eb59e
--- /dev/null
+++ b/tools/page/wip_monitor/wip_monitor.html
@@ -0,0 +1,2 @@
+<div id="wip_head"></div>
+<div id="wip_body" style="margin:16px"></div>
\ No newline at end of file
diff --git a/tools/page/wip_monitor/wip_monitor.js b/tools/page/wip_monitor/wip_monitor.js
new file mode 100644
index 0000000..f5a2a62
--- /dev/null
+++ b/tools/page/wip_monitor/wip_monitor.js
@@ -0,0 +1,88 @@
+pscript['onload_WIP Monitor'] = function(){
+	wip = new WIP_Monitor();
+
+	var h = new PageHeader('wip_head','Work in Progress Monitor','A quick glance at your work in progress and pipeline');
+	h.add_button('Refresh', function(){ wip = new WIP_Monitor();}, 1, 'ui-icon-refresh');
+	
+}
+
+// Work In Progress Monitor
+// =========================================================================================================================================================
+WIP_Monitor = function(){					
+	var me = this;
+  this.row_index = 0;
+  $c_obj('Home Control','get_wip_counts','',function(r,rt){
+    me.make_wip_dashboard(r.message);
+  });
+}
+
+
+// Make wip dashboard
+// ------------------
+WIP_Monitor.prototype.make_wip_dashboard = function(wip_dict)
+{
+	var me = this;
+	// list of doctypes which user can read
+	var can_read_dt = ['Lead', 'Enquiry', 'Sales Order', 'Receivable Voucher', 'Indent', 'Purchase Order', 'Payable Voucher', 'Delivery Note', 'Task', 'Serial No'];
+  
+	$i('wip_body').innerHTML = '';
+	this.tab = make_table('wip_body',1,0,'100%',[],{padding:'4px'});
+
+	for(var k=0; k<can_read_dt.length; k++){
+	
+    // check if the user can read these doctypes
+		if(in_list(profile.can_read, get_doctype_label(can_read_dt[k])))
+    {
+      var work = can_read_dt[k];
+      if(this.tab.rows[this.row_index].cells.length==2){
+        this.row_index = this.row_index + 1;
+        this.tab.insertRow(this.tab.rows.length);
+      }
+      var parent = this.tab.rows[this.row_index].insertCell(this.tab.rows[this.row_index].cells.length);
+      $y(parent, {paddingBottom:'16px', width:'50%', paddingLeft:'8px'})
+      me.show_wip_dashboard(parent, work, wip_dict[work]);
+    }
+	}
+}
+
+
+// Show wip dashboard
+// ------------------
+WIP_Monitor.prototype.show_wip_dashboard = function(parent, head, report_dict)
+{
+	var me = this;
+	var report_dt
+  
+	// dictionary for labels to be displayed
+	var wip_lbl_map = {'Lead':'Lead', 'Enquiry':'Enquiries', 'Sales Order':'Sales Order', 'Receivable Voucher':'Invoices', 'Indent':'Indent', 'Purchase Order':'Purchase Order', 'Payable Voucher':'Bills', 'Delivery Note':'Delivery Note', 'Task':'Tasks', 'Serial No':'Maintenance'};
+
+	// header
+	var h = $a(parent,'h3');
+
+  h.innerHTML = wip_lbl_map[head];
+  report_dt = head;
+    
+	for(report in report_dict){
+		me.make_report_body(parent, report, report_dict[report], report_dt);
+	}
+}
+
+
+// Make wip report body
+// --------------------
+WIP_Monitor.prototype.make_report_body = function(parent, lbl, records, rep_dt)
+{
+	var me = this;
+
+	dt_color = lbl=='Overdue' ? 'red' : 'black';
+	var tab2 = make_table(parent,1,2, '70%', ['10%', '90%'], {padding:'4px'});
+			
+	// no of records
+	var s1 = $a($td(tab2,0,0), 'span', '', {fontWeight:'bold', fontSize:'12px', color:dt_color});
+	s1.innerHTML = records;
+
+	// link to report
+	var s1 = $a($td(tab2,0,1), 'span', 'link_type', {cursor:'pointer', color:'#DFH'});
+	s1.dt = rep_dt;     s1.cn = rep_dt + '-' + lbl;     s1.innerHTML = lbl;
+	s1.onclick = function() { loadreport(this.dt, this.cn); }
+}
diff --git a/tools/page/wip_monitor/wip_monitor.txt b/tools/page/wip_monitor/wip_monitor.txt
new file mode 100644
index 0000000..b2394f6
--- /dev/null
+++ b/tools/page/wip_monitor/wip_monitor.txt
@@ -0,0 +1 @@
+[{'creation': '2010-06-29 10:44:15', 'module': 'Tools', 'doctype': 'Page', 'owner': 'Administrator', 'style': None, 'modified_by': 'Administrator', 'script': None, 'show_in_menu': 0, 'content': None, 'page_name': 'WIP Monitor', 'menu_index': None, 'docstatus': 0, 'parent': None, 'standard': 'Yes', 'icon': None, 'name': 'WIP Monitor', 'idx': None, 'static_content': None, 'modified': '2010-11-09 23:12:33', 'parenttype': None, 'parent_node': None, 'parentfield': None}]
\ No newline at end of file