/*
 FCBKcomplete 1.09
 - Jquery version required: 1.2.x, 1.3.x
 
 Changelog:
 - 1.09 IE crash fixed
 
 - 1.08 some minor bug fixed
 
 - 1.07 case sensetive added
 		applied filter to non ajax items
 		filter algorithm changed
 		cache for ajax request added
 		up/down with auto scrolling
 		minor code fixes
 
 - 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 - object with two parametrs a) url to fetch json object b) use cache
 * height - maximum number of element shown before scroll will apear
 * filter - object with two parametrs a)case sensitive b) show/hide filtered items
 * newel - show typed text like a element
 */

jQuery.facebooklist = function(elem, list, complete, ajax, height, filter, newel, options , caption ){
	
	var _options = $.extend({},{
		multiple:	false,
		handlers: {
			onAddItem:		function( item ){ return true; },
			onRemoveItem:	function(){ return true; },
			onAddManualItemImposible: function(){}
		},
		deleteMessage: "Are you sure you want to delete this keyword?",
		yesButtonCaption: "Yes",
		noButtonCaption: "No"
	},options);

    var addHiddenInput = function(value){
        var input = document.createElement('input');
        $(input).attr({
           'type': 'hidden',
            'name': ( 'value-'+elem.attr('name') + "[]" ),
            'id': ( 'value-'+elem.attr('id')+"-"+($(holder).find("input[type='hidden']").size()) ),
            '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);
    }
    
	function setFieldValue(){
		var items = [];
		
		$(holder).find( 'li.bit-box' ).each(function(){
			items.push( $(this).find('span').text() );
		}); 
		
		var v = '';
		
		if( items.length > 0 ){
			v = items.join(',');
			
			if( elem.next("input[type='hidden']").size() > 0 ){
				elem.next("input[type='hidden']").replaceWith('');
			}
			
		} else if( elem.next("input[type='hidden']").size() == 0 ) {
			elem.after( addHiddenInput('') );
		}
		
		elem.val( v ).change();
		
		if( $(caption).size() > 0 ){
			if( elem.val() == '' ){
				$(caption).show();
			} else {
				$(caption).hide();
			}
		}
		
	}
	
    var addItem = function(item, preadded){
		
    	if (!newel && !$(item).is('li') ) {
    		return;
    	}
		
		if( !_options.handlers.onAddItem( item ) ){
			return;
		}

		if (!_options.multiple) {
			var _values = $(holder).find('li.bit-box');
			if( _values.size() > 0 ){
				_values.replaceWith('');
			}
		}

        var title = item.text();
        var value = (item.attr('rel') && item.attr('rel') != -1 ? item.attr('rel') : title);
        var li = document.createElement('li');
        var txt = document.createTextNode(title);
        var aclose = document.createElement('a');
        var input = addHiddenInput(value);
        $(li).attr({
            'class': 'bit-box'
        });
        $(li).prepend( $("<span/>").append( txt ) );
        $(aclose).attr({
            'class': 'closebutton',
            'href': '#'
        });
        li.appendChild(aclose);
        li.appendChild(input);
        holder.appendChild(li);
        $(aclose).click(function(){

        	var $dialog 	= $("<div/>").addClass("warn"); 
        	
        	var box = new Boxy( $dialog, {
        		closeText: "",
        		title:		"Warning!",
        		modal: 		true
        	} );
        	$dialog.parents(".boxy-wrapper:first").addClass("warning");		
			$('.title-bar h2:visible').mskI18n('text');
			
        	var $message 	= $("<span/>").text( _options.deleteMessage ).mskI18n('text');
        	var $yesBtn 	= $("<button class='btn btn_green_blnk'/>").append($("<font/>").append($("<span/>").text( _options.yesButtonCaption ).mskI18n('text')) ).click(function(){
        		
				if( $(aclose).parents('ul').find('li.bit-box').length == 1 ){
					addInput();
				}
				
				$(aclose).parents('ul').find('li.bit-box').remove();

				box.hide();
				
				if (typeof $(elem).data('setStatus') == 'function') {
					$(elem).data('setStatus')( 'missing' );
				}
				setFieldValue();
        		return false;
        	});
        	var $noBtn 	= $("<button class='ml8 btn btn_gray_blnk'/>").append($("<font/>").append($("<span/>").text( _options.noButtonCaption ).mskI18n('text')) ).click(function(){
        		box.hide();
        		return false;
        	});
        	
        	$dialog.append( $message ).append( $("<div/>").append( $yesBtn ).append( $noBtn ) );
			
            return false;
        });
		
		setFieldValue();
		if (!_options.multiple) {
			$(holder).find('.maininput, .bit-input').replaceWith('');
		} else {
		
			if (!preadded) {
				//holder.removeChild(document.getElementById('annoninput'));
				$(holder).find('.maininput, .bit-input').replaceWith('');
				addInput();
			}
		}
        feed.hide();
    }
    
	var lastLen = 0;
	
    var defaultFilter = function(input){
        if (filter.userfilter) {
            var flag;
            feed.children('li:not([fckb])').removeClass('hidden');
			
            $.each(feed.children('li:not([fckb])'), function(i, val){
                var item = $(val);
                if (filter.casesensetive) {
                    flag = item.text().indexOf(input);
                    item.html(item.text().replace(input, '<em>' + input + '</em>'));
                }
                else {
                    flag = item.text().toLowerCase().indexOf(input.toLowerCase());
                    item.html(item.text().replace(input, '<em>' + input + '</em>'));
                }
                if (flag == -1) {
                    item.addClass('hidden');
                }
                else {
                    counter++;
                }
            });
        }
        else {
            counter += feed.children('li:not([fckb])').length;
        }
        if (counter > height) {
            feed.css({
                'height': (height * 24) + 'px',
                'overflow': 'auto'
            });
        }
        else {
            feed.css('height', 'auto');
        }

		if( counter == 0 ){
			$('.default',$(complete)).hide();
			$('.noResults',$(complete)).show();
			feed.hide();	
		} else {
			$('.default, .noResults',$(complete)).filter(':visible').hide();
			
			var currentValueLen = input.length;
			
/*			if( lastLen < currentValueLen ){
				var proposition = feed.find('li:eq(0)').text();
				var propositionValueLen = proposition.length;
//				var selStart  	= proposition.indexOf(input) + currentValueLen + 1;
				var selStart  	= currentValueLen;
				var selLen 		= propositionValueLen;
				var maininput = $('.maininput',$(holder));

				maininput.val(proposition);			

				if (maininput.get(0).setSelectionRange){
					maininput.get(0).setSelectionRange(selStart, selLen);
	            } else if (maininput.get(0).createTextRange){
	                var range = maininput.get(0).createTextRange();
					//var text = proposition.substr(selStart, selLen);
	               	 
					//range.findText(text);
					range.collapse(true);
					range.moveStart("character", selStart );
					range.moveEnd("character", selStart + selLen);
	                range.select();
	            }
         	}*/
			   
			lastLen = currentValueLen;
		}
			
    }
    
    var feedFilter = function(item, caption, input){
        if (filter.userfilter) {
            if (filter.casesensetive) {
                if (caption.indexOf(input) != -1) {
                    item.html(caption.replace(input, '<em>' + input + '</em>'));
                    return true;
                }
            }
            else {
                if (caption.toLowerCase().indexOf(input.toLowerCase()) != -1) {
                    item.html(caption.replace(new RegExp(input, "i"), '<em>' + caption.match(new RegExp(input, "i")) + '</em>'));
                    return true;
                }
            }
        }
        else {
            item.html(caption.replace(input, '<em>' + input + '</em>'));
            return true;
        }
    }
    
    var addItemFeed = function(data, input){
    	if (data.length == 0) {
    		return;
    	}
		
        feed.children('li[fckb=2]').remove();
		
        $.each(data, function(i, val){	
            if (val.caption) {
                var li = document.createElement('li');
                $(li).attr({
                    'rel': val.value,
                    'fckb': '2'
                });
                if (feedFilter($(li), val.caption, input)) {
                    feed.append(li);
                    counter++;
                }
            }
        });
		
        defaultFilter(input);
    }
    
    var addTextItemFeed = function(value){
//    	return;
		
        if (newel) {
            feed.children('li[fckb=1]').remove();
            var li = document.createElement('li');
            $(li).attr({
                'rel': value,
                'fckb': '1'
            });
            $(li).html(value);
            feed.prepend(li);
			counter++;
			defaultFilter($('.maininput',$(holder)));
			bindEvents();
        } else {
		}
    }
	
	var removeFeedEvent = function () {
		feed.children('li').unbind('mouseover');	
		feed.children('li').unbind('mouseout');
		feed.mousemove(function () {
			bindFeedEvent();
			feed.unbind('mousemove');
		})	
	}
	
	var bindFeedEvent = function () {
		feed.children('li').mouseover(function(){
			feed.children('li').removeClass("auto-focus");
            $(this).addClass("auto-focus");
            nowFocusOn = $(this);
        });
		feed.children('li').mouseout( function(){
            $(this).removeClass("auto-focus");
            nowFocusOn = null;
        });
	}
    
    var bindEvents = function(){
        var maininput = $('.maininput',$(holder));
       	bindFeedEvent();
        feed.children('li').unbind('click');
        feed.children('li').click(function(){
            addItem($(this));
            complete.hide();
        });
        maininput.unbind('keydown');
        maininput.keydown(function(event){
			
        	// delete|backspace
        	if (event.keyCode == 8 || event.keyCode == 46) {
        	}
            if (event.keyCode == 13) {
				if (nowFocusOn != null && nowFocusOn.is(':visible')) {
	            	if ($.trim(maininput.val()) == '') {
	            		return false;
	            	}
	            	
	                addItem($(nowFocusOn));
	                complete.hide();
	                event.preventDefault();
	            } else {
	            	if ($.trim(maininput.val()) == '') {
	            		return false;
	            	}
//	            	nowFocusOn = null;
										
					if (newel) {
						addItem($('<em>'+$.trim(maininput.val())+'</em>'));
					} else {
						
						if( !_options.handlers.onAddManualItemImposible( maininput.val() ) ){
							maininput.val('');
						return false;
						}
					}
//	            	complete.hide();
	                event.preventDefault();
	                return false;
	            }
            }
            if (event.keyCode == 40) {
				removeFeedEvent();
                if (typeof(nowFocusOn) == 'undefined' || (nowFocusOn != null && nowFocusOn.length == 0)) {
                    nowFocusOn = $(feed.children('li:visible:first'));
					feed.get(0).scrollTop = 0;
                }
                else {
					if ($(nowFocusOn).size() > 0) {
						nowFocusOn.removeClass("auto-focus");
					}
                    nowFocusOn = nowFocusOn.nextAll('li:visible:first');
					var prev = parseInt(nowFocusOn.prevAll('li:visible').length,10);
					var next = parseInt(nowFocusOn.nextAll('li:visible').length,10);
					if ((prev > Math.round(height /2) || next <= Math.round(height /2)) && typeof(nowFocusOn.get(0)) != 'undefined') {
						feed.get(0).scrollTop = parseInt(nowFocusOn.get(0).scrollHeight,10) * (prev - Math.round(height /2));
					}
                }
				feed.children('li').removeClass("auto-focus");
                nowFocusOn.addClass("auto-focus");
            }
            if (event.keyCode == 38) {
				removeFeedEvent();
                if (typeof(nowFocusOn) == 'undefined' || (nowFocusOn != null && nowFocusOn.length == 0)) {
                    nowFocusOn = $(feed.children('li:visible:last'));
					feed.get(0).scrollTop = parseInt(nowFocusOn.get(0).scrollHeight,10) * (parseInt(feed.children('li:visible').length,10) - Math.round(height /2));
                }
                else {
                    nowFocusOn.removeClass("auto-focus");
                    nowFocusOn = nowFocusOn.prevAll('li:visible:first');
					var prev = parseInt(nowFocusOn.prevAll('li:visible').length,10);
					var next = parseInt(nowFocusOn.nextAll('li:visible').length,10);
					if ((next > Math.round(height /2) || prev <= Math.round(height /2)) && typeof(nowFocusOn.get(0)) != 'undefined') {
						feed.get(0).scrollTop = parseInt(nowFocusOn.get(0).scrollHeight,10) * (prev - Math.round(height /2));
					}
                }
				feed.children('li').removeClass("auto-focus");
                nowFocusOn.addClass("auto-focus");
            }
        });
    }
    
    var addInput = function(){
        var li = document.createElement('li');
        var input = document.createElement('input');
        $(li).attr({
            'class': 'bit-input'
            //'id': 'annoninput'
        });
        $(input).attr({
            'type': 'text',
            'class': 'maininput'
        });
        li.appendChild(input);
        holder.appendChild(li);

        $(input).focus(function(){
            complete.fadeIn('fast');
			
			if ($(caption).size() > 0) {
				$(caption).hide();
			}
			
			if (typeof elem.data('showTooltip') == 'function') {
				elem.data('showTooltip')();
			}
        }).blur(function(){
			if ($(caption).size() > 0 && $(input).val() == '' ) {
				$(caption).show();
			}
		});
		
		if ($(caption).size() > 0) {
			$(caption).click(function(){
				$(input).focus();
			});
		}
		
        $(holder).click(function(){
            $(input).focus();
			if (feed.length && $(input).val().length) {
				feed.show();
			}
			else {
				feed.children('li[fckb=2]').remove();
				feed.children('li').addClass('hidden');
				feed.css('height','0px');
				$('.default',$(complete)).show();
				$('.noResults',$(complete)).hide();
			}
        });
        $(input).keyup(function(event){
            if (event.keyCode != 40 && event.keyCode != 38) {
                counter = 0;
                var etext = $(input).val();
                addTextItemFeed(etext);
                if (ajax.url) {
                    if (ajax.cache && cache.length > 0) {
                        addItemFeed(cache, etext);
                        bindEvents();
                    }
                    else {
                        //$.getJSON(ajax.url + '?tag=' + etext, null, function(data){
                        //   addItemFeed(data, etext);
                        //    cache = data;
                        //    bindEvents();
                        //});
						// mainseek autosuggest
						var uri = ajax.url+"&request=1&amount=10&word="+etext+"&var=?";
						//console.log(uri);
						 $.getJSON(uri, function(data){
						 	
							if( data.results_number > 0 ){
							
								var _data = [];
								
								for( var r in data.results ){
									_data.push({caption:data.results[r].word,value:data.results[r].property});
								}
							
								addItemFeed(_data, etext);
                            	cache = _data;
                            	bindEvents();	
								complete.show();
							} else {
								//complete.hide();
								
								if( !newel ){
									
									$('.default',$(complete)).hide();
									$('.noResults',$(complete)).show();
									feed.hide();
									
									if ( etext.length > 1 ) {
										_options.handlers.onAddManualItemImposible( $('.maininput', $(holder) ) );
									}
								}
								
							}
							
                        });
                    }
                }
                else {
                    bindEvents();
                }
                $('.default',$(complete)).hide();
                feed.show();
            }
        });
    }
    
    if (typeof(elem) != 'object') {
		elem = $(elem);
	}
    if (typeof(list) != 'object') {
		list = $(list);
	}
    if (typeof(complete) != 'object') {
		complete = $(complete);
	}
	
    var feed = $('.feed', complete );
    var cache = {};
    var counter = 0;
	var nowFocusOn;
    var holder = document.createElement('ul');
    elem.css('display', 'none');
    $(holder).attr('class', 'holder');
    
	elem.data('call',{
		add: function( text, callback ){
			addItem( $('<li>'+text+'</li>') );
			
			if( typeof callback == 'function' ){
				callback();
			}
			
		},
		clear: function( callback ){
			$(holder).find('li.bit-box a.closebutton').click();
			
			if( typeof callback == 'function' ){
				callback();
			}
			
		},
		itemsCount: function(){
			return $(holder).find('li.bit-box').size();
		}
	});
	
	elem.data('handlers',_options.handlers);
	
	var _addInput = true;
	
    if (list && list.children('li').length) {
        $.each(list.children('li'), function(i, val){
            addItem($(list.children('li')[i]), 1);
        });
		_addInput = _options.multiple;
    }
	
	if( _addInput ){
    	addInput();
	}
	
    elem.before(holder);
	
//	if( elem.attr('alt') != '' ){
//		$(elem).after($("</span>").text(elem.attr('alt')));
//	}
	
	$(document).click(function (event) {
		if ($(event.target).attr('class') != 'holder' && $(event.target).attr('class') != 'maininput') {
			$('.default, .noResults',$(complete)).hide();
			$(feed).hide();
		}
	});
}