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