aboutsummaryrefslogtreecommitdiffstats
path: root/themes/default/js/plugins/jquery.fcbkcomplete.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--themes/default/js/plugins/jquery.fcbkcomplete.js495
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;
});
};