diff options
Diffstat (limited to 'themes/default/js/plugins/jquery.fcbkcomplete.js')
-rw-r--r-- | themes/default/js/plugins/jquery.fcbkcomplete.js | 495 |
1 files changed, 276 insertions, 219 deletions
diff --git a/themes/default/js/plugins/jquery.fcbkcomplete.js b/themes/default/js/plugins/jquery.fcbkcomplete.js index 86b3b6ab2..3fb094305 100644 --- a/themes/default/js/plugins/jquery.fcbkcomplete.js +++ b/themes/default/js/plugins/jquery.fcbkcomplete.js @@ -1,125 +1,169 @@ -/* - FCBKcomplete 2.7 +/** + FCBKcomplete 2.7.5 - Jquery version required: 1.2.x, 1.3.x, 1.4.x + Based on TextboxList by Guillermo Rauch http://devthought.com/ + Changelog: - - 2.00 new version of fcbkcomplete + - 2.00 new version of fcbkcomplete - 2.01 fixed bugs & added features - fixed filter bug for preadded items - focus on the input after selecting tag - the element removed pressing backspace when the element is selected - input tag in the control has a border in IE7 - added iterate over each match and apply the plugin separately - set focus on the input after selecting tag + fixed filter bug for preadded items + focus on the input after selecting tag + the element removed pressing backspace when the element is selected + input tag in the control has a border in IE7 + added iterate over each match and apply the plugin separately + set focus on the input after selecting tag - 2.02 fixed fist element selected bug - fixed defaultfilter error bug + fixed defaultfilter error bug - - 2.5 removed selected="selected" attribute due ie bug - element search algorithm changed - better performance fix added - fixed many small bugs - onselect event added - onremove event added + - 2.5 removed selected="selected" attribute due ie bug + element search algorithm changed + better performance fix added + fixed many small bugs + onselect event added + onremove event added - - 2.6 ie6/7 support fix added - added new public method addItem due request - added new options "firstselected" that you can set true/false to select first element on dropdown list - autoexpand input element added - removeItem bug fixed - and many more bug fixed - fixed public method to use it $("elem").trigger("addItem",[{"title": "test", "value": "test"}]); - -- 2.7 jquery 1.4 compability - item lock possability added by adding locked class to preadded option <option value="value" class="selected locked">text</option> - maximum item that can be added to the list + - 2.6 ie6/7 support fix added + added new public method addItem due request + added new options "firstselected" that you can set true/false to select first element on dropdown list + autoexpand input element added + removeItem bug fixed + and many more bug fixed + fixed public method to use it $("elem").trigger("addItem",[{"title": "test", "value": "test"}]); + +- 2.7 jquery 1.4 compability + item lock possability added by adding locked class to preadded option <option value="value" class="selected locked">text</option> + maximum item that can be added + +- 2.7.1 bug fixed + ajax delay added thanks to http://github.com/dolorian + +- 2.7.2 some minor bug fixed + minified version recompacted due some problems + +- 2.7.3 event call fixed thanks to William Parry <williamparry!at!gmail.com> + +- 2.7.4 standart event change call added on addItem, removeItem + preSet also check if item have "selected" attribute + addItem minor fix + +- 2.7.5 event call removeItem fixed + new public method destroy added needed to remove fcbkcomplete element from dome + */ /* Coded by: emposha <admin@emposha.com> */ -/* Copyright: Emposha.com <http://www.emposha.com/> - Distributed under MIT - Keep this message! */ -/* +/* Copyright: Emposha.com <http://www.emposha.com> - Distributed under MIT - Keep this message! */ + +/** * json_url - url to fetch json object - * cache - use cache + * cache - use cache * height - maximum number of element shown before scroll will apear * newel - show typed text like a element - * firstselected - automaticly select first element from dropdown + * firstselected - automaticly select first element from dropdown * filter_case - case sensitive filter * filter_selected - filter selected items from list * complete_text - text for complete page - * maxshownitems - maximum numbers that will be shown at dropdown list (less better performance) - * onselect - fire event on item select - * onremove - fire event on item remove - * maxitimes - maximum items that can be added + * maxshownitems - maximum numbers that will be shown at dropdown list (less better performance) + * onselect - fire event on item select + * onremove - fire event on item remove + * maxitimes - maximum items that can be added + * delay - delay between ajax request (bigger delay, lower server time request) + * addontab - add first visible element on tab or enter hit + * attachto - after this element fcbkcomplete insert own elements */ -jQuery(function($){ - $.fn.fcbkcomplete = function(opt){ - return this.each(function(){ - function init(){ +jQuery(function($) { + $.fn.fcbkcomplete = function(opt) { + return this.each(function() { + function init() { createFCBK(); preSet(); addInput(0); } - - function createFCBK(){ + + function createFCBK() { element.hide(); element.attr("multiple", "multiple"); if (element.attr("name").indexOf("[]") == -1) { element.attr("name", element.attr("name") + "[]"); } - + holder = $(document.createElement("ul")); holder.attr("class", "holder"); - element.after(holder); + if (options.attachto) { + if (typeof(options.attachto) == "object") { + options.attachto.append(holder); + } + else { + $(options.attachto).append(holder); + } + + } + else { + element.after(holder); + } + complete = $(document.createElement("div")); complete.addClass("facebook-auto"); complete.append('<div class="default">' + options.complete_text + "</div>"); - - if (browser_msie) { - complete.append('<iframe class="ie6fix" scrolling="no" frameborder="0"></iframe>'); - browser_msie_frame = complete.children('.ie6fix'); - } + complete.hover(function() {options.complete_hover = 0;}, function() {options.complete_hover = 1;}); feed = $(document.createElement("ul")); feed.attr("id", elemid + "_feed"); - + complete.prepend(feed); holder.after(complete); feed.css("width", complete.width()); } - - function preSet(){ - element.children("option").each(function(i, option){ - option = $(option); + + function preSet() { + element.children("option").each(function(i, option) { + option = $(option); if (option.hasClass("selected")) { addItem(option.text(), option.val(), true, option.hasClass("locked")); option.attr("selected", "selected"); } - else { - option.removeAttr("selected"); - } - cache.push({ - caption: option.text(), + key: option.text(), value: option.val() }); search_string += "" + (cache.length - 1) + ":" + option.text() + ";"; }); } - + //public method to add new item - $(this).bind("addItem", function(event, data){ - addItem(data.title, data.value); + $(this).bind("addItem", + function(event, data) { + addItem(data.title, data.value, 0, 0, 0); + }); + + //public method to remove item + $(this).bind("removeItem", + function(event, data) { + var item = holder.children('li[rel=' + data.value + ']'); + if (item.length) { + removeItem(item); + } }); - function addItem(title, value, preadded, locked){ + //public method to remove item + $(this).bind("destroy", + function(event, data) { + holder.remove(); + complete.remove(); + element.show(); + }); + + function addItem(title, value, preadded, locked, focusme) { if (!maxItems()) { return false; } var li = document.createElement("li"); var txt = document.createTextNode(title); var aclose = document.createElement("a"); - var liclass = "bit-box" + (locked ? " locked" : ""); + var liclass = "bit-box" + (locked ? " locked": ""); $(li).attr({ "class": liclass, "rel": value @@ -129,61 +173,64 @@ jQuery(function($){ "class": "closebutton", "href": "#" }); - + li.appendChild(aclose); holder.append(li); - - $(aclose).click(function(){ + + $(aclose).click(function() { removeItem($(this).parent("li")); return false; }); - + if (!preadded) { $("#" + elemid + "_annoninput").remove(); var _item; - addInput(1); + addInput(focusme); if (element.children("option[value=" + value + "]").length) { _item = element.children("option[value=" + value + "]"); _item.get(0).setAttribute("selected", "selected"); + _item.attr("selected", "selected"); if (!_item.hasClass("selected")) { _item.addClass("selected"); } } - else { + else{ var _item = $(document.createElement("option")); _item.attr("value", value).get(0).setAttribute("selected", "selected"); + _item.attr("value", value).attr("selected", "selected"); _item.attr("value", value).addClass("selected"); _item.text(title); element.append(_item); } - if (options.onselect.length) { + if (options.onselect) { funCall(options.onselect, _item) } + element.change(); } holder.children("li.bit-box.deleted").removeClass("deleted"); feed.hide(); - browser_msie ? browser_msie_frame.hide() : ''; } - - function removeItem(item){ - var parent = item.parent("li"); - if (!parent.hasClass('locked')) { - parent.fadeOut("fast"); - if (options.onremove.length) { + + function removeItem(item) { + + if (!item.hasClass('locked')) { + item.fadeOut("fast"); + if (options.onremove) { var _item = element.children("option[value=" + item.attr("rel") + "]"); funCall(options.onremove, _item) } - element.children("option[value=" + item.attr("rel") + "]").removeAttr("selected"); - element.children("option[value=" + item.attr("rel") + "]").removeClass("selected"); + element.children('option[value="' + item.attr("rel") + '"]').removeAttr("selected").removeClass("selected"); item.remove(); + element.change(); deleting = 0; } } - - function addInput(focusme){ + + function addInput(focusme) { var li = $(document.createElement("li")); var input = $(document.createElement("input")); - + var getBoxTimeout = 0; + li.attr({ "class": "bit-input", "id": elemid + "_annoninput" @@ -194,84 +241,95 @@ jQuery(function($){ "size": "1" }); holder.append(li.append(input)); - - input.focus(function(){ + + input.focus(function() { complete.fadeIn("fast"); }); - - input.blur(function(){ - complete.fadeOut("fast"); - }); - - holder.click(function(){ + + input.blur(function() { + if (options.complete_hover) { + complete.fadeOut("fast"); + } + else { + input.focus(); + } + }); + + holder.click(function() { input.focus(); if (feed.length && input.val().length) { feed.show(); } - else { + else{ feed.hide(); - browser_msie ? browser_msie_frame.hide() : ''; complete.children(".default").show(); } }); - - input.keypress(function(event){ + + input.keypress(function(event) { if (event.keyCode == 13) { return false; } - //auto expand input + //auto expand input input.attr("size", input.val().length + 1); }); - - input.keydown(function(event){ + + input.keydown(function(event) { //prevent to enter some bad chars when input is empty if (event.keyCode == 191) { event.preventDefault(); return false; } }); - - input.keyup(function(event){ + + input.keyup(function(event) { var etext = xssPrevent(input.val()); - + if (event.keyCode == 8 && etext.length == 0) { feed.hide(); - browser_msie ? browser_msie_frame.hide() : ''; if (!holder.children("li.bit-box:last").hasClass('locked')) { if (holder.children("li.bit-box.deleted").length == 0) { holder.children("li.bit-box:last").addClass("deleted"); return false; } - else { + else{ if (deleting) { return; } deleting = 1; - holder.children("li.bit-box.deleted").fadeOut("fast", function(){ + holder.children("li.bit-box.deleted").fadeOut("fast", + function() { removeItem($(this)); return false; }); } } } - - if (event.keyCode != 40 && event.keyCode != 38 && etext.length != 0) { + + if (event.keyCode != 40 && event.keyCode != 38 && event.keyCode!=37 && event.keyCode!=39 && etext.length != 0) { counter = 0; - + if (options.json_url) { if (options.cache && json_cache) { addMembers(etext); bindEvents(); } - else { - $.getJSON(options.json_url + "?tag=" + etext, null, function(data){ - addMembers(etext, data); - json_cache = true; - bindEvents(); - }); + else{ + getBoxTimeout++; + var getBoxTimeoutValue = getBoxTimeout; + setTimeout(function() { + if (getBoxTimeoutValue != getBoxTimeout) return; + $.getJSON(options.json_url, {tag: etext}, + function(data) { + addMembers(etext, data); + json_cache = true; + bindEvents(); + }); + }, + options.delay); } } - else { + else{ addMembers(etext); bindEvents(); } @@ -280,181 +338,181 @@ jQuery(function($){ } }); if (focusme) { - setTimeout(function(){ + setTimeout(function() { input.focus(); complete.children(".default").show(); - }, 1); + }, + 1); } } - - function addMembers(etext, data){ + + function addMembers(etext, data) { feed.html(''); - - if (!options.cache) { + + if (!options.cache && data != null) { cache = new Array(); search_string = ""; } - + addTextItem(etext); - + if (data != null && data.length) { - $.each(data, function(i, val){ + $.each(data, + function(i, val) { cache.push({ - caption: val.caption, + key: val.key, value: val.value }); - search_string += "" + (cache.length - 1) + ":" + val.caption + ";"; + search_string += "" + (cache.length - 1) + ":" + val.key + ";"; }); } - - var maximum = options.maxshownitems < cache.length ? options.maxshownitems : cache.length; + + var maximum = options.maxshownitems < cache.length ? options.maxshownitems: cache.length; var filter = "i"; if (options.filter_case) { filter = ""; } - - var myregexp, match; - try { + + var myregexp, + match; + try{ myregexp = eval('/(?:^|;)\\s*(\\d+)\\s*:[^;]*?' + etext + '[^;]*/g' + filter); match = myregexp.exec(search_string); - } - catch (ex) { - }; - + } + catch(ex) { + }; + var content = ''; while (match != null && maximum > 0) { var id = match[1]; var object = cache[id]; if (options.filter_selected && element.children("option[value=" + object.value + "]").hasClass("selected")) { //nothing here... - } - else { - content += '<li rel="' + object.value + '">' + itemIllumination(object.caption, etext) + '</li>'; + } + else{ + content += '<li rel="' + object.value + '">' + itemIllumination(object.key, etext) + '</li>'; counter++; maximum--; } match = myregexp.exec(search_string); } feed.append(content); - + if (options.firstselected) { focuson = feed.children("li:visible:first"); focuson.addClass("auto-focus"); } - + if (counter > options.height) { feed.css({ "height": (options.height * 24) + "px", "overflow": "auto" }); - if (browser_msie) { - browser_msie_frame.css({ - "height": (options.height * 24) + "px", - "width": feed.width() + "px" - }).show(); - } } - else { + else{ feed.css("height", "auto"); - if (browser_msie) { - browser_msie_frame.css({ - "height": feed.height() + "px", - "width": feed.width() + "px" - }).show(); - } } } - - function itemIllumination(text, etext){ + + function itemIllumination(text, etext) { if (options.filter_case) { - try { + try{ eval("var text = text.replace(/(.*)(" + etext + ")(.*)/gi,'$1<em>$2</em>$3');"); - } - catch (ex) { - }; - } - else { - try { + } + catch(ex) { + }; + } + else{ + try{ eval("var text = text.replace(/(.*)(" + etext.toLowerCase() + ")(.*)/gi,'$1<em>$2</em>$3');"); - } - catch (ex) { - }; - } + } + catch(ex) { + }; + } return text; } - - function bindFeedEvent(){ - feed.children("li").mouseover(function(){ + + function bindFeedEvent() { + feed.children("li").mouseover(function() { feed.children("li").removeClass("auto-focus"); $(this).addClass("auto-focus"); focuson = $(this); }); - - feed.children("li").mouseout(function(){ + + feed.children("li").mouseout(function() { $(this).removeClass("auto-focus"); focuson = null; }); } - - function removeFeedEvent(){ + + function removeFeedEvent() { feed.children("li").unbind("mouseover"); feed.children("li").unbind("mouseout"); - feed.mousemove(function(){ + feed.mousemove(function() { bindFeedEvent(); feed.unbind("mousemove"); }); } - - function bindEvents(){ + + function bindEvents() { var maininput = $("#" + elemid + "_annoninput").children(".maininput"); bindFeedEvent(); feed.children("li").unbind("mousedown"); - feed.children("li").mousedown(function(){ + feed.children("li").mousedown(function() { var option = $(this); - addItem(option.text(), option.attr("rel")); + addItem(option.text(), option.attr("rel"), 0, 0, 1); feed.hide(); - browser_msie ? browser_msie_frame.hide() : ''; complete.hide(); }); - + maininput.unbind("keydown"); - maininput.keydown(function(event){ + maininput.keydown(function(event) { if (event.keyCode == 191) { event.preventDefault(); return false; } - + if (event.keyCode != 8) { holder.children("li.bit-box.deleted").removeClass("deleted"); } - - if (event.keyCode == 13 && checkFocusOn()) { + + if ((event.keyCode == 13 || event.keyCode == 9) && checkFocusOn()) { var option = focuson; - addItem(option.text(), option.attr("rel")); + addItem(option.text(), option.attr("rel"), 0, 0, 1); complete.hide(); event.preventDefault(); focuson = null; return false; } - - if (event.keyCode == 13 && !checkFocusOn()) { + + if ((event.keyCode == 13 || event.keyCode == 9) && !checkFocusOn()) { if (options.newel) { var value = xssPrevent($(this).val()); - addItem(value, value); + addItem(value, value, 0, 0, 1); complete.hide(); event.preventDefault(); focuson = null; + return false; } - return false; + + if (options.addontab) { + focuson = feed.children("li:visible:first"); + var option = focuson; + addItem(option.text(), option.attr("rel"), 0, 0, 1); + complete.hide(); + event.preventDefault(); + focuson = null; + return false; + } } - + if (event.keyCode == 40) { removeFeedEvent(); if (focuson == null || focuson.length == 0) { focuson = feed.children("li:visible:first"); feed.get(0).scrollTop = 0; } - else { + else{ focuson.removeClass("auto-focus"); focuson = focuson.nextAll("li:visible:first"); var prev = parseInt(focuson.prevAll("li:visible").length, 10); @@ -472,7 +530,7 @@ jQuery(function($){ focuson = feed.children("li:visible:last"); feed.get(0).scrollTop = parseInt(focuson.get(0).scrollHeight, 10) * (parseInt(feed.children("li:visible").length, 10) - Math.round(options.height / 2)); } - else { + else{ focuson.removeClass("auto-focus"); focuson = focuson.prevAll("li:visible:first"); var prev = parseInt(focuson.prevAll("li:visible").length, 10); @@ -486,19 +544,19 @@ jQuery(function($){ } }); } - - function maxItems(){ + + function maxItems() { if (options.maxitems != 0) { if (holder.children("li.bit-box").length < options.maxitems) { return true; } - else { + else{ return false; } } } - - function addTextItem(value){ + + function addTextItem(value) { if (options.newel && maxItems()) { feed.children("li[fckb=1]").remove(); if (value.length == 0) { @@ -512,12 +570,12 @@ jQuery(function($){ feed.prepend(li); counter++; } - else { + else{ return; } } - - function funCall(func, item){ + + function funCall(func, item) { var _object = ""; for (i = 0; i < item.get(0).attributes.length; i++) { if (item.get(0).attributes[i].nodeValue != null) { @@ -525,14 +583,10 @@ jQuery(function($){ } } _object = "{" + _object + " notinuse: 0}"; - try { - eval(func + "(" + _object + ")"); - } - catch (ex) { - }; - } - - function checkFocusOn(){ + func.call(func, _object); + } + + function checkFocusOn() { if (focuson == null) { return false; } @@ -541,30 +595,34 @@ jQuery(function($){ } return true; } - - function xssPrevent(string){ + + function xssPrevent(string) { string = string.replace(/[\"\'][\s]*javascript:(.*)[\"\']/g, "\"\""); string = string.replace(/script(.*)/g, ""); string = string.replace(/eval\((.*)\)/g, ""); string = string.replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', ''); return string; } - + var options = $.extend({ json_url: null, cache: false, height: "10", newel: false, + addontab: false, firstselected: false, filter_case: false, - filter_hide: false, + filter_selected: false, complete_text: "Start to type...", maxshownitems: 30, - maxitems: 0, - onselect: "", - onremove: "" - }, opt); - + maxitems: 10, + onselect: null, + onremove: null, + attachto: null, + delay: 350 + }, + opt); + //system variables var holder = null; var feed = null; @@ -575,13 +633,12 @@ jQuery(function($){ var search_string = ""; var focuson = null; var deleting = 0; - var browser_msie = "\v" == "v"; - var browser_msie_frame; - + var complete_hover = 1; + var element = $(this); var elemid = element.attr("id"); init(); - + return this; }); }; |