Sourced wnframework-modules from Google Code as erpnext
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