From cde7e9477f237ef80321284f9c4b4375d740b77d Mon Sep 17 00:00:00 2001
From: George Faraj <george.faraj@squadventure.com>
Date: Sun, 17 Mar 2013 23:35:51 -0500
Subject: [PATCH] Added support to change label when no matches found. Prevent
 text box from updating if that item is selected

---
 .../autocomplete-rails-uncompressed.js        | 61 ++++++++++---------
 lib/assets/javascripts/autocomplete-rails.js  |  2 +-
 2 files changed, 33 insertions(+), 30 deletions(-)

diff --git a/lib/assets/javascripts/autocomplete-rails-uncompressed.js b/lib/assets/javascripts/autocomplete-rails-uncompressed.js
index 1a4d0837..1153e1d8 100644
--- a/lib/assets/javascripts/autocomplete-rails-uncompressed.js
+++ b/lib/assets/javascripts/autocomplete-rails-uncompressed.js
@@ -44,6 +44,7 @@
   jQuery.railsAutocomplete.fn.extend({
     init: function(e) {
       e.delimiter = jQuery(e).attr('data-delimiter') || null;
+      e.noMatchesLabel = jQuery(e).attr('data-no-matches-label') || 'no existing match';
       function split( val ) {
         return val.split( e.delimiter );
       }
@@ -58,7 +59,7 @@
           }, function() {
             if(arguments[0].length == 0) {
               arguments[0] = []
-              arguments[0][0] = { id: "", label: "no existing match" }
+              arguments[0][0] = { id: "", label: e.noMatchesLabel }
             }
             jQuery(arguments[0]).each(function(i, el) {
               var obj = {};
@@ -94,36 +95,38 @@
           return false;
         },
         select: function( event, ui ) {
-          var terms = split( this.value );
-          // remove the current input
-          terms.pop();
-          // add the selected item
-          terms.push( ui.item.value );
-          // add placeholder to get the comma-and-space at the end
-          if (e.delimiter != null) {
-            terms.push( "" );
-            this.value = terms.join( e.delimiter );
-          } else {
-            this.value = terms.join("");
-            if (jQuery(this).attr('data-id-element')) {
-              jQuery(jQuery(this).attr('data-id-element')).val(ui.item.id);
-            }
-            if (jQuery(this).attr('data-update-elements')) {
-              var data = jQuery(this).data(ui.item.id.toString());
-              var update_elements = jQuery.parseJSON(jQuery(this).attr("data-update-elements"));
-              for (var key in update_elements) {
-                jQuery(update_elements[key]).val(data[key]);
+	  if (ui.item.value != e.noMatchesLabel) {
+            var terms = split( this.value );
+            // remove the current input
+            terms.pop();
+            // add the selected item
+            terms.push( ui.item.value );
+            // add placeholder to get the comma-and-space at the end
+            if (e.delimiter != null) {
+              terms.push( "" );
+              this.value = terms.join( e.delimiter );
+            } else {
+              this.value = terms.join("");
+              if (jQuery(this).attr('data-id-element')) {
+                jQuery(jQuery(this).attr('data-id-element')).val(ui.item.id);
+              }
+              if (jQuery(this).attr('data-update-elements')) {
+                var data = jQuery(this).data(ui.item.id.toString());
+                var update_elements = jQuery.parseJSON(jQuery(this).attr("data-update-elements"));
+                for (var key in update_elements) {
+                  jQuery(update_elements[key]).val(data[key]);
+                }
               }
             }
-          }
-          var remember_string = this.value;
-          jQuery(this).bind('keyup.clearId', function(){
-            if(jQuery(this).val().trim() != remember_string.trim()){
-              jQuery(jQuery(this).attr('data-id-element')).val("");
-              jQuery(this).unbind('keyup.clearId');
-            }
-          });
-          jQuery(e).trigger('railsAutocomplete.select', ui);
+            var remember_string = this.value;
+            jQuery(this).bind('keyup.clearId', function(){
+              if(jQuery(this).val().trim() != remember_string.trim()){
+                jQuery(jQuery(this).attr('data-id-element')).val("");
+                jQuery(this).unbind('keyup.clearId');
+              }
+            });
+            jQuery(e).trigger('railsAutocomplete.select', ui);
+	  }
           return false;
         }
       });
diff --git a/lib/assets/javascripts/autocomplete-rails.js b/lib/assets/javascripts/autocomplete-rails.js
index 6e173e74..34e29f17 100644
--- a/lib/assets/javascripts/autocomplete-rails.js
+++ b/lib/assets/javascripts/autocomplete-rails.js
@@ -13,4 +13,4 @@
 *   Example:
 *       <input type="text" data-autocomplete="/url/to/autocomplete" data-id-element="#id_field">
 */
-(function(e){var t=null;e.fn.railsAutocomplete=function(){var t=function(){this.railsAutoCompleter||(this.railsAutoCompleter=new e.railsAutocomplete(this))};return e.fn.on!==undefined?$(document).on("focus",this.selector,t):this.live("focus",t)},e.railsAutocomplete=function(e){_e=e,this.init(_e)},e.railsAutocomplete.fn=e.railsAutocomplete.prototype={railsAutocomplete:"0.0.1"},e.railsAutocomplete.fn.extend=e.railsAutocomplete.extend=e.extend,e.railsAutocomplete.fn.extend({init:function(t){function n(e){return e.split(t.delimiter)}function r(e){return n(e).pop().replace(/^\s+/,"")}t.delimiter=e(t).attr("data-delimiter")||null,e(t).autocomplete({source:function(n,i){e.getJSON(e(t).attr("data-autocomplete"),{term:r(n.term)},function(){arguments[0].length==0&&(arguments[0]=[],arguments[0][0]={id:"",label:"no existing match"}),e(arguments[0]).each(function(n,r){var i={};i[r.id]=r,e(t).data(i)}),i.apply(null,arguments)})},change:function(t,n){if(e(e(this).attr("data-id-element")).val()=="")return;e(e(this).attr("data-id-element")).val(n.item?n.item.id:"");var r=e.parseJSON(e(this).attr("data-update-elements")),i=n.item?e(this).data(n.item.id.toString()):{};if(r&&e(r["id"]).val()=="")return;for(var s in r)e(r[s]).val(n.item?i[s]:"")},search:function(){var e=r(this.value);if(e.length<2)return!1},focus:function(){return!1},select:function(r,i){var s=n(this.value);s.pop(),s.push(i.item.value);if(t.delimiter!=null)s.push(""),this.value=s.join(t.delimiter);else{this.value=s.join(""),e(this).attr("data-id-element")&&e(e(this).attr("data-id-element")).val(i.item.id);if(e(this).attr("data-update-elements")){var o=e(this).data(i.item.id.toString()),u=e.parseJSON(e(this).attr("data-update-elements"));for(var a in u)e(u[a]).val(o[a])}}var f=this.value;return e(this).bind("keyup.clearId",function(){e(this).val().trim()!=f.trim()&&(e(e(this).attr("data-id-element")).val(""),e(this).unbind("keyup.clearId"))}),e(t).trigger("railsAutocomplete.select",i),!1}})}}),e(document).ready(function(){e("input[data-autocomplete]").railsAutocomplete()})})(jQuery);
\ No newline at end of file
+(function(e){var t=null;e.fn.railsAutocomplete=function(){var t=function(){if(!this.railsAutoCompleter){this.railsAutoCompleter=new e.railsAutocomplete(this)}};if(e.fn.on!==undefined){return $(document).on("focus",this.selector,t)}else{return this.live("focus",t)}};e.railsAutocomplete=function(e){_e=e;this.init(_e)};e.railsAutocomplete.fn=e.railsAutocomplete.prototype={railsAutocomplete:"0.0.1"};e.railsAutocomplete.fn.extend=e.railsAutocomplete.extend=e.extend;e.railsAutocomplete.fn.extend({init:function(t){function n(e){return e.split(t.delimiter)}function r(e){return n(e).pop().replace(/^\s+/,"")}t.delimiter=e(t).attr("data-delimiter")||null;t.noMatchesLabel=e(t).attr("data-no-matches-label")||"no existing match";e(t).autocomplete({source:function(n,i){e.getJSON(e(t).attr("data-autocomplete"),{term:r(n.term)},function(){if(arguments[0].length==0){arguments[0]=[];arguments[0][0]={id:"",label:t.noMatchesLabel}}e(arguments[0]).each(function(n,r){var i={};i[r.id]=r;e(t).data(i)});i.apply(null,arguments)})},change:function(t,n){if(e(e(this).attr("data-id-element")).val()==""){return}e(e(this).attr("data-id-element")).val(n.item?n.item.id:"");var r=e.parseJSON(e(this).attr("data-update-elements"));var i=n.item?e(this).data(n.item.id.toString()):{};if(r&&e(r["id"]).val()==""){return}for(var s in r){e(r[s]).val(n.item?i[s]:"")}},search:function(){var e=r(this.value);if(e.length<2){return false}},focus:function(){return false},select:function(r,i){if(i.item.value!=t.noMatchesLabel){var s=n(this.value);s.pop();s.push(i.item.value);if(t.delimiter!=null){s.push("");this.value=s.join(t.delimiter)}else{this.value=s.join("");if(e(this).attr("data-id-element")){e(e(this).attr("data-id-element")).val(i.item.id)}if(e(this).attr("data-update-elements")){var o=e(this).data(i.item.id.toString());var u=e.parseJSON(e(this).attr("data-update-elements"));for(var a in u){e(u[a]).val(o[a])}}}var f=this.value;e(this).bind("keyup.clearId",function(){if(e(this).val().trim()!=f.trim()){e(e(this).attr("data-id-element")).val("");e(this).unbind("keyup.clearId")}});e(t).trigger("railsAutocomplete.select",i)}return false}})}});e(document).ready(function(){e("input[data-autocomplete]").railsAutocomplete()})})(jQuery);