[enhancement] Item Selector
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index dc6d4cd..9e2bd22 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -8,6 +8,7 @@
 erpnext.TransactionController = erpnext.taxes_and_totals.extend({
 	onload: function() {
 		var me = this;
+		this.frm.show_print_first = true;
 		if(this.frm.doc.__islocal) {
 			var today = get_today(),
 				currency = frappe.defaults.get_user_default("currency");
@@ -81,7 +82,7 @@
 				me.calculate_taxes_and_totals();
 		}
 		if(frappe.meta.get_docfield(this.frm.doc.doctype + " Item", "item_code")) {
-			cur_frm.get_field("items").grid.set_multiple_add("item_code", "qty");
+			this.setup_item_selector();
 		}
 	},
 
@@ -890,7 +891,16 @@
 			rate = flt(item.rate) * flt(this.frm.doc.conversion_rate || 1);
 			item.gross_profit = flt(((rate - item.valuation_rate) * item.qty), precision("amount", item));
 		}
+	},
+
+	setup_item_selector: function() {
+		if(!this.item_selector) {
+			this.item_selector = new erpnext.ItemSelector({frm: this.frm});
+		}
 	}
+
+
+
 });
 
 frappe.ui.form.on(cur_frm.doctype + " Item", "rate", function(frm, cdt, cdn) {
diff --git a/erpnext/public/js/pos/pos.html b/erpnext/public/js/pos/pos.html
index d12b9b2..36ef7c9 100644
--- a/erpnext/public/js/pos/pos.html
+++ b/erpnext/public/js/pos/pos.html
@@ -47,7 +47,10 @@
     			</div>
     		</div>
     	</div>
-    	<div class="col-sm-7 pos-item-area">
+    	<div class="col-sm-7 pos-items-section">
+			<div class="row pos-item-area">
+
+			</div>
             <div class="row pos-item-toolbar">
             	<div class="search-area col-xs-12"></div>
             </div>
diff --git a/erpnext/public/js/pos/pos.js b/erpnext/public/js/pos/pos.js
index a239bbc..60801e6 100644
--- a/erpnext/public/js/pos/pos.js
+++ b/erpnext/public/js/pos/pos.js
@@ -131,7 +131,9 @@
 							item_code: obj.name,
 							item_price: format_currency(obj.price_list_rate, obj.currency),
 							item_name: obj.name===obj.item_name ? "" : obj.item_name,
-							item_image: obj.image ? "url('" + obj.image + "')" : null
+							item_image: obj.image ? "url('" + obj.image + "')" : null,
+							color: frappe.get_palette(obj.item_name),
+							abbr: frappe.get_abbr(obj.item_name)
 						})).tooltip().appendTo($wrap);
 					});
 				}
diff --git a/erpnext/public/js/pos/pos_item.html b/erpnext/public/js/pos/pos_item.html
index 1235db9..aec36a7 100644
--- a/erpnext/public/js/pos/pos_item.html
+++ b/erpnext/public/js/pos/pos_item.html
@@ -1,9 +1,13 @@
-<div class="pos-item" data-item-code="{%= item_code %}" title="{%= item_name || item_code %}">
-	<div class="pos-item-image {% if (!item_image) { %} no-image {% } %}"
-		 style="{% if (item_image) { %} background-image: {%= item_image %} {% } %}">
+<div class="pos-item-wrapper col-xs-3">
+	<div class="pos-item" data-item-code="{%= item_code %}" title="{%= item_name || item_code %}">
+		<div class="pos-item-image"
+			 style="{% if (item_image) { %} background-image: {{ item_image }} {% }
+			 	else { %} background-color: {{ color }} {% } %}">
+			{% if (!item_image) { %}{{ abbr }}{% } %}
+		</div>
+		<div class="pos-item-text">
+			<h6 class="item-code text-ellipsis">{%= item_name ? (item_name + " (" + item_code + ")") : item_code %}</h6>
+			<div class="small text-ellipsis">{%= item_price %}</div>
+		</div>
 	</div>
-	<div class="pos-item-text">
-		<h6 class="item-code text-ellipsis">{%= item_name ? (item_name + " (" + item_code + ")") : item_code %}</h6>
-		<div class="small text-ellipsis">{%= item_price %}</div>
-	</div>
-</div>
+</div>
\ No newline at end of file
diff --git a/erpnext/public/js/templates/item_selector.html b/erpnext/public/js/templates/item_selector.html
new file mode 100644
index 0000000..47da67c
--- /dev/null
+++ b/erpnext/public/js/templates/item_selector.html
@@ -0,0 +1,16 @@
+<div class="row pos-item-area">
+{% for (var i=0; i < data.length; i++) { var item = data[i]; %}
+<div class="col-xs-3 pos-item-wrapper">
+	<div class="pos-item" data-name="{{ item.name }}">
+		<div class="pos-item-image"
+			{% if(item.image) { %}style="background-image: url({{ item.image }});"{% }
+			else { %}style="background-color: {{ item.color }};"{% } %}>
+			{% if(!item.image) { %}{{ item.abbr }}{% } %}
+		</div>
+		<div class="pos-item-text">
+			<h6 class="item-code text-ellipsis">{{ item.name }}</h6>
+		</div>
+	</div>
+</div>
+{% } %}
+</div>
\ No newline at end of file
diff --git a/erpnext/public/js/utils/item_selector.js b/erpnext/public/js/utils/item_selector.js
new file mode 100644
index 0000000..7d0bd15
--- /dev/null
+++ b/erpnext/public/js/utils/item_selector.js
@@ -0,0 +1,94 @@
+erpnext.ItemSelector = Class.extend({
+	init: function(opts) {
+		$.extend(this, opts);
+
+		this.grid = this.frm.get_field("items").grid;
+		this.setup();
+	},
+
+	setup: function() {
+		var me = this;
+		if(!this.grid.add_items_button) {
+			this.grid.add_items_button = this.grid.add_custom_button(__('Add Items'), function() {
+				if(!me.dialog) {
+					me.make_dialog();
+				}
+				me.dialog.show();
+				me.render_items();
+			});
+		}
+	},
+
+	make_dialog: function() {
+		this.dialog = new frappe.ui.Dialog({
+			title: __('Add Items')
+		});
+		var body = $(this.dialog.body);
+		body.html('<div><p><input type="text" class="form-control"></p>\
+			<br><div class="results"></div></div>');
+
+		this.dialog.input = body.find('.form-control');
+		this.dialog.results = body.find('.results');
+
+		var me = this;
+		this.dialog.results.on('click', '.pos-item', function() {
+			me.add_item($(this).attr('data-name'))
+		});
+
+		this.dialog.input.on('keyup', function() {
+			if(me.timeout_id) {
+				clearTimeout(me.timeout_id);
+			}
+			me.timeout_id = setTimeout(function() {
+				me.render_items();
+				me.timeout_id = undefined;
+			}, 500);
+		});
+	},
+
+	add_item: function(item_code) {
+		// add row or update qty
+		var added = false;
+
+		// find row with item if exists
+		$.each(this.frm.doc.items || [], function(i, d) {
+			if(d.item_code===item_code) {
+				frappe.model.set_value(d.doctype, d.name, 'qty', d.qty + 1);
+				show_alert(__("Added {0} ({1})", [item_code, d.qty]));
+				added = true;
+				return false;
+			}
+		});
+
+		if(!added) {
+			var d = this.grid.add_new_row();
+			frappe.model.set_value(d.doctype, d.name, 'item_code', item_code);
+
+			// after item fetch
+			frappe.after_ajax(function() {
+				setTimeout(function() {
+					frappe.model.set_value(d.doctype, d.name, 'qty', 1);
+					show_alert(__("Added {0} ({1})", [item_code, 1]));
+				}, 100);
+			});
+		}
+
+	},
+
+	render_items: function() {
+		var args = erpnext.queries.item();
+		args.txt = this.dialog.input.val();
+		args.as_dict = 1;
+
+		var me = this;
+		frappe.link_search("Item", args, function(r) {
+			$.each(r.values, function(i, d) {
+				if(!d.image) {
+					d.abbr = frappe.get_abbr(d.item_name);
+					d.color = frappe.get_palette(d.item_name);
+				}
+			});
+			me.dialog.results.html(frappe.render_template('item_selector', {'data':r.values}));
+		});
+	}
+})
\ No newline at end of file