diff --git a/README.md b/README.md
index 20fafbb..3bfe47e 100644
--- a/README.md
+++ b/README.md
@@ -328,6 +328,9 @@ a little description and the default value:
| **tags-input-name** | `String` | `"tag"` | Name to use as `name=""` in single tags' input. By default, all tags being passed as array like `tag[]`. |
| **tags-limit** | `Integer` | `0` | Limit the number of tags that can be added, zero for no limit. |
| **type-zone-class** | `String` | `"type-zone"` | Class of the type-zone. |
+| **allowed-words** | `Array` | `[]` | Array of allowed words. |
+| **allowed-words-callback** | `Function` | `window.alert` | Function to call when allowed words are not detected. |
+| **allowed-words-text** | `String` | `"Tag not allowed:"` | Basic text passed to when allowed words not detected `allowed-words-callback`. |
## Available Methods ##
diff --git a/tagging.js b/tagging.js
index b10f510..d5f82ae 100644
--- a/tagging.js
+++ b/tagging.js
@@ -84,7 +84,11 @@
"tags-input-name": "tag", // Name to use as name="" in single tags (by default tag[])
"tag-on-blur": true, // Add the current tag if user clicks away from type-zone
"tags-limit": 0, // Limit the number of tags that can be added, zero means no limit
- "type-zone-class": "type-zone" // Class of the type-zone
+ "type-zone-class": "type-zone", // Class of the type-zone
+ "allowed-words": [], // Array of allowed words
+ "allowed-words-callback": window.alert, // Function to call when there is a allowed words
+ "allowed-words-text": "Tag not allowed:" // Basic text passed to allowed-words callback
+
},
/**
@@ -99,7 +103,7 @@
var $tag, l, self,
index, forbidden_words,
- callback_f, callback_t;
+ callback_f, callback_t, allowed_words;
// Caching this
self = this;
@@ -115,6 +119,8 @@
// Forbidden Words shortcut
forbidden_words = self.config[ "forbidden-words" ];
+ allowed_words = self.config[ "allowed-words"];
+
// If no text is passed, take it as text of $type_zone and then empty it
if ( ! text ) {
text = self.valInput();
@@ -153,6 +159,25 @@
}
}
+ // Check if text is allowed or not
+ l = allowed_words.length;
+ while ( l-- ) {
+
+ // looking for words which are allowed
+ if ( ! allowed_words.includes(text) ) {
+
+ // Removing all text and ','
+ self.emptyInput();
+
+ // Renaiming
+ callback_f = self.config[ "allowed-words-callback" ];
+ callback_t = self.config[ "allowed-words-text" ];
+
+ // Remove as a duplicate
+ return self.throwError( callback_f, callback_t, text );
+ }
+ }
+
// If no-duplicate is true, check that the text is not already present
if ( self.config[ "no-duplicate" ] ) {
diff --git a/tagging.min.js b/tagging.min.js
index 9e64639..6db42a3 100644
--- a/tagging.min.js
+++ b/tagging.min.js
@@ -1 +1 @@
-/*! taggingJS - v1.3.3 - 2015-05-04 */(function(e,l,g,p){var n=function(b,a){this.elem=b;this.$elem=e(b);this.options=a;this.tags=[]};n.prototype={keys:{add:{comma:188,enter:13,spacebar:32},remove:{del:46,backspace:8}},defaults:{"case-sensitive":!1,"close-char":"×","close-class":"tag-i","edit-on-delete":!0,"forbidden-chars":[".","_","?"],"forbidden-chars-callback":l.alert,"forbidden-chars-text":"Forbidden character:","forbidden-words":[],"forbidden-words-callback":l.alert,"forbidden-words-text":"Forbidden word:","no-backspace":!1,"no-comma":!1,"no-del":!1,"no-duplicate":!0,"no-duplicate-callback":l.alert,"no-duplicate-text":"Duplicate tag:","no-enter":!1,"no-spacebar":!1,"pre-tags-separator":", ","tag-box-class":"tagging","tag-box-editable-class":"editable","tag-char":"#","tag-class":"tag","tags-input-name":"tag","tag-on-blur":!0,"tags-limit":0,"type-zone-class":"type-zone"},add:function(b){var a,d,c,f,m;c=this;if(e.isArray(b))return e.each(b,function(){c.add(this+"")});m=c.config["forbidden-words"];b||(b=c.valInput(),c.emptyInput());if(!b||!b.length)return!1;c.config["case-sensitive"]||(b=b.toLowerCase());for(d=m.length;d--;)if(f=b.indexOf(m[d]),0<=f)return c.emptyInput(),d=c.config["forbidden-words-callback"],f=c.config["forbidden-words-text"],c.throwError(d,f,b);if(c.config["no-duplicate"])for(d=c.tags.length;d--;)if(c.tags[d].pure_text===b)return c.emptyInput(),d=c.config["no-duplicate-callback"],f=c.config["no-duplicate-text"],c.throwError(d,f,b);a=e(g.createElement("div")).addClass(c.config["tag-class"]).html(""+c.config["tag-char"]+" "+b);e(g.createElement("input")).attr("type","hidden").attr("name",c.config["tags-input-name"]+"[]").val(b).appendTo(a);e(g.createElement("a")).attr("role","button").addClass(c.config["close-class"]).html(c.config["close-char"]).click(function(){c.remove(a)}).appendTo(a);a.pure_text=b;c.tags.push(a);c.$type_zone.before(a);0=c.config["tags-limit"]&&(c.$elem.removeClass(c.config["tag-box-editable-class"]),c.$type_zone.hide());c.$elem.trigger("add:after",[b,c]);return!0},addSpecialKeys:function(b){var a,d,c,f;a=this;f=b[0];c=b[1];b={};if(e.isArray(c))return e.each(c,function(){a.addSpecialKeys([f,this])});if(!c&&c.constructor!==Object)return"Error -> The second argument is not an Object!";for(d in c)c.hasOwnProperty(d)&&c[d]===+c[d]&&c[d]===(c[d]|0)&&e.extend(b,c);a.keys[f]=e.extend({},b,a.keys[f]);return a.keys[f]},destroy:function(){this.$elem.find("."+this.config["type-zone-class"]).remove();this.$elem.find("."+this.config["tag-class"]).remove();this.$elem.data("tag-box",null);return!0},emptyInput:function(){this.focusInput();return this.valInput("")},focusInput:function(){return this.$type_zone.focus()},getDataOptions:function(){var b,a,d;d={};for(b in this.defaults)(a=this.$elem.data(b))&&(d[b]=a);return d},getSpecialKeys:function(){return e.extend({},this.keys.add,this.keys.remove)},getSpecialKeysD:function(){return this.keys},getTags:function(){var b,a,d;d=this.tags.length;b=[];for(a=0;a Tag not found";if(b)for(c=a.tags.length;c--;)a.tags[c][0].innerHTML===b[0].innerHTML&&a.tags.splice(c,1);else b=a.tags.pop();d=d||b.pure_text;b.remove();a.config["edit-on-delete"]&&(a.emptyInput(),a.valInput(b.pure_text));0=0)return f.emptyInput(),i=f.config["forbidden-words-callback"],j=f.config["forbidden-words-text"],f.throwError(i,j,b);for(e=k.length;e--;)if(!k.includes(b))return f.emptyInput(),i=f.config["allowed-words-callback"],j=f.config["allowed-words-text"],f.throwError(i,j,b);if(f.config["no-duplicate"])for(e=f.tags.length;e--;)if(f.tags[e].pure_text===b)return f.emptyInput(),i=f.config["no-duplicate-callback"],j=f.config["no-duplicate-text"],f.throwError(i,j,b);return d=a(c.createElement("div")).addClass(f.config["tag-class"]).html(""+f.config["tag-char"]+" "+b),a(c.createElement("input")).attr("type","hidden").attr("name",f.config["tags-input-name"]+"[]").val(b).appendTo(d),a(c.createElement("a")).attr("role","button").addClass(f.config["close-class"]).html(f.config["close-char"]).click(function(){f.remove(d)}).appendTo(d),d.pure_text=b,f.tags.push(d),f.$type_zone.before(d),f.config["tags-limit"]>0&&f.tags.length>=f.config["tags-limit"]&&(f.$elem.removeClass(f.config["tag-box-editable-class"]),f.$type_zone.hide()),f.$elem.trigger("add:after",[b,f]),!0},addSpecialKeys:function(b){var c,d,e,f,g;if(c=this,g=b[0],f=b[1],e={},a.isArray(f))return a.each(f,function(){c.addSpecialKeys([g,this])});if(!f&&f.constructor!==Object)return"Error -> The second argument is not an Object!";for(d in f)f.hasOwnProperty(d)&&f[d]===+f[d]&&f[d]===(0|f[d])&&a.extend(e,f);return c.keys[g]=a.extend({},e,c.keys[g]),c.keys[g]},destroy:function(){return this.$elem.find("."+this.config["type-zone-class"]).remove(),this.$elem.find("."+this.config["tag-class"]).remove(),this.$elem.data("tag-box",null),!0},emptyInput:function(){return this.focusInput(),this.valInput("")},focusInput:function(){return this.$type_zone.focus()},getDataOptions:function(){var a,b,c;c={};for(a in this.defaults)b=this.$elem.data(a),b&&(c[a]=b);return c},getSpecialKeys:function(){return a.extend({},this.keys.add,this.keys.remove)},getSpecialKeysD:function(){return this.keys},getTags:function(){var a,b,c;for(c=this.tags.length,a=[],b=0;c>b;b+=1)a.push(this.tags[b].pure_text);return a},getTagsObj:function(){return this.tags},init:function(){var b,d,e;return d=this,d.config=a.extend({},d.defaults,d.options,d.getDataOptions()),b=d.$elem.text(),d.$elem.empty(),d.$type_zone=a(c.createElement("input")).addClass(d.config["type-zone-class"]).attr("contenteditable",!0),d.$elem.addClass(d.config["tag-box-class"]).addClass(d.config["tag-box-editable-class"]).append(d.$type_zone),d.$type_zone.keydown(function(a){var b,c,e,f,g,h,i,j,k;if(g=d.getSpecialKeys(),h=d.config["forbidden-chars"],i=d.valInput(),f=a.key,i){for(e=h.length;e--;)if(c=i.indexOf(h[e]),c>=0)return a.preventDefault(),i=i.replace(h[e],""),d.focusInput(),d.valInput(i),j=d.config["forbidden-chars-callback"],k=d.config["forbidden-chars-text"],d.throwError(j,k,h[e]);for(b in d.keys.add)if(f===d.keys.add[b]&&!d.config["no-"+b])return a.preventDefault(),d.add()}else for(b in g)if(f===g[b]){if(d.keys.add[b])return a.preventDefault(),!0;if(d.keys.remove[b]&&!d.config["no-"+b])return a.preventDefault(),d.remove()}return!0}),d.config["tag-on-blur"]&&d.$type_zone.focusout(function(){return e=d.valInput(),e&&e.length?d.add():!1}),d.$elem.on("click",function(){d.focusInput()}),d.refresh(b),d},refresh:function(b){var c,d;return c=this,d=c.config["pre-tags-separator"],b=b||c.getTags().join(d),c.reset(),a.each(b.split(d),function(){c.add(this+"")}),!0},remove:function(b){var c,d,e;if(c=this,a.isArray(b))return a.each(b,function(){c.remove(this+"")});if("string"==typeof b&&(d=b,b=c.$elem.find("input[value="+d+"]").parent(),!b.length))return"Error -> Tag not found";if(b)for(e=c.tags.length;e--;)c.tags[e][0].innerHTML===b[0].innerHTML&&c.tags.splice(e,1);else b=c.tags.pop();return d=d||b.pure_text,b.remove(),c.config["edit-on-delete"]&&(c.emptyInput(),c.valInput(b.pure_text)),c.config["tags-limit"]>0&&c.$type_zone.not(":visible")&&c.tags.length1?d:d[0]:d}}(window.jQuery,window,document);
\ No newline at end of file