He.Bootstrap('He.Components.LinkSet');

He.RequireComponent('He.Application');

He.Components.LinkSet.OnDOMReady = function()
{
	He.Components.LinkSet.Activate();
};

He.Components.LinkSet.Activate = function(_parent)
{
	if(!_parent)
	{
		var sets = $$('ul.linkset');
	}
	else
	{
		var sets = _parent.select('ul.linkset');
	}

	if(sets && sets.length)
	{
		var n = sets.length;
		for(var i = 0; i < n; ++i)
		{
			var items = [];
			var set = sets[i];

			var childs = set.childNodes;
			var m = childs.length;

			for(var j = 0; j < m; ++j)
			{
				var li = childs[j];
				if(li.nodeType == 1 && li.nodeName.toUpperCase() == 'LI')
				{
					var cb = li.onclick;
					li.onclick = He.Components.LinkSet.OnClick.bind(li,cb);
				}
			}
		}
	}
};

He.Components.LinkSet.OnClick = function(cb)
{
	var ul = this.parentNode;
	while(ul.parentNode && ul.nodeName.toUpperCase() != 'UL')
	{
		ul = ul.parentNode;
	}
	He.Components.LinkSet.Refresh(ul,this,cb);
};

He.Components.LinkSet.Refresh = function(ul,current,cb)
{
	var childs = ul.childNodes;
	var m = childs.length;

	for(var i = 0; i < m; ++i)
	{
		var li = childs[i];
		if(li.nodeType == 1 && li.nodeName.toUpperCase() == 'LI')
		{
			li = $(li);
			var link = li.select('A')[0];
			if(li == current || li.id == current)
			{
				if(He.IsFunction(ul.LabelUpdate))
				{
					var label = link.text;
					if(label == '')
					{
						label = link.textContent;
					}
					ul.LabelUpdate(label)
				}
				link.addClassName('active');
			}
			else
			{
				link.removeClassName('active');
			}
		}
	}

// 	Element.addClassName(this,'active');

	if(cb)
	{
		if(typeof(cb) == 'function')
		{
			return cb();
		}
		else if(typeof(cb) == 'string')
		{
			var js = cb.indexOf('javascript:');
			if(js > -1)
			{
				cb = cb.substr(js + 11);
			}
			return eval(cb);
		}
	}

	return false;
};

He.Components.LinkSet.CurrentBackChannel = function(_feedback)
{
	if(!He.IsObject(_feedback))
	{
		return;
	}

	for(var n in _feedback)
	{
		var linkset = $(n);
		if(linkset)
		{
			He.Components.LinkSet.Refresh(linkset,n + '_' + _feedback[n]);
		}
	}
	return;

	if(!He.IsArray(_feedback))
	{
		return;
	}

	var n = _feedback.length;
	for(var i = 0; i < n; ++i)
	{
		if(_feedback[i])
		{
			var linkset = $('linkset_' + i);
			if(linkset)
			{
				He.Components.LinkSet.Refresh(linkset,'linkset_' + i + '_' + _feedback[i]);
			}
		}
	}
};

/* loadAccordions */

He.Components.LinkSet.currentToggle = null;
He.Components.LinkSet.resizeSpeed = 0.45;
He.Components.LinkSet.accordionsSize = new Array();
He.Components.LinkSet.canIClick = true;

He.Components.LinkSet.loadAccordions = function()
{
	var accordions = $$('#linkset_accordions .accordion_toggle');
	accordions.each(function(accordion,index)
	{
		var container = accordion.next(0);
		He.Components.LinkSet.currentToggle = accordions[0].next(0);
		He.Components.LinkSet.accordionsSize[index] = $(container).getHeight();
		$(container).setStyle({ display: 'none' });

		var Link = $(accordion).childElements()

		Event.observe(Link[0], 'click', function ()
		{
			if(He.Components.LinkSet.canIClick)
			{
				He.Components.LinkSet.canIClick = false;

				if(He.Components.LinkSet.currentToggle==null)
				{
					He.Components.LinkSet.currentToggle = container
				}
				else if(He.Components.LinkSet.currentToggle != container)
				{
					if(He.Components.LinkSet.currentToggle.style.display != 'none')
					{
						new Effect.SlideUp(He.Components.LinkSet.currentToggle,
						{
							duration: He.Components.LinkSet.resizeSpeed,
							beforeStart:function()
							{
								He.Components.LinkSet.currentToggle.previous(0).removeClassName('accordion_toggle_active')
							}
						});
					}
					He.Components.LinkSet.currentToggle = container;
				}

				if(container.style.display == 'none')
				{
					container.previous(0).addClassName('accordion_toggle_active');
					new Effect.SlideDown(container,
					{
						duration: He.Components.LinkSet.resizeSpeed,
						afterFinish: function()
						{
							$(container).setStyle({ height: He.Components.LinkSet.accordionsSize[index] }); // IE bug
							He.Components.LinkSet.canIClick = true;
						}
					});
				}
				else
				{
					container.previous(0).removeClassName('accordion_toggle_active');
					new Effect.SlideUp(container,{
						duration: He.Components.LinkSet.resizeSpeed,
						afterFinish: function(){
							He.Components.LinkSet.canIClick = true;
						}
					});
				}
			}
		});
	});
}

He.WhenReadyCall('He.Application',function()
{
	He.Application.RegisterBackChannel('LinkSetCurrent',He.Components.LinkSet.CurrentBackChannel);
});

He.OnDOMReady(He.Components.LinkSet.OnDOMReady);

