/* Coded by: emposha <admin@emposha.com> */
/* Copyright: Emposha.com <http://www.emposha.com/> - Distributed under MIT - Keep this message! */
/*
 * holder_class     - class for ul tag holder list (default 'holder')
 * results_class    - class for div of search results (default 'facebook-auto')
 * json_url         - url to fetch json object
 * cache            - use cache (default is true)
 * height           - maximum number of element shown before scroll will apear
 * newel            - show typed text like a element
 * 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
 * complete_opts    - show option items in 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
 * sep_keycodes     - keys that accept an item (default: [13] - <return>)
 */

(function($){$.fn.extend({fcbkcomplete:function(options){options=$.extend({},$.FCBKCompleter.defaults,options);return this.each(function(){new $.FCBKCompleter(this,options)})},addItem:function(title,value){return this.trigger("addItem",[title,value])}});$.FCBKCompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8,FORWARD_SLASH:191};var holder=null;var feed=null;var complete=null;var counter=0;var cache=new Array();var json_cache=false;var search_string="";var focuson=null;var deleting=0;var browser_msie="\v"=="v";var browser_msie_frame;var $element=$(input);var elemid=$element.attr("id");createFCBK();setupSelectsAndCache();addInput(0);var keycodes={};for(var i=0;i<options.sep_keycodes.length;i++){var keycode=options.sep_keycodes[i];keycodes[keycode]=true}options.sep_keycodes=keycodes;$element.bind("addItem",function(){addItem(arguments[1],arguments[2])});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",options.holder_class);$element.after(holder);complete=$(document.createElement("div"));complete.addClass(options.results_class);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")}feed=$(document.createElement("ul"));feed.attr("id",elemid+"_feed");complete.prepend(feed);holder.after(complete);feed.css("width",complete.width())}function setupSelectsAndCache(){$element.children(":selected").addClass("selected");$element.children("option").each(function(index,element){option=$(element);cache.push({caption:option.text(),value:option.val()});search_string+=""+(cache.length-1)+":"+option.text()+";"});$element.children(".selected").each(function(index,element){option=$(element);addItem(option.text(),option.val(),true)});if(options.complete_opts){replaceCompleteWithOptionItems()}}function addItem(title,value,preadded){title=title.replace(/^ */,"").replace(/ *$/,"");if(title===""){holder.find(".bit-input input")[0].value="";return}var li=document.createElement("li");var txt=document.createTextNode(title);var aclose=document.createElement("a");$(li).attr({"class":"bit-box",rel:value});$(li).prepend(txt);$(li).click(function(){$(this).toggleClass("deleted")});$(aclose).attr({"class":"closebutton",href:"#"});li.appendChild(aclose);holder.append(li);$(aclose).click(function(){$(this).parent("li").fadeOut("fast",function(){removeItem($(this))});return false});if(options.complete_opts){hideCompleteItem(value)}if(!preadded){$("#"+elemid+"_annoninput").remove();var _item;addInput(1);if($element.children("option[value="+value+"]").length){_item=$element.children("option[value="+value+"]");_item.get(0).setAttribute("selected","selected");if(!_item.hasClass("selected")){_item.addClass("selected")}}else{var _item=$(document.createElement("option"));_item.attr("value",value).get(0).setAttribute("selected","selected");_item.attr("value",value).addClass("selected");_item.text(title);$element.append(_item)}if(options.onselect.length){funCall(options.onselect,_item)}}holder.children("li.bit-box.deleted").removeClass("deleted");feed.hide();browser_msie?browser_msie_frame.hide():""}function removeItem(item){if(options.onremove.length){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");if(options.complete_opts){showCompleteItem(item.attr("rel"))}item.remove();deleting=0}function addInput(focusme){var li=$(document.createElement("li"));var input=$(document.createElement("input"));li.attr({"class":"bit-input",id:elemid+"_annoninput"});input.attr({type:"text","class":"maininput",size:"1"});holder.append(li.append(input));input.focus(function(){complete.fadeIn("fast")});input.blur(function(){var value=xssPrevent($(this).val());if(value&&options.accept_on_blur){addItem(value,value)}complete.fadeOut("fast")});holder.click(function(){input.focus();if(feed.length&&input.val().length){feed.show()}else{feed.hide();browser_msie?browser_msie_frame.hide():"";complete.children(".default").show()}});input.keypress(function(event){if(isKeyCodeSep(event.keyCode)){return false}input.attr("size",input.val().length+1)});input.keydown(function(event){if(event.keyCode==KEY.FORWARD_SLASH){event.preventDefault();return false}});input.keyup(function(event){var etext=xssPrevent(input.val());if(event.keyCode==KEY.BACKSPACE&&etext.length==0){feed.hide();browser_msie?browser_msie_frame.hide():"";if(holder.children("li.bit-box.deleted").length==0){holder.children("li.bit-box:last").addClass("deleted");return false}else{if(deleting){return}deleting=1;holder.children("li.bit-box.deleted").fadeOut("fast",function(){removeItem($(this));return false})}}if(event.keyCode!=KEY.DOWN&&event.keyCode!=KEY.UP&&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{addMembers(etext);bindEvents()}complete.children(".default").hide();feed.show()}});if(focusme){setTimeout(function(){input.focus();complete.children(".default").show()},1)}}function addMembers(etext,data){feed.html("");if(!options.cache){cache=new Array();search_string=""}addTextItem(etext);if(data!=null&&data.length){$.each(data,function(i,val){cache.push({caption:val.caption,value:val.value});search_string+=""+(cache.length-1)+":"+val.caption+";"})}var maximum=options.maxshownitems<cache.length?options.maxshownitems:cache.length;var filter="i";if(options.filter_case){filter=""}var myregexp,match;try{myregexp=eval("/(?:^|;)\\s*(\\d+)\\s*:[^;]*?"+etext+"[^;]*/g"+filter);match=myregexp.exec(search_string)}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")){}else{content+='<li rel="'+object.value+'">'+itemIllumination(object.caption,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{feed.css("height","auto");if(browser_msie){browser_msie_frame.css({height:feed.height()+"px",width:feed.width()+"px"}).show()}}}function itemIllumination(text,etext){if(options.filter_case){try{eval("var text = text.replace(/(.*)("+etext+")(.*)/gi,'$1<em>$2</em>$3');")}catch(ex){}}else{try{eval("var text = text.replace(/(.*)("+etext.toLowerCase()+")(.*)/gi,'$1<em>$2</em>$3');")}catch(ex){}}return text}function bindFeedEvent(){feed.children("li").mouseover(function(){feed.children("li").removeClass("auto-focus");$(this).addClass("auto-focus");focuson=$(this)});feed.children("li").mouseout(function(){$(this).removeClass("auto-focus");focuson=null})}function removeFeedEvent(){feed.children("li").unbind("mouseover");feed.children("li").unbind("mouseout");feed.mousemove(function(){bindFeedEvent();feed.unbind("mousemove")})}function bindEvents(){var maininput=$("#"+elemid+"_annoninput").children(".maininput");bindFeedEvent();feed.children("li").unbind("mousedown");feed.children("li").mousedown(function(){var option=$(this);addItem(option.text(),option.attr("rel"));feed.hide();browser_msie?browser_msie_frame.hide():"";complete.hide()});maininput.unbind("keydown");maininput.keydown(function(event){if(event.keyCode==KEY.FORWARD_SLASH){event.preventDefault();return false}if(event.keyCode!=KEY.BACKSPACE){holder.children("li.bit-box.deleted").removeClass("deleted")}if(isKeyCodeSep(event.keyCode)&&checkFocusOn()){var option=focuson;addItem(option.text(),option.attr("rel"));complete.hide();event.preventDefault();focuson=null;return false}if(isKeyCodeSep(event.keyCode)&&!checkFocusOn()){if(options.newel){var value=xssPrevent($(this).val());addItem(value,value);complete.hide();event.preventDefault();focuson=null}return false}if(event.keyCode==KEY.DOWN){removeFeedEvent();if(focuson==null||focuson.length==0){focuson=feed.children("li:visible:first");feed.get(0).scrollTop=0}else{focuson.removeClass("auto-focus");focuson=focuson.nextAll("li:visible:first");var prev=parseInt(focuson.prevAll("li:visible").length,10);var next=parseInt(focuson.nextAll("li:visible").length,10);if((prev>Math.round(options.height/2)||next<=Math.round(options.height/2))&&typeof(focuson.get(0))!="undefined"){feed.get(0).scrollTop=parseInt(focuson.get(0).scrollHeight,10)*(prev-Math.round(options.height/2))}}feed.children("li").removeClass("auto-focus");focuson.addClass("auto-focus")}if(event.keyCode==KEY.UP){removeFeedEvent();if(focuson==null||focuson.length==0){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{focuson.removeClass("auto-focus");focuson=focuson.prevAll("li:visible:first");var prev=parseInt(focuson.prevAll("li:visible").length,10);var next=parseInt(focuson.nextAll("li:visible").length,10);if((next>Math.round(options.height/2)||prev<=Math.round(options.height/2))&&typeof(focuson.get(0))!="undefined"){feed.get(0).scrollTop=parseInt(focuson.get(0).scrollHeight,10)*(prev-Math.round(options.height/2))}}feed.children("li").removeClass("auto-focus");focuson.addClass("auto-focus")}})}function addTextItem(value){if(options.newel){feed.children("li[fckb=1]").remove();if(value.length==0){return}var li=$(document.createElement("li"));li.attr({rel:value,fckb:"1"}).html(value);feed.prepend(li);counter++}else{return}}function replaceCompleteWithOptionItems(){complete.children(".default").html("");$element.children("option").each(function(i,option){option=$(option);var item=$(document.createElement("span"));item.append(option.text());item.attr("rel",option.val());item.mousedown(function(){var o=$(this);addItem(o.text(),o.attr("rel"));complete.hide});complete.children(".default").append(item);complete.children(".default").append(" ");if(option.hasClass("selected")){item.css("display","none")}})}function hideCompleteItem(rel_value){complete.children(".default").children("span[rel="+rel_value+"]").css("display","none")}function showCompleteItem(rel_value){complete.children(".default").children("span[rel="+rel_value+"]").fadeIn("fast")}function funCall(func,item){var _object="";for(i=0;i<item.get(0).attributes.length;i++){if(item.get(0).attributes[i].nodeValue!=null){_object+='"_'+item.get(0).attributes[i].nodeName+'": "'+item.get(0).attributes[i].nodeValue+'",'}}_object="{"+_object+" notinuse: 0}";try{eval(func+"("+_object+")")}catch(ex){}}function checkFocusOn(){if(focuson==null){return false}if(focuson.length==0){return false}return true}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}function isKeyCodeSep(keycode){return options.sep_keycodes[keycode]===true}};$.FCBKCompleter.defaults={holder_class:"holder",results_class:"facebook-auto",complete_text:"Start typing...",complete_opts:false,accept_on_blur:false,cache:true,filter_case:false,filter_hide:false,firstselected:false,height:"10",json_url:null,maxshownitems:20,newel:false,onselect:"",onremove:"",sep_keycodes:[13]}})(jQuery);