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
