/**
 * Implementation of a tree navigation
 * Modified Tree and DynTree combined in one file
 * Dragging and removal of nodes is removed
 * Instead of Javascript property _jsonSource the title attribute of the li element
 * is used, because it is XHTML compliant
 * The documentation is removed, see the original Tree and DynTree
 */
 
var Tree = function() {alert('This is a static class');};

Tree._imgDir = "";
Tree._plusImg = "treeplus";
Tree._minusImg = "treeminus";

Tree.init = function(url)
{
    if (url)
    {
    	Tree.setImgDir(url);
    }
    var list = YAHOO.util.Dom.getElementsByClassName("tree", "ul");
    for (var i = 0; i < list.length; i++)
    {
        var ul = list[i];
		var li = Tree._getFirstElement(ul, "li");
		Tree._walkBranch(li);
    }
};

Tree.setImgDir = function(url)
{
	Tree._imgDir = url + (url[url.length-1] != "/" ? "/" : "");
	Tree._plusImg = Tree._getImgUrl(Tree._plusImg);
	Tree._minusImg = Tree._getImgUrl(Tree._minusImg);
};

Tree._getImgUrl = function(name)
{
	return Tree._imgDir + name + ".gif";
};

Tree.disableBranch = function(id)
{
	var el = YAHOO.util.Dom.get(id);
	YAHOO.util.Dom.addClass(el, "blurred");
};

Tree.expanderClick = function ()
{
    Tree._toggleExpand(this);
};

Tree._toggleExpand = function(img)
{
    Tree.cancelDelayed();
    var node = Tree._getFirstElement(img.parentNode, "ul");
    if (node && node.childNodes.length > 0)
    {
        if (node.style.display == "block")
        {
    	    YAHOO.util.Dom.setStyle(node, "display", "none");
            img.src = Tree._plusImg;
        }
        else
        {
    	    YAHOO.util.Dom.setStyle(node, "display", "block");
            img.src = Tree._minusImg;
        }
    }
    else
    {
		var jsonSource = img.parentNode.getAttribute("title");
		if (jsonSource)
		{
    		DynTree.request(img.parentNode, jsonSource, "append");
        	img.src = Tree._minusImg;
    	}
    }
};

Tree._toExpand = null;
Tree._timeoutId = null;

Tree.startDelayed = function()
{
    Tree.cancelDelayed();
    Tree._toExpand = this;
    Tree._timeoutId = setTimeout("Tree.delayedToggle();", 1000);
};

Tree.delayedToggle = function()
{
    Tree._toggleExpand(Tree._toExpand);
};

Tree.cancelDelayed = function()
{ 
    if (Tree._timeoutId)
    {
        clearTimeout(Tree._timeoutId);
        Tree._timeoutId = null;
    }
};

Tree._walkBranch = function(li, mode)
{
    var ul = Tree._getFirstElement(li, "ul");
    var isRoot = YAHOO.util.Dom.hasClass(li.parentNode, "tree");
    if (ul || li.getAttribute("title"))
    {
    	if (!isRoot && (mode == "branch" || mode == "reload"))
    	{
    	    var expanded = YAHOO.util.Dom.hasClass(li, "expanded");
        	this._addExpander(li, expanded);
        	if (expanded)
        	{
        	    YAHOO.util.Dom.setStyle(ul, "display", "block");
        	}
        	else
        	{
        	    YAHOO.util.Dom.setStyle(ul, "display", "none");
        	}
		}
        this._walkSiblings(ul);
    }
    else
    {
		YAHOO.util.Dom.addClass(li, "leaf");
    }
    if (mode && !isRoot && (li.parentNode.lastChild === li))
    {
		YAHOO.util.Dom.addClass(li, "last");
	}
};

Tree._walkSiblings = function(ul)
{
    if (ul)
    {
	    var list = ul.childNodes;
	    for (var i = 0; i < list.length; i++)
	    {
	        var node = list.item(i);
	        if (node.nodeName.toLowerCase() == "li")
	        {
	            Tree._walkBranch(node, "branch");
	        }
	    }
    }
};

Tree._addExpander = function(li, type)
{
    var img = document.createElement("img");
	img.src = type ? Tree._minusImg : Tree._plusImg;
    li.insertBefore(img, li.firstChild);
    YAHOO.util.Event.addListener(img, "click", Tree.expanderClick);
    YAHOO.util.Event.addListener(img, "mouseover", Tree.startDelayed);
    YAHOO.util.Event.addListener(img, "mouseout", Tree.cancelDelayed);
};

Tree._getFirstElement = function(li, nodeName)
{
    var list = li.childNodes;
    var i = 0;
    var found = null;
    while (!found && i < list.length)
    {
        var node = list.item(i);
        if (node.nodeName.toLowerCase() == nodeName)
        {
            found = node;
        }
        i++;
    }
    return found;
};

var DynTree = function(){alert('This is a static class');};
DynTree = Tree;

DynTree.request = function(htmlNode, url, mode)
{
    htmlNode = YAHOO.util.Dom.get(htmlNode);
	if (DynTree._callback.argument.currentNode !== htmlNode)
	{
	    var req = YAHOO.util.Connect.asyncRequest("GET", url, DynTree._callback, null); 
	    DynTree._callback.argument.currentNode = htmlNode;
	    DynTree._callback.argument.mode = mode;
    }
};

DynTree.reload = function(id)
{
	DynTree._reload(document.getElementById(id));
}

DynTree.reloadParent = function(id)
{
	DynTree._reload(document.getElementById(id).parentNode.parentNode);
};

DynTree._reload = function(el)
{
	if (el && (el.nodeName.toLowerCase() == "li"))
	{
		var jsonSource = el.getAttribute("titel");
		if (jsonSource)
		{
			DynTree._removeBranch(el);
			DynTree.request(el, jsonSource, "reload");
		}
	}
	else
	{
		location.reload();
	}
};

DynTree._callback = 
{
    success: function(req)
    {
        eval("var jsNode = " + req.responseText);
    	var li = DynTree._build(
    	    DynTree._callback.argument.currentNode,
    	    jsNode,
    	    DynTree._callback.argument.mode
	    );
    	if (li)
    	{
    		var ul = DynTree._getFirstElement(li, "ul");
    		if (ul)
    		{
            	ul.style.display = "block";
        	}
    		DynTree._walkBranch(li, DynTree._callback.argument.mode);
    	}
    	DynTree._callback.argument.currentNode = null;
    	DynTree.onReturn();
    },
    failure: function (req) 
    {
        alert("Oops, ein Fehler!\nVielleicht später noch mal probieren...");
    },
    argument: {
        currentNode: null,
        mode: null
    }
};

DynTree.onReturn = function() {};

DynTree._build = function(htmlNode, jsNode, mode)
{
	try
	{
		var li;
		switch (mode)
		{
			case "append":
			case "reload":
				li = htmlNode;
				break;
			case "branch" :
		        li = document.createElement("li");
				htmlNode.appendChild(li);
		        YAHOO.util.Event.addListener(li, "mouseover", DynTree._dragHit);
				DynTree._render(li, jsNode);
				break;
			default:
				// it is a root, so we have to create it
				var rootUl = document.createElement("ul");
				YAHOO.util.Dom.addClass(rootUl, "tree");
				htmlNode.appendChild(rootUl);
				htmlNode = rootUl;
		        li = document.createElement("li");
				htmlNode.appendChild(li);
		        YAHOO.util.Event.addListener(li, "mouseover", DynTree._dragHit);
				DynTree._render(li, jsNode);
		}
    	
		var list = jsNode.nodes;
		if (list && list.length > 0) {
			var ul;
			ul = document.createElement("ul");
		    li.appendChild(ul);
			if (jsNode.expand === "true")
			{
			    YAHOO.util.Dom.addClass(li, "expanded");
			}
		    // walk over the children
		    list = jsNode.nodes;
		    for (var i = 0; i < list.length; i++)
		    {
				DynTree._build(ul, list[i], "branch");
		    }
		}
	    return li;
	}
	catch (e)
	{
		location.reload();
	}
	return null;
};

DynTree._render = function(li, jsNode)
{
    var txt = jsNode.label;
    var a = document.createElement("a");
    a.href = jsNode.url ? jsNode.url : "#";
    a.title = txt;
    var target = jsNode.target;
    if (target)
    {
    	a.target = target;
    }
    if (jsNode.icon)
    {
    	var img = document.createElement("img");
    	img.src = DynTree._getImgUrl(jsNode.icon);
    	img.alt = txt;
    	a.appendChild(img);
    }
    a.appendChild(document.createTextNode(txt));
    
    var jsonSource = jsNode.jsonSource;
    if (jsonSource)
    {
    	li.setAttribute("title", jsonSource);
    }
	var id = jsNode.id;
    if (id)
    {
		li.id = id;
    }
    li.appendChild(a);
};
