Advertisement
Guest User

jquery tagit

a guest
Aug 17th, 2011
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function($){
  2.     $.widget("ui.tagit",{
  3.         options:{
  4.             placeholder:"placeholder",
  5.             maxlength:40,
  6.             tagSource:[],
  7.             triggerKeys:["enter","space","comma","tab"],
  8.             initialTags:[],
  9.             minLength:1,
  10.             select:true,
  11.             allowNewTags:true,
  12.             emptySearch:false
  13.         },
  14.         _keys:{
  15.             backspace:[8],
  16.             enter:[13],
  17.             space:[32],
  18.             comma:[191],
  19.             tab:[9]
  20.             },
  21.         _create:function(){
  22.             $.ui.autocomplete.prototype._renderItem=function(ul,item){
  23.                 var re=new RegExp("^"+this.term);
  24.                 var t=item.label.replace(re,'<span class="autocompleteBold">'+this.term+"</span>");
  25.                 if(item.extra){
  26.                     t='<span class="autocompleteExtra">'+item.extra+":</span> "+t
  27.                     }
  28.                     return $("<li></li>").data("item.autocomplete",item).append("<a>"+t+"</a>").appendTo(ul)
  29.                 };
  30.  
  31.             var self=this;
  32.             this.tagsArray=[];
  33.             this.timer=null;
  34.             this.element.addClass("tagit");
  35.             this.element.children("li").each(function(){
  36.                 self.options.initialTags.push($(this).text())
  37.                 });
  38.             this.element.html('<li class="tagit-new"><input placeholder="'+this.options.placeholder+'" class="tagit-input" type="text" maxlength="'+this.options.maxlength+'" /></li>');
  39.             this.input=this.element.find(".tagit-input");
  40.             $(this.element).click(function(e){
  41.                 if($(e.target).hasClass("tagit-close")){
  42.                     $(e.target).parent().remove();
  43.                     var text=$(e.target).parent().text();
  44.                     self._popTag(text.substr(0,text.length-1))
  45.                     }else{
  46.                     self.input.focus();
  47.                     if(self.options.emptySearch&&$(e.target).hasClass("tagit-input")&&self.input.val()==""&&self.input.autocomplete!=undefined){
  48.                         self.input.autocomplete("search")
  49.                         }
  50.                     }
  51.             });
  52.     var os=this.options.select;
  53.     this.options.appendTo=this.element;
  54.     this.options.source=this.options.tagSource;
  55.     this.options.highlight=true;
  56.     this.options.select=function(event,ui){
  57.         clearTimeout(self.timer);
  58.         if(ui.item.extraeng){
  59.             self._addTag(ui.item.value, ui.item.extraeng)
  60.         } else {
  61.             self._addTag(ui.item.value);
  62.         }
  63.         return false
  64.         };
  65.  
  66.     this.input.autocomplete(this.options);
  67.         this.options.select=os;
  68.         this.input.keydown(function(e){
  69.         var lastLi=self.element.children(".tagit-choice:last");
  70.         if(e.which==self._keys.backspace){
  71.             return self._backspace(lastLi)
  72.             }
  73.             if(self._isInitKey(e.which)){
  74.             e.preventDefault();
  75.             if(self.options.allowNewTags&&$(this).val().length>=self.options.minLength){
  76.                 self._addTag($(this).val())
  77.                 }else{
  78.                 if(!self.options.allowNewTags){
  79.                     self.input.val("")
  80.                     }
  81.                 }
  82.         }
  83.     if(lastLi.hasClass("selected")){
  84.         lastLi.removeClass("selected")
  85.         }
  86.         self.lastKey=e.which
  87.     });
  88. this.input.blur(function(e){
  89.     var v=$(this).val();
  90.     if(self.options.allowNewTags){
  91.         self.timer=setTimeout(function(){
  92.             self._addTag(v)
  93.             },200)
  94.         }
  95.         $(this).val("");
  96.     return false
  97.     });
  98. String.prototype.trim=function(){
  99.     return this.replace(/^\s+|\s+$/g,"")
  100.     };
  101.  
  102. if(this.options.select){
  103.     this.element.after('<select class="tagit-hiddenSelect" name="'+$(this.element).parent().children(".tagitid").attr("id")+'" multiple="multiple"></select>');
  104.     this.select=this.element.siblings(".tagit-hiddenSelect")
  105.     }
  106.     this._initialTags()
  107.     },
  108. _popSelect:function(text){
  109.     this.select.children('option[value="'+text+'"]').remove();
  110.     this.select.change()
  111.     },
  112. _addSelect:function(value,extraeng){
  113.         this.select.append('<option selected="selected" value="'+value+'">'+value+"</option>");
  114.     this.select.change()
  115.     },
  116. _popTag:function(text){
  117.     $.inArray(text,this.tagsArray);
  118.     if(text==undefined){
  119.         text=this.tagsArray.pop()
  120.         }else{
  121.         var index=($.inArray(text,this.tagsArray)==-1?this.tagsArray.length-1:$.inArray(text,this.tagsArray));
  122.         this.tagsArray.splice(index,1)
  123.         }
  124.         if(this.options.select){
  125.         this._popSelect(text)
  126.         }
  127.     },
  128. _addTag:function(value, extraeng){
  129.     this.input.val("");
  130.     value=value.replace(/,+$/,"");
  131.     value=value.trim();
  132.     if(value==""||this._exists(value)){
  133.         return false
  134.         }
  135.         var tag="";
  136.     tag='<li class="tagit-choice">'+value+'<a class="tagit-close">x</a></li>';
  137.     $(tag).insertBefore(this.input.parent());
  138.     this.input.val("");
  139.     this.tagsArray.push(value);
  140.     if(this.options.select){
  141.         this._addSelect(value,extraeng)
  142.         }
  143.         return true
  144.     },
  145. _exists:function(value){
  146.     if(this.tagsArray.length==0||$.inArray(value,this.tagsArray)==-1){
  147.         return false
  148.         }
  149.         return true
  150.     },
  151. _isInitKey:function(keyCode){
  152.     var keyName="";
  153.     for(var key in this._keys){
  154.         if($.inArray(keyCode,this._keys[key])!=-1){
  155.             keyName=key
  156.             }
  157.         }
  158.     if($.inArray(keyName,this.options.triggerKeys)!=-1){
  159.     return true
  160.     }
  161.     return false
  162. },
  163. _removeTag:function(){
  164.     this._popTag();
  165.     this.element.children(".tagit-choice:last").remove()
  166.     },
  167. _backspace:function(li){
  168.     if(this.input.val()==""){
  169.         if(this.lastKey==this._keys.backspace){
  170.             this._popTag(li.html().replace('<a class="tagit-close">x</a>',""));
  171.             li.remove();
  172.             this.lastKey=null
  173.             }else{
  174.             li.addClass("selected");
  175.             this.lastKey=this._keys.backspace
  176.             }
  177.         }
  178.     return true
  179. },
  180. _initialTags:function(){
  181.     var input=this;
  182.     if(this.options.initialTags.length!=0){
  183.         this.options.initialTags.each(function(i){
  184.             input._addTag(i)
  185.             })
  186.         }
  187.     },
  188. tags:function(){
  189.     return this.tagsArray
  190.     },
  191. destroy:function(){
  192.     $.Widget.prototype.destroy.apply(this,arguments);
  193.     this.tagsArray=[]
  194.     }
  195. })
  196. })(jQuery);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement