forked from Pixabay/jQuery-tagEditor
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjquery.tag-editor.min.js
1 lines (1 loc) · 9.04 KB
/
jquery.tag-editor.min.js
1
!function(a){a.fn.tagEditorInput=function(){var b=" ",c=a(this),d=parseInt(c.css("fontSize")),e=a("<span/>").css({position:"absolute",top:-9999,left:-9999,width:"auto",fontSize:c.css("fontSize"),fontFamily:c.css("fontFamily"),fontWeight:c.css("fontWeight"),letterSpacing:c.css("letterSpacing"),whiteSpace:"nowrap"}),f=function(){if(b!==(b=c.val())){e.text(b);var a=e.width()+d;20>a&&(a=20),a!=c.width()&&c.width(a)}};return e.insertAfter(c),c.bind("keyup keydown focus",f)},a.fn.tagEditor=function(b,c,d){function e(a){return a.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}var f,g=a.extend({},a.fn.tagEditor.defaults,b),h=this;if(g.dregex=new RegExp("["+g.delimiter.replace("-","-")+"]","g"),"string"==typeof b){var j=[];return h.each(function(){var e=a(this),f=e.data("options"),g=e.next(".tag-editor");if("getTags"==b)j.push({field:e[0],editor:g,tags:g.data("tags")});else if("addTag"==b){if(f.maxTags&&g.data("tags").length>=f.maxTags)return!1;a('<li><div class="tag-editor-spacer"> '+f.delimiter[0]+'</div><div class="tag-editor-tag"></div><div class="tag-editor-delete"><i></i></div></li>').appendTo(g).find(".tag-editor-tag").html('<input type="text" maxlength="'+f.maxLength+'">').addClass("active").find("input").val(c).blur(),d?a(".placeholder",g).remove():g.click()}else"removeTag"==b?(a(".tag-editor-tag",g).filter(function(){return a(this).text()==c}).closest("li").find(".tag-editor-delete").click(),d||g.click()):"destroy"==b&&e.removeClass("tag-editor-hidden-src").removeData("options").off("focus.tag-editor").next(".tag-editor").remove()}),"getTags"==b?j:this}return window.getSelection&&a(document).off("keydown.tag-editor").on("keydown.tag-editor",function(b){if(8==b.which||46==b.which||b.ctrlKey&&88==b.which){try{var c=getSelection(),d="BODY"==document.activeElement.tagName?a(c.getRangeAt(0).startContainer.parentNode).closest(".tag-editor"):0}catch(a){d=0}if(c.rangeCount>0&&d&&d.length){var e=[],f=c.toString().split(d.prev().data("options").dregex);for(i=0;i<f.length;i++){var g=a.trim(f[i]);g&&e.push(g)}return a(".tag-editor-tag",d).each(function(){~a.inArray(a(this).text(),e)&&a(this).closest("li").find(".tag-editor-delete").click()}),!1}}}),h.each(function(){function i(){!g.placeholder||c.length||a(".deleted, .placeholder, input",d).length||d.append('<li class="placeholder"><div>'+g.placeholder+"</div></li>")}function j(e){var f=c.toString();c=a(".tag-editor-tag:not(.deleted)",d).map(function(b,c){var d=a.trim(a(this).hasClass("active")?a(this).find("input").val():a(c).text());if(d)return d}).get(),d.data("tags",c),b.val(c.join(g.delimiter[0])),e||f!=c.toString()&&g.onChange(b,d,c),i()}function k(f){for(var n,h=f.closest("li"),i=f.val().replace(/ +/," ").split(g.dregex),k=f.data("old_tag"),l=c.slice(0),m=!1,o=0;o<i.length;o++)if(p=a.trim(i[o]).slice(0,g.maxLength),g.forceLowercase&&(p=p.toLowerCase()),n=g.beforeTagSave(b,d,l,k,p),p=n||p,n!==!1&&p&&(g.removeDuplicates&&~a.inArray(p,l)&&a(".tag-editor-tag",d).each(function(){a(this).text()==p&&a(this).closest("li").remove()}),l.push(p),h.before('<li><div class="tag-editor-spacer"> '+g.delimiter[0]+'</div><div class="tag-editor-tag">'+e(p)+'</div><div class="tag-editor-delete"><i></i></div></li>'),g.maxTags&&l.length>=g.maxTags)){m=!0;break}f.attr("maxlength",g.maxLength).removeData("old_tag").val(""),m?f.blur():f.focus(),j()}var b=a(this),c=[],d=a("<ul "+(g.clickDelete?'oncontextmenu="return false;" ':"")+'class="tag-editor"></ul>').insertAfter(b);b.addClass("tag-editor-hidden-src").data("options",g).on("focus.tag-editor",function(){d.click()}),d.append('<li style="width:1px"> </li>');var h='<li><div class="tag-editor-spacer"> '+g.delimiter[0]+'</div><div class="tag-editor-tag"></div><div class="tag-editor-delete"><i></i></div></li>';d.click(function(b,c){var e,j,i=99999;if(!window.getSelection||""==getSelection())return g.maxTags&&d.data("tags").length>=g.maxTags?(d.find("input").blur(),!1):(f=!0,a("input:focus",d).blur(),!!f&&(f=!0,a(".placeholder",d).remove(),c&&c.length?j="before":a(".tag-editor-tag",d).each(function(){var d=a(this),f=d.offset(),g=f.left,h=f.top;b.pageY>=h&&b.pageY<=h+d.height()&&(b.pageX<g?(j="before",e=g-b.pageX):(j="after",e=b.pageX-g-d.width()),e<i&&(i=e,c=d))}),"before"==j?a(h).insertBefore(c.closest("li")).find(".tag-editor-tag").click():"after"==j?a(h).insertAfter(c.closest("li")).find(".tag-editor-tag").click():a(h).appendTo(d).find(".tag-editor-tag").click(),!0))}),d.on("click",".tag-editor-delete",function(e){if(a(this).prev().hasClass("active"))return a(this).closest("li").find("input").caret(-1),!1;var f=a(this).closest("li"),h=f.find(".tag-editor-tag");return g.beforeTagDelete(b,d,c,h.text())!==!1&&(h.addClass("deleted").animate({width:0},g.animateDelete,function(){f.remove(),i()}),j(),!1)}),g.clickDelete&&d.on("mousedown",".tag-editor-tag",function(e){if(e.ctrlKey||e.which>1){var f=a(this).closest("li"),h=f.find(".tag-editor-tag");return g.beforeTagDelete(b,d,c,h.text())!==!1&&(h.addClass("deleted").animate({width:0},g.animateDelete,function(){f.remove(),i()}),j(),!1)}}),d.on("click",".tag-editor-tag",function(b){if(g.clickDelete&&(b.ctrlKey||b.which>1))return!1;if(!a(this).hasClass("active")){var c=a(this).text(),f=Math.abs((a(this).offset().left-b.pageX)/a(this).width()),h=parseInt(c.length*f),i=a(this).html('<input type="text" maxlength="'+g.maxLength+'" value="'+e(c)+'">').addClass("active").find("input");if(i.data("old_tag",c).tagEditorInput().focus().caret(h),g.autocomplete){var j=a.extend({},g.autocomplete),k="select"in j?g.autocomplete.select:"";j.select=function(b,c){k&&k(b,c),setTimeout(function(){d.trigger("click",[a(".active",d).find("input").closest("li").next("li").find(".tag-editor-tag")])},20)},i.autocomplete(j)}}return!1}),d.on("blur","input",function(h){h.stopPropagation();var l=a(this),m=l.data("old_tag"),n=a.trim(l.val().replace(/ +/," ").replace(g.dregex,g.delimiter[0]));if(n){if(n.indexOf(g.delimiter[0])>=0)return void k(l);if(n!=m)if(g.forceLowercase&&(n=n.toLowerCase()),cb_val=g.beforeTagSave(b,d,c,m,n),n=cb_val||n,cb_val===!1){if(m)return l.val(m).focus(),f=!1,void j();try{l.closest("li").remove()}catch(a){}m&&j()}else g.removeDuplicates&&a(".tag-editor-tag:not(.active)",d).each(function(){a(this).text()==n&&a(this).closest("li").remove()})}else{if(m&&g.beforeTagDelete(b,d,c,m)===!1)return l.val(m).focus(),f=!1,void j();try{l.closest("li").remove()}catch(a){}m&&j()}l.parent().html(e(n)).removeClass("active"),n!=m&&j(),i()});var l;d.on("paste","input",function(b){a(this).removeAttr("maxlength"),l=a(this),setTimeout(function(){k(l)},30)});var m;d.on("keypress","input",function(b){g.delimiter.indexOf(String.fromCharCode(b.which))>=0&&(m=a(this),setTimeout(function(){k(m)},20))}),d.on("keydown","input",function(c){var e=a(this);if((37==c.which||!g.autocomplete&&38==c.which)&&!e.caret()||8==c.which&&!e.val()){var f=e.closest("li").prev("li").find(".tag-editor-tag");return f.length?f.click().find("input").caret(-1):!e.val()||g.maxTags&&d.data("tags").length>=g.maxTags||a(h).insertBefore(e.closest("li")).find(".tag-editor-tag").click(),!1}if((39==c.which||!g.autocomplete&&40==c.which)&&e.caret()==e.val().length){var i=e.closest("li").next("li").find(".tag-editor-tag");return i.length?i.click().find("input").caret(0):e.val()&&d.click(),!1}if(9==c.which){if(c.shiftKey){var f=e.closest("li").prev("li").find(".tag-editor-tag");if(f.length)f.click().find("input").caret(0);else{if(!e.val()||g.maxTags&&d.data("tags").length>=g.maxTags)return b.attr("disabled","disabled"),void setTimeout(function(){b.removeAttr("disabled")},30);a(h).insertBefore(e.closest("li")).find(".tag-editor-tag").click()}return!1}var i=e.closest("li").next("li").find(".tag-editor-tag");if(i.length)i.click().find("input").caret(0);else{if(!e.val())return;d.click()}return!1}if(!(46!=c.which||a.trim(e.val())&&e.caret()!=e.val().length)){var i=e.closest("li").next("li").find(".tag-editor-tag");return i.length?i.click().find("input").caret(0):e.val()&&d.click(),!1}if(13==c.which)return d.trigger("click",[e.closest("li").next("li").find(".tag-editor-tag")]),g.maxTags&&d.data("tags").length>=g.maxTags&&d.find("input").blur(),!1;if(36!=c.which||e.caret()){if(35==c.which&&e.caret()==e.val().length)d.find(".tag-editor-tag").last().click();else if(27==c.which)return e.val(e.data("old_tag")?e.data("old_tag"):"").blur(),!1}else d.find(".tag-editor-tag").first().click()});for(var n=g.initialTags.length?g.initialTags:b.val().split(g.dregex),o=0;o<n.length&&!(g.maxTags&&o>=g.maxTags);o++){var p=a.trim(n[o].replace(/ +/," "));p&&(g.forceLowercase&&(p=p.toLowerCase()),c.push(p),d.append('<li><div class="tag-editor-spacer"> '+g.delimiter[0]+'</div><div class="tag-editor-tag">'+e(p)+'</div><div class="tag-editor-delete"><i></i></div></li>'))}j(!0),g.sortable&&a.fn.sortable&&d.sortable({distance:5,cancel:".tag-editor-spacer, input",helper:"clone",update:function(){j()}})})},a.fn.tagEditor.defaults={initialTags:[],maxTags:0,maxLength:50,delimiter:",;",placeholder:"",forceLowercase:!0,removeDuplicates:!0,clickDelete:!1,animateDelete:175,sortable:!0,autocomplete:null,onChange:function(){},beforeTagSave:function(){},beforeTagDelete:function(){}}}(jQuery);