scribeengine/scribeengine/public/scripts/jquery.tag.editor.js

114 lines
4.1 KiB
JavaScript

/*
@author: Karl-Johan Sjögren / http://blog.crazybeavers.se/
@url: http://blog.crazybeavers.se/wp-content/demos/jquery.tag.editor/
@license: Creative Commons License - ShareAlike http://creativecommons.org/licenses/by-sa/3.0/
@version: 1.1
*/
(function($) {
$.fn.extend({
tagEditor: function(options) {
var defaults = {
separator: ',',
items: [],
className: 'tagEditor',
confirmRemoval: false,
completeOnSeparator: false,
completeOnBlur: false
}
var options = $.extend(defaults, options);
var listBase, textBase = this, hiddenText;
var itemBase = [];
return this.each(function() {
textBase.id = options.formField;
hiddenText = $(document.createElement('input'));
hiddenText.attr('type', 'hidden');
textBase.after(hiddenText);
listBase = $(document.createElement('ul'));
listBase.attr('class', options.className);
$(this).after(listBase);
for (var i = 0; i < options.items.length; i++) {
addTag(jQuery.trim(options.items[i]));
}
buildArray();
$(this).keypress(handleKeys);
$(this).blur(parse);
var form = $(this).parents("form");
form.submit(function() {
parse();
hiddenText.val(itemBase.join(options.separator));
hiddenText.attr("id", textBase.attr("id"));
hiddenText.attr("name", textBase.attr("name"));
textBase.attr("id", textBase.attr("id") + '_old');
textBase.attr("name", textBase.attr("name") + '_old');
});
function addTag(tag) {
tag = jQuery.trim(tag);
for (var i = 0; i < itemBase.length; i++) {
if (itemBase[i].toLowerCase() == tag.toLowerCase())
return;
}
var item = $(document.createElement('li'));
item.text(tag);
item.attr('title', 'Remove tag');
item.click(function() {
if (options.confirmRemoval)
if (!confirm("Do you really want to remove the tag?"))
return;
item.remove();
parse();
});
listBase.append(item);
}
function buildArray() {
itemBase = [];
var items = $("li", listBase);
for (var i = 0; i < items.length; i++) {
itemBase.push(jQuery.trim($(items[i]).text()));
}
}
function parse() {
var items = textBase.val().split(options.separator);
for (var i = 0; i < items.length; i++) {
var trimmedItem = jQuery.trim(items[i]);
if (trimmedItem.length > 0)
addTag(trimmedItem);
}
textBase.val("");
buildArray();
}
function handleKeys(ev) {
if (options.completeOnSeparator) {
if (String.fromCharCode(ev.keyCode) == options.separator) {
parse();
return false;
}
}
switch (ev.keyCode) {
case 13:
{
parse();
return false;
}
}
}
});
}
});
})(jQuery);