/** 
* Drzewo kategorii
* Autor: Grzegorz Pietrzak
* Wszelkie prawa zastrzeżone 
**/

var category_menu = new Object();

category_menu.bind = function(obj, url)
{
	// przypisz adres
	this.url = url;
	
	// Znajdż wszystkie podtagi-dzieci <li>
	if (obj && obj.hasChildNodes())
	{
		var ch = obj.childNodes;
		for (var i = 0; i < ch.length; i++) 
		{
			if (ch[i].tagName == 'LI')
			{	
				li = ch[i];

				// przypisz odpowiednie funkcje "onclick"
				this.assign_function(li);
				
				// rekurencja dla obiektów UL
				if (li.hasChildNodes())
				{
					var lich = li.childNodes;
					for (var j = 0; j < lich.length; j++)
					{
						if (lich[j].tagName == 'UL')
						{
							this.bind(lich[j], url);
						}
					}
				}
			}
		}
	}
}

// przypisanie funkcji do danego elementu LI
category_menu.assign_function = function(li)
{
	// element rozwija się z AJAXem
	if (li.className.match('ajax'))
	{
		
		cbAddEventListener(li, 'click', menu_ajax_expand, false);	
	}

	// element jest rozwinięty
	else if (li.className.match('expanded'))
	{
		cbAddEventListener(li, 'click', menu_fold, false);	
	}
	
	// element jest zwinięty
	else if (li.className.match('folded'))
	{
		cbAddEventListener(li, 'click', menu_expand, false);
	}
}

// zwinięcie menu
function menu_fold(ev)
{
	// IEizmy
	var obj;
	if (!ev) var ev = window.event;
	if (ev.target) obj = ev.target;
	else if (ev.srcElement) obj = ev.srcElement;
	if (obj.nodeType == 3) obj = obj.parentNode; // to dla Safari, bo bierze tekst za element
	
	// zabezpiecz przed bąblowaniem
	if (!obj.tagName.match('LI')) return;
	
	// funkcja właściwa
	obj.className = obj.className.replace('expanded', 'folded');
	cbRemoveEventListener(obj, 'click', menu_fold, false);
	cbAddEventListener(obj, 'click', menu_expand, false);
	
	if (ev.stopPropagation) ev.stopPropagation();
	else window.event.cancelBubble = true;	// IE
}

// rozwinięcie menu
function menu_expand(ev)
{
	// IEizmy
	var obj;
	if (!ev) var ev = window.event;
	if (ev.target) obj = ev.target;
	else if (ev.srcElement) obj = ev.srcElement;
	if (obj.nodeType == 3) obj = obj.parentNode; // to dla Safari, bo bierze tekst za element
	
	// zabezpiecz przed bąblowaniem
	if (!obj.tagName.match('LI')) return;
	
	// funkcja właściwa
	obj.className = obj.className.replace('folded', 'expanded');
	cbRemoveEventListener(obj, 'click', menu_expand, false);
	cbAddEventListener(obj, 'click', menu_fold, false);
	
	if (ev.stopPropagation) ev.stopPropagation();
	else window.event.cancelBubble = true;	// IE
}

// rozwinięcie ajaxowe menu
function menu_ajax_expand(ev)
{
	// IEizmy
	var obj;
	if (!ev) var ev = window.event;
	if (ev.target) obj = ev.target;
	else if (ev.srcElement) obj = ev.srcElement;
	if (obj.nodeType == 3) obj = obj.parentNode; // to dla Safari, bo bierze tekst za element
	
	// zabezpiecz przed bąblowaniem
	if (!obj.tagName.match('LI')) return;

	// funkcja właściwa
	new Ajax.Updater(obj.id, 
					 category_menu.url + '/category/' + obj.id.replace('menu', ''),
					 {asynchronous:true, 
					 evalScripts:false, 
					 onComplete:function(request, json) {
					 		// zmień klasę
					 		document.getElementById(obj.id).className = 'notleaf expanded';
					 		
					 		// zajmij się listenerami
					 		try {
					 			cbRemoveEventListener(document.getElementById(obj.id), 'click', menu_ajax_expand, false);
					 		} catch(e){};
					 		cbAddEventListener(document.getElementById(obj.id), 'click', menu_fold, false);
					 		
					 		// znajdź podrzędne ul i zbinduj na nim skrypt
					 		// tu można użyć getElementsByTagName, bo na pewno jest tylko jeden poziom UL
					 		$uls = document.getElementById(obj.id).getElementsByTagName('UL');
					 		if ($uls.length > 0) category_menu.bind($uls[0], category_menu.url);
					 		}, 
					 		
					 onLoading:function(request, json) {
					 		document.getElementById(obj.id).className = 'loading'}
					 		}
					 );
					 
	if (ev.stopPropagation) ev.stopPropagation();
	else window.event.cancelBubble = true; // IE
}

// cross-browser addEventListener
function cbAddEventListener(el, event, listener, bubble)
{
	if (el.addEventListener)
	{
  		el.addEventListener(event, listener, bubble); 
	}
	else if (el.attachEvent)
	{
		el.attachEvent('on'+event, listener);
	}
}

// cross-browser removeEventListener
function cbRemoveEventListener(el, event, listener, bubble)
{
	if (el.removeEventListener)
	{
  		el.removeEventListener(event, listener, bubble); 
	}
	else if (el.detachEvent)
	{
		el.detachEvent('on'+event, listener);
	}
}
