/*
  FCBKcomplete 1.06
  - Jquery version required: 1.2.x, 1.3.x
  
  Changelog:
  - 1.06 auto heigth fix
  		 event bind on main element for better user frendly experience
  		 filter for items
  		 up/down keys supported from now
  
  - 1.05 bindEvents function fixed thanks to idgnarn
  
  - 1.04 IE7 <em> tag replace fixed
  		 
  - 1.03 IE7 & IE6 crash fixed
  		 IE7 css fixed
  
  - 1.02 json parsing fixed
         remove element fixed
         
  - 1.01: some bugs fixed
  
  - 1.0: migration from prototype
*/

/* Coded by: emposha <admin@emposha.com> */
/* Copyright: Emposha.com <http://www.emposha.com/> - Distributed under MIT - Keep this message! */
/*
* elem - input element id or object
* list - preadded elements
* complete - autocomplete div id or object
* ajax - url to fetch json object
* height - maximum number of element shown before scroll will apear
* usefileter - show/hide filtered items
*/

jQuery.facebooklist = function(elem, list, complete, ajax, height, usefilter, lang) {
	var addHiddenInput = function(value) {
    	var input = document.createElement('input');      
        jQuery(input).attr({'type': 'hidden', 'name': (elem.attr('id')+'[]'), 'id': (elem.attr('id')+'[]'), 'value': value});
        return input;
    }
    var getChar = function(e) {
    	if(window.event) {
			keynum = e.keyCode;
		} else if(e.which) {
		  keynum = e.which;
    	}
    	if (keynum == 8)
    		return '';
    		
    	return String.fromCharCode(keynum);
    }
    var addItem = function(item, preadded) {
    	var title = item.html().replace(/<em>/gi,'').replace(/<\/em>/gi,'');
    	var value = (item.attr('val') && item.attr('val') != -1 ?item.attr('val'):title);    	
        var li = document.createElement('li');
        var txt = document.createTextNode(title);
        var aclose = document.createElement('a');
		var input = addHiddenInput(value);
		
        jQuery(li).attr({'val': value, 'class': 'bit-box'});
        jQuery(li).prepend(txt);
        jQuery(aclose).attr({'class': 'closebutton','href': '#'});
        li.appendChild(aclose);
        li.appendChild(input);
        holder.appendChild(li);        
        jQuery(aclose).click(function() {
            jQuery(this).parent('li').fadeOut('fast',function() {
                jQuery(this).remove();
            });
            return false;
        });
        if (!preadded) {        
        	holder.removeChild(document.getElementById('annoninput-'+lang));
        	addInput();
        } 
        
        jQuery('.maininput-'+lang).focus();
 
        jQuery('.default'+lang).show();                     
        feed.hide();
    }
    var addItemFeed = function(data,input) {
		var counter = 1;
    	feed.children('li[fckb=2]').remove();
    	jQuery.each(data, function(i, val) {
           if (val.caption) {
		   		if (usefilter) {
					if (val.caption.indexOf(input)!= -1) {
						var li = document.createElement('li');
						jQuery(li).attr({'val': val.value,'fckb': '2'});
						jQuery(li).html(val.caption.replace(input, '<em>' + input + '</em>'));
						feed.append(li);
						counter++;
					}
				}
				else {
					var li = document.createElement('li');
					jQuery(li).attr({'val': val.value,'fckb': '2'});
					jQuery(li).html(val.caption.replace(input, '<em>' + input + '</em>'));
					feed.append(li);
					counter++;
				}
	    	}           
        });
		if (counter > height) {
			feed.css({'height':(height*24)+'px', 'overflow':'auto'}); 
		} else {
			feed.css('height','auto');
		}   	
    }
    var addTextItemFeed = function(value) {
    	feed.children('li[fckb=1]').remove();
	    var li = document.createElement('li');	        
	    jQuery(li).attr({'val':value,'fckb': '1'});
	    jQuery(li).html(value);	        
	    feed.prepend(li);
    }
    //thanks to idgnarn for fix
    var bindEvents = function () {
		var nowFocusOn;
		var maininput = jQuery('.maininput-'+lang);
		feed.children('li').hover(
	      function () {
	        jQuery(this).addClass("auto-focus");
			nowFocusOn=jQuery(this);
	      }, 
	      function () {
	        jQuery(this).removeClass("auto-focus");
			nowFocusOn=null;
	      }
	    );      
        feed.children('li').unbind('click');
        feed.children('li').click(function(){            
            addItem(jQuery(this));
            
            complete.hide();
            
        });
		maininput.unbind('keydown');
		maininput.keydown(function(event){
			
			
            
			if (event.keyCode == 13) {
                if(nowFocusOn != null) {
                    addItem(jQuery(nowFocusOn)); 
                    
                }
                else {
                    
                    nowFocusOn = jQuery(feed.children('li:first'));
                    addItem(jQuery(nowFocusOn));
                    
                 
                }
                
                complete.hide();
                event.preventDefault();
			} 
			if (event.keyCode == 40) {
				if (typeof(nowFocusOn) == 'undefined' || nowFocusOn.length == 0) {
					nowFocusOn = jQuery(feed.children('li:first'));
					nowFocusOn.addClass("auto-focus");
				}
				else {
					nowFocusOn.removeClass("auto-focus");
					nowFocusOn = nowFocusOn.next('li');
					nowFocusOn.addClass("auto-focus");
				}
			}
			if (event.keyCode == 38) {
				if (typeof(nowFocusOn) == 'undefined' || nowFocusOn.length == 0) {
					nowFocusOn = jQuery(feed.children('li:last'));
					nowFocusOn.addClass("auto-focus");				
				}
				else {
					nowFocusOn.removeClass("auto-focus");
					nowFocusOn = nowFocusOn.prev('li');
					nowFocusOn.addClass("auto-focus");
				}
			}
			
			if (event.keyCode != 40 && event.keyCode != 38) {
				if(jQuery(nowFocusOn).length) {
					complete.hide();
					//event.preventDefault();
				}
			}
			
		});
    }
    var addInput = function () {
        var li = document.createElement('li');
        var input = document.createElement('input');
        jQuery(li).attr({'class': 'bit-input', 'id': 'annoninput-'+lang});
        jQuery(input).attr({'type': 'text', 'class': 'maininput-'+lang});
        li.appendChild(input);
        holder.appendChild(li);
		
		jQuery(holder).click(function() {
            
            jQuery(input).focus();
        });
	    jQuery(input).keyup(function(event) {
			if (event.keyCode != 40 && event.keyCode != 38) { 
				var etext = jQuery(input).val();
				addTextItemFeed(etext);
                if(etext.length > 0) { 
                    complete.fadeIn('fast');
                }
				if (ajax) {
					jQuery.getJSON(ajax + '?tag=' + etext, null, function(data){
						addItemFeed(data, etext);
						bindEvents();
					});
				}
				else {
					bindEvents();
				}
                
				jQuery('.default-'+lang).hide();
				feed.show();
			}            
	  });
    }    
    if (typeof(elem) != 'object') elem = jQuery(elem);
    if (typeof(list) != 'object') list = jQuery(list);
    if (typeof(complete) != 'object') complete = jQuery(complete);    
    var feed = jQuery('#feed-'+lang);
    var holder = document.createElement('ul');
    elem.css('display','none');
    jQuery(holder).attr('class', 'holder');        
    if (list && list.children('li').length) {        
        jQuery.each(list.children('li'), function(i, val) {
        	addItem(jQuery(list.children('li')[i]),1);           
        });
    }
    addInput();
    elem.before(holder);
    
}