diff --git a/js/jquery.taghandler.js b/js/jquery.taghandler.js index b0131e1..c0e29af 100644 --- a/js/jquery.taghandler.js +++ b/js/jquery.taghandler.js @@ -262,6 +262,81 @@ along with this program. If not, see < http://www.gnu.org/licenses/ >. $("
").attr({ id: tagContainer.id + "_loader", title: "Saving Tags" }).addClass("tagLoader").appendTo(tagContainerObject.parent()); } + // adds autocomplete functionality for the tag names + if (opts.autocomplete && typeof($.fn.autocomplete) == 'function' && opts.initLoad) { + $(inputField).autocomplete({ + source: tags.availableTags, + select: function (event, ui) { + var $el = $(this); + if (!checkTag($.trim(ui.item.value), tags.assignedTags)) { + if (opts.maxTags > 0 && tags.assignedTags.length >= opts.maxTags) { + alert('Maximum tags allowed: ' + opts.maxTags); + } + else { + var newTag = $.trim(ui.item.value); + var rc = 1; + if (typeof(opts.onAdd) == "function") { + rc = opts.onAdd.call(this, newTag); + } + if (rc || typeof(rc) == "undefined") { + tags = addTag(this, newTag, tags, opts.sortTags); + if (opts.updateURL !== '' && opts.autoUpdate) { + saveTags(tags, opts, tagContainer.id); + } + $(inputField).autocomplete("option", "source", tags.availableTags); + if (typeof(opts.afterAdd) == "function") { + opts.afterAdd.call(this, newTag); + } + } + } + $el.focus(); + } + $el.val(""); + return false; + }, + minLength: opts.minChars + }); + } + // Make an AJAX request to get the list of tags based on typed data + else if (opts.autocomplete && typeof($.fn.autocomplete) == 'function') { + $(inputField).autocomplete({ + source: function (request, response) { + opts.getData[opts.queryname] = request.term; + var lastXhr = $.getJSON(opts.getURL, opts.getData, function (data, status, xhr) { + response(data.availableTags); + }); + }, + select: function (event, ui) { + var $el = $(this); + if (!checkTag($.trim(ui.item.value), tags.assignedTags)) { + if (opts.maxTags > 0 && tags.assignedTags.length >= opts.maxTags) { + alert('Maximum tags allowed: ' + opts.maxTags); + } + else { + var newTag = $.trim(ui.item.value); + var rc = 1; + if (typeof(opts.onAdd) == "function") { + opts.onAdd.call(this, newTag); + } + if (rc || typeof(rc) == "undefined") { + tags = addTag(this, $.trim(ui.item.value), tags, opts.sortTags); + if (opts.updateURL !== '' && opts.autoUpdate) { + saveTags(tags, opts, tagContainer.id); + } + if (typeof(opts.afterAdd) == "function") { + opts.afterAdd.call(this, newTag); + } + } + } + $el.focus(); + } + $el.val(''); + return false; + }, + minLength: opts.minChars + }); + } + // initializes the tag lists // tag lists will be pulled from a URL if (opts.getURL !== '' && opts.initLoad) { @@ -429,81 +504,6 @@ along with this program. If not, see < http://www.gnu.org/licenses/ >. } }); - // adds autocomplete functionality for the tag names - if (opts.autocomplete && typeof($.fn.autocomplete) == 'function' && opts.initLoad) { - $(inputField).autocomplete({ - source: tags.availableTags, - select: function (event, ui) { - var $el = $(this); - if (!checkTag($.trim(ui.item.value), tags.assignedTags)) { - if (opts.maxTags > 0 && tags.assignedTags.length >= opts.maxTags) { - alert('Maximum tags allowed: ' + opts.maxTags); - } - else { - var newTag = $.trim(ui.item.value); - var rc = 1; - if (typeof(opts.onAdd) == "function") { - rc = opts.onAdd.call(this, newTag); - } - if (rc || typeof(rc) == "undefined") { - tags = addTag(this, newTag, tags, opts.sortTags); - if (opts.updateURL !== '' && opts.autoUpdate) { - saveTags(tags, opts, tagContainer.id); - } - $(inputField).autocomplete("option", "source", tags.availableTags); - if (typeof(opts.afterAdd) == "function") { - opts.afterAdd.call(this, newTag); - } - } - } - $el.focus(); - } - $el.val(""); - return false; - }, - minLength: opts.minChars - }); - } - // Make an AJAX request to get the list of tags based on typed data - else if (opts.autocomplete && typeof($.fn.autocomplete) == 'function') { - $(inputField).autocomplete({ - source: function (request, response) { - opts.getData[opts.queryname] = request.term; - var lastXhr = $.getJSON(opts.getURL, opts.getData, function (data, status, xhr) { - response(data.availableTags); - }); - }, - select: function (event, ui) { - var $el = $(this); - if (!checkTag($.trim(ui.item.value), tags.assignedTags)) { - if (opts.maxTags > 0 && tags.assignedTags.length >= opts.maxTags) { - alert('Maximum tags allowed: ' + opts.maxTags); - } - else { - var newTag = $.trim(ui.item.value); - var rc = 1; - if (typeof(opts.onAdd) == "function") { - opts.onAdd.call(this, newTag); - } - if (rc || typeof(rc) == "undefined") { - tags = addTag(this, $.trim(ui.item.value), tags, opts.sortTags); - if (opts.updateURL !== '' && opts.autoUpdate) { - saveTags(tags, opts, tagContainer.id); - } - if (typeof(opts.afterAdd) == "function") { - opts.afterAdd.call(this, newTag); - } - } - } - $el.focus(); - } - $el.val(''); - return false; - }, - minLength: opts.minChars - }); - } - // sets the input field to show the autocomplete list on focus // when there is no value $(inputField).focus(function () { diff --git a/js/jquery.taghandler.min.js b/js/jquery.taghandler.min.js index 5406a00..5e001f8 100644 --- a/js/jquery.taghandler.min.js +++ b/js/jquery.taghandler.min.js @@ -1 +1 @@ -(function($){var methods={getSerializedTags:function(){var currentTags=[];$(this).find("li.tagItem").each(function(i,e){currentTags.push($(e).text())});return currentTags.join(',')},getTags:function(){var currentTags=[];$(this).find("li.tagItem").each(function(i,e){currentTags.push($(e).text())});return currentTags},version:function(){return"1.3.0"}};$.fn.tagHandler=function(options){if(typeof(options)=='object'||typeof(options)=='undefined'){var opts=$.extend({},$.fn.tagHandler.defaults,options);debug($(this),opts);return this.each(function(){if(!$(this).is('ul')){return true}var tagContainer=this;var tagContainerObject=$(tagContainer);if(!tagContainer.id){var d=new Date();tagContainer.id=d.getTime()}tagContainerObject.wrap('');tagContainerObject.addClass(opts.className+"Container");if(opts.allowEdit){tagContainerObject.html('')}var inputField=tagContainerObject.find(".tagInputField");var tags=[];tags.availableTags=[];tags.originalTags=[];tags.assignedTags=[];if(opts.updateURL!==''){if(!opts.autoUpdate){$("").attr({id:tagContainer.id+"_save",title:"Save Tags"}).addClass("tagUpdate").click(function(){saveTags(tags,opts,tagContainer.id)}).appendTo(tagContainerObject.parent())}$("").attr({id:tagContainer.id+"_loader",title:"Saving Tags"}).addClass("tagLoader").appendTo(tagContainerObject.parent())}if(opts.getURL!==''&&opts.initLoad){$.ajax({url:opts.getURL,cache:false,data:opts.getData,dataType:'json',success:function(data,text,xhr){if(data.availableTags.length){tags.availableTags=data.availableTags.slice();tags.originalTags=tags.availableTags.slice()}if(opts.sortTags){tags=sortTags(tags)}if(data.assignedTags.length){tags.assignedTags=data.assignedTags.slice();if(opts.sortTags){tags=sortTags(tags)}tags=addAssignedTags(opts,tags,inputField,tagContainer)}if(opts.autocomplete&&typeof($.fn.autocomplete)=='function'&&opts.allowEdit){$(inputField).autocomplete("option","source",tags.availableTags)}},error:function(xhr,text,error){debug(xhr,text,error);alert(opts.msgError)}})}else if(opts.getURL!==''){tags.assignedTags=opts.assignedTags.slice();if(opts.sortTags){tags=sortTags(tags)}tags=addAssignedTags(opts,tags,inputField,tagContainer)}else{if(opts.availableTags.length){tags.availableTags=opts.availableTags.slice();tags.originalTags=tags.availableTags.slice()}if(opts.sortTags){tags=sortTags(tags)}if(opts.assignedTags.length){tags.assignedTags=opts.assignedTags.slice();if(opts.sortTags){tags=sortTags(tags)}tags=addAssignedTags(opts,tags,inputField,tagContainer)}if(opts.autocomplete&&typeof($.fn.autocomplete)=='function'&&opts.allowEdit&&opts.initLoad){$(inputField).autocomplete("option","source",tags.availableTags)}}if(opts.allowEdit){tagContainerObject.delegate("li.tagItem","click",function(){var $el=$(this);var rc=1;if(typeof(opts.onDelete)=="function"){rc=opts.onDelete.call(this,$.trim($el.text()))}if(rc){tags=removeTag($el,tags,opts.sortTags);if(opts.updateURL!==''&&opts.autoUpdate){saveTags(tags,opts,tagContainer.id)}}if(typeof(opts.afterDelete)=="function"){opts.afterDelete.call(this,$.trim($el.text()))}if(opts.autocomplete&&typeof($.fn.autocomplete)=='function'&&opts.initLoad){$(inputField).autocomplete("option","source",tags.availableTags)}});$(inputField).keypress(function(e){var $el=$(this);if(e.which===13||e.which===44||e.which===opts.delimiter.charCodeAt(0)){e.preventDefault();if($el.val()!==""&&!checkTag($.trim($el.val()),tags.assignedTags)){if(!opts.allowAdd&&!checkTag($.trim($el.val()),tags.availableTags)){alert(opts.msgNoNewTag);return}if(opts.maxTags>0&&tags.assignedTags.length>=opts.maxTags){alert('Maximum tags allowed: '+opts.maxTags)}else{var newTag=$.trim($el.val());var rc=1;if(typeof(opts.onAdd)=="function"){rc=opts.onAdd.call(this,newTag)}if(rc||typeof(rc)=="undefined"){tags=addTag(this,newTag,tags,opts.sorttags);if(opts.updateURL!==''&&opts.autoUpdate){saveTags(tags,opts,tagContainer.id)}if(opts.autocomplete&&typeof($.fn.autocomplete)=='function'&&opts.initload){$(inputField).autocomplete("option","source",tags.availableTags)}if(typeof(opts.afterAdd)=="function"){opts.afterAdd.call(this,newTag)}}}$el.val("");$el.focus()}}});$(inputField).keydown(function(e){var $el=$(this);if(e.which===8&&$el.val()===""){var deleted_tag=tagContainerObject.find(".tagItem:last").text();if(typeof(opts.onDelete)=="function"){opts.onDelete.call(this,$.trim(deleted_tag))}tags=removeTag(tagContainerObject.find(".tagItem:last"),tags,opts.sortTags);if(opts.updateURL!==''&&opts.autoUpdate){saveTags(tags,opts,tagContainer.id)}if(typeof(opts.afterDelete)=="function"){opts.afterDelete.call(this,$.trim(deleted_tag))}if(opts.autocomplete&&typeof($.fn.autocomplete)=='function'&&opts.initLoad){$(inputField).autocomplete("option","source",tags.availableTags)}$el.focus()}});if(opts.autocomplete&&typeof($.fn.autocomplete)=='function'&&opts.initLoad){$(inputField).autocomplete({source:tags.availableTags,select:function(event,ui){var $el=$(this);if(!checkTag($.trim(ui.item.value),tags.assignedTags)){if(opts.maxTags>0&&tags.assignedTags.length>=opts.maxTags){alert('Maximum tags allowed: '+opts.maxTags)}else{var newTag=$.trim(ui.item.value);var rc=1;if(typeof(opts.onAdd)=="function"){rc=opts.onAdd.call(this,newTag)}if(rc||typeof(rc)=="undefined"){tags=addTag(this,newTag,tags,opts.sortTags);if(opts.updateURL!==''&&opts.autoUpdate){saveTags(tags,opts,tagContainer.id)}$(inputField).autocomplete("option","source",tags.availableTags);if(typeof(opts.afterAdd)=="function"){opts.afterAdd.call(this,newTag)}}}$el.focus()}$el.val("");return false},minLength:opts.minChars})}else if(opts.autocomplete&&typeof($.fn.autocomplete)=='function'){$(inputField).autocomplete({source:function(request,response){opts.getData[opts.queryname]=request.term;var lastXhr=$.getJSON(opts.getURL,opts.getData,function(data,status,xhr){response(data.availableTags)})},select:function(event,ui){var $el=$(this);if(!checkTag($.trim(ui.item.value),tags.assignedTags)){if(opts.maxTags>0&&tags.assignedTags.length>=opts.maxTags){alert('Maximum tags allowed: '+opts.maxTags)}else{var newTag=$.trim(ui.item.value);var rc=1;if(typeof(opts.onAdd)=="function"){opts.onAdd.call(this,newTag)}if(rc||typeof(rc)=="undefined"){tags=addTag(this,$.trim(ui.item.value),tags,opts.sortTags);if(opts.updateURL!==''&&opts.autoUpdate){saveTags(tags,opts,tagContainer.id)}if(typeof(opts.afterAdd)=="function"){opts.afterAdd.call(this,newTag)}}}$el.focus()}$el.val('');return false},minLength:opts.minChars})}$(inputField).focus(function(){if($(inputField).val()===''&&opts.autocomplete&&typeof($.fn.autocomplete)=='function'&&opts.initLoad){$(inputField).autocomplete("search","")}});tagContainerObject.click(function(){$(inputField).focus()})}this.getTags=function(){return tags.assignedTags};return 1})}else if(typeof(options)=="string"&&methods[options]){return methods[options].apply(this,Array.prototype.slice.call(arguments,1))}};$.fn.tagHandler.defaults={allowEdit:true,allowAdd:true,assignedTags:[],autocomplete:false,autoUpdate:false,availableTags:[],className:'tagHandler',debug:false,delimiter:'',getData:{},getURL:'',initLoad:true,maxTags:0,minChars:0,msgNoNewTag:"You don't have permission to create a new tag.",msgError:"There was an error getting the tag list.",onAdd:{},onDelete:{},afterAdd:{},afterDelete:{},queryname:'q',sortTags:true,updateData:{},updateURL:''};function checkTag(value,tags){var check=false;jQuery.each(tags,function(i,e){if(e===value){check=true;return false}});return check}function removeTagFromList(value,tags){jQuery.each(tags,function(i,e){if(e===value){tags.splice(i,1)}});return tags}function addTag(tagField,value,tags,sort){tags.assignedTags.push(value);tags.availableTags=removeTagFromList(value,tags.availableTags);$("").addClass("tagItem").text(value).insertBefore($(tagField).parent());if(sort){tags=sortTags(tags)}return tags}function removeTag(tag,tags,sort){var value=$(tag).text();tags.assignedTags=removeTagFromList(value,tags.assignedTags);if(checkTag(value,tags.originalTags)){tags.availableTags.push(value)}$(tag).remove();if(sort){tags=sortTags(tags)}return tags}function sortTags(tags){tags.availableTags=tags.availableTags.sort();tags.assignedTags=tags.assignedTags.sort();tags.originalTags=tags.originalTags.sort();return tags}function saveTags(tags,opts,tcID){var sendData={tags:tags.assignedTags};$.extend(sendData,opts.updateData);$.ajax({type:'POST',url:opts.updateURL,cache:false,data:sendData,dataType:'json',beforeSend:function(){if($("#"+tcID+"_save").length){$("#"+tcID+"_save").fadeOut(200,function(){$("#"+tcID+"_loader").fadeIn(200)})}else{$("#"+tcID+"_loader").fadeIn(200)}},complete:function(){$("#"+tcID+"_loader").fadeOut(200,function(){if($("#"+tcID+"_save").length){$("#"+tcID+"_save").fadeIn(200)}})}})}function addAssignedTags(opts,tags,inputField,tagContainer){$(tags.assignedTags).each(function(i,e){if(opts.allowEdit){$("").addClass("tagItem").text(e).insertBefore($(inputField).parent())}else{$("").addClass("tagItem").css("cursor","default").text(e).appendTo($(tagContainer))}tags.availableTags=removeTagFromList(e,tags.availableTags)});return tags}function debug(tagContainer,options){if(options.debug&&window.console&&window.console.log){window.console.log(tagContainer);window.console.log(options);window.console.log($.fn.tagHandler.defaults)}}})(jQuery); \ No newline at end of file +(function(b){function l(b,a){var e=!1;jQuery.each(a,function(a,f){if(f===b)return e=!0,!1});return e}function m(b,a){jQuery.each(a,function(e,g){g===b&&a.splice(e,1)});return a}function n(d,a,e,g){e.assignedTags.push(a);e.availableTags=m(a,e.availableTags);b("").addClass("tagItem").text(a).insertBefore(b(d).parent());g&&(e=j(e));return e}function q(d,a,e){var g=b(d).text();a.assignedTags=m(g,a.assignedTags);l(g,a.originalTags)&&a.availableTags.push(g);b(d).remove();e&&(a=j(a));return a}function j(b){b.availableTags= b.availableTags.sort();b.assignedTags=b.assignedTags.sort();b.originalTags=b.originalTags.sort();return b}function k(d,a,e){d={tags:d.assignedTags};b.extend(d,a.updateData);b.ajax({type:"POST",url:a.updateURL,cache:!1,data:d,dataType:"json",beforeSend:function(){b("#"+e+"_save").length?b("#"+e+"_save").fadeOut(200,function(){b("#"+e+"_loader").fadeIn(200)}):b("#"+e+"_loader").fadeIn(200)},complete:function(){b("#"+e+"_loader").fadeOut(200,function(){b("#"+e+"_save").length&&b("#"+e+"_save").fadeIn(200)})}})} function p(d,a,e,g){b(a.assignedTags).each(function(f,c){d.allowEdit?b("").addClass("tagItem").text(c).insertBefore(b(e).parent()):b("").addClass("tagItem").css("cursor","default").text(c).appendTo(b(g));a.availableTags=m(c,a.availableTags)});return a}function r(d,a){a.debug&&(window.console&&window.console.log)&&(window.console.log(d),window.console.log(a),window.console.log(b.fn.tagHandler.defaults))}var s={getSerializedTags:function(){var d=[];b(this).find("li.tagItem").each(function(a, e){d.push(b(e).text())});return d.join(",")},getTags:function(){var d=[];b(this).find("li.tagItem").each(function(a,e){d.push(b(e).text())});return d},version:function(){return"1.3.0"}};b.fn.tagHandler=function(d){if("object"==typeof d||"undefined"==typeof d){var a=b.extend({},b.fn.tagHandler.defaults,d);r(b(this),a);return this.each(function(){if(!b(this).is("ul"))return!0;var e=this,d=b(e);e.id||(e.id=(new Date).getTime());d.wrap('');d.addClass(a.className+"Container"); a.allowEdit&&d.html('');var f=d.find(".tagInputField"),c=[];c.availableTags=[];c.originalTags=[];c.assignedTags=[];""!==a.updateURL&&(a.autoUpdate||b("").attr({id:e.id+"_save",title:"Save Tags"}).addClass("tagUpdate").click(function(){k(c,a,e.id)}).appendTo(d.parent()),b("").attr({id:e.id+"_loader",title:"Saving Tags"}).addClass("tagLoader").appendTo(d.parent()));a.autocomplete&&"function"==typeof b.fn.autocomplete&& a.initLoad?b(f).autocomplete({source:c.availableTags,select:function(d,h){var t=b(this);if(!l(b.trim(h.item.value),c.assignedTags)){if(0