
var administrator = window.administrator = window.administrator || {};


/**
 * Administrator suggest
 */
administrator.Suggest = function(options)
{
	this.options = $.extend({
		element: null,
		serializeTo: null
	}, options);
	
	this.suggestCache = [];
	
};

administrator.Suggest.KEY_ARROW_UP = 38;
administrator.Suggest.KEY_ARROW_DOWN = 40;
administrator.Suggest.KEY_ENTER = 13;

administrator.Suggest.prototype.init = function()
{	
	this.$element = $(this.options.element);
	
	this.$textInput = $('<input type="text" class="inp-text w-full" />');
	this.$wrapper = $('<div class="suggest-wrapper"></div>');
	this.$namesBox = $('<div class="names-box"/>');
	this.$namesInput = $(this.options.serializeTo);
	
	
	
	this.$suggestBox = $('<div class="suggest-box" />')
	
	this.$suggestBoxWrap = $('<div class="suggest-box-wrap" />');
	this.$suggestBoxWrap.append(this.$suggestBox);
	
	this.$element.append(this.$wrapper);
	this.$wrapper.append(this.$textInput).append(this.$suggestBoxWrap).append(this.$namesInput).append(this.$namesBox);
	
	this.$textInput.bind('keyup', $.proxy(this.keyup, this)).bind('keydown', $.proxy(this.keypress, this)).bind('blur', $.proxy(function(){ this.hideSuggest(); }, this));
	
	this.$suggestBoxWrap.delegate('p', 'mousedown', $.proxy(this.suggestClick, this));
	this.$suggestBox.delegate('p', 'mouseenter', $.proxy(function(event){
		this.$suggestBox.find('p').removeClass('active');
		$(event.currentTarget).addClass('active');
	}, this));
	this.$namesBox.delegate('a', 'click', $.proxy(this.nameClick, this));
	this.val = '';
	
	this.unserializeNames();
};

administrator.Suggest.prototype.keyup = function(event)
{
	if(this.val != this.$textInput.val()) this.refreshSuggest();
	if(event.keyCode == administrator.Suggest.KEY_ENTER)
	{
		var $p = this.$suggestBox.find('p.active');
		
		if($p.size())
		{
			var id = $p.attr('data-suggestid');
			var text = $p.text();
			
			if(!this.$namesBox.find('a[data-suggestid=' + id + ']').size())
			{
				var $a = $('<a/>').html(text).attr('data-suggestid', id);
				this.$namesBox.append($a);
				this.serializeNames();
				this.hideSuggest();
				this.$textInput.val('');
				this.val = '';
			}
		}
		return false;	
	}
};

administrator.Suggest.prototype.keypress = function(event)
{
	if(event.keyCode == administrator.Suggest.KEY_ARROW_DOWN)
	{
		$active = this.$suggestBox.find('p.active');
		if($active.size())
		{
			$next = $active.next();
			if($next.size())
			{
				$next.addClass('active');
				$active.removeClass('active');
			}
		}
		else 
		{
			this.$suggestBox.find('p:first-child').addClass('active');
		}
	}
	if(event.keyCode == administrator.Suggest.KEY_ARROW_UP)
	{
		$active = this.$suggestBox.find('p.active');
		if($active.size())
		{
			$prev = $active.prev();
			if($prev.size())
			{
				$prev.addClass('active');
				$active.removeClass('active');
			}
		}		
	}
	if(event.keyCode == administrator.Suggest.KEY_ENTER) return false;
};

administrator.Suggest.prototype.refreshSuggest = function()
{
	var val = this.val = this.$textInput.val();
	val = val.toLowerCase();
	val = val.replace(/\s+/,' ');
	var vals = val.split(' ');
	//val = '(' + val.join(')+.*(') + ')+';

	
	var matchVals = function(needles, haystack)
	{
		var contains = 0;
		for(var i = 0, l = needles.length; i < l; i++)
		{
			if(haystack.indexOf(needles[i]) == -1) return false;
		}
		return true;
	};
	
	if(val == '') this.hideSuggest();
	else
	{
		var firstLetter = val.charAt(0);
		
		var suggestList = [];			
		this.$suggestBox.empty();

		var out = [];
		$.each(this.suggestCache, function(id, txt)
		{
			var fn = txt.toLowerCase();
			
			
			if(matchVals(vals, fn))
			{ 
				out.push('<p data-suggestid="' + fn + '">' + fn + '</p>');
			}
		});
		
		this.$suggestBox.append(out.join(''));
		this.$suggestBox.show();
		
	}
};

administrator.Suggest.prototype.hideSuggest = function()
{
	this.$suggestBox.empty().hide();
};

administrator.Suggest.prototype.suggestClick = function(event)
{
	var $p = $(event.currentTarget);
	var id = $p.attr('data-suggestid');
	var text = $p.text();
	
	if(!this.$namesBox.find('a[data-suggestid=' + id + ']').size())
	{
		var $a = $('<a/>').html(id).attr('data-suggestid', id);
		this.$namesBox.append($a);
		this.serializeNames();
		this.hideSuggest();
		this.$textInput.val('');
		this.val = '';
	}
};

administrator.Suggest.prototype.nameClick = function(event)
{
	var $a = $(event.currentTarget);
	$a.remove();
	this.serializeNames();
	this.$textInput.focus();
	return false;
};

administrator.Suggest.prototype.serializeNames = function()
{
	var ids = [];
	this.$namesBox.find('a').each(function(){
		ids.push($(this).attr('data-suggestid'));
	});
	this.$namesInput.val(ids.join(';'));
};

administrator.Suggest.prototype.unserializeNames = function()
{
	if(this.$namesInput.val() != '')
	{
		var names = this.$namesInput.val().split(';');
		
		for(var i = 0; i < names.length; i++)
		{
			var $a = $('<a/>').html(names[i]).attr('data-suggestid', names[i]);
			this.$namesBox.append($a);
		}
	}
};

