/*
	Implico Collapsible Menu (C) 2010 by Bartosz Sak, info@implico.pl
*/

$.fn.implico_menu=function(options)
{
	var defaults=
	{
		timeout: 300,
		speed: 200,
		label: '',
		submenu: '',
		click: false,
		functionShow: function(menu, o) { menu.submenu.show(o.speed) },  
		functionHide: function(menu, o) { menu.submenu.hide(o.speed) }  
	}
	
	var obj=$(this);
	var o=$.extend(defaults, options);
	
	var labels=obj.find(o.label, obj);
	
	var elements = new Array();
	var closeTimeoutHandler = new Array();
	labels.each(function(i, el)
	{
		elements[i]={ 'label' : $(el), 'submenu' : $(el).find(o.submenu) };
		closeTimeoutHandler[i] = null;
	});
	
	//var elOpen=null;
	var currentOpen=-1;
	
	labels.click(function()
	{
		if (!o.click)
			return;
		
		var nr = getActiveElementNum($(this));
		if (nr>=0)
			open(nr);
	});

	labels.mouseover(function()
	{
		var nr = getActiveElementNum($(this));
		
		if (nr>=0)
		{
			if (o.click)
			{
				if (nr == currentOpen)
					cancelTimeout();
			}
			else open(nr);
		}
	});
	
	labels.mouseout(function()
	{
		closeTimeout( getActiveElementNum($(this)) );
	});
	
	function getActiveElementNum(currentObj)
	{
		var nr=-1;
		$.each(elements, function(i, el)
		{
			if (el.label.get(0) == currentObj.get(0))
			{
				nr=i;
				return;
			}
		});
		return nr;
	}

	function open(nr)
	{
		if (nr==currentOpen)
		{
			cancelTimeout();
			return;
		}
		var el=elements[nr];
		
		cancelTimeout();
	
		//$('#test-menu').html($('#test-menu').html()+',open:'+currentOpen);
		close();
		$(el.submenu).stop(true, true);
	
		o.functionShow(el, o);
		
		currentOpen=nr;
	}
	
	function closeTimeout(nr)
	{
		closeTimeoutHandler[nr] = setTimeout(function()
			{
				close();
			}
		, o.timeout);
	}
	
	function cancelTimeout()
	{
		var i;
		for (i=0; i<closeTimeoutHandler.length; i++)
			if (closeTimeoutHandler[i])
			{
				clearTimeout(closeTimeoutHandler[i]);
				closeTimeoutHandler[i] = null;
			}
	}
	
	function close()
	{
		if (currentOpen>=0)
		{
			//$('#test-menu').html($('#test-menu').html()+',close:'+currentOpen);
			var el=elements[currentOpen];
			
			o.functionHide(el, o);
			
			currentOpen=-1;
		}
	}
}
