    /**
     * p3DD - polygon3 DropDown Multilayer Menue
     *
     * @version 200901091
 	 * @author polygon3 technologies || {@link http://www.p3t.de/}
	 * @copyright 2009 polygon3 technologies || {@link http://www.p3t.de/}
     */
    var timeout = 100, 
        childs = [],
        parents = [],
        activeLayer = [];
    
    function element(id){
        return document.getElementById(id);
    }
    
    function p3DDLocate(m,s,p) {
        var main = element(m);
        var sub = element(s);
        var top  = (p == "y") ? main.offsetHeight+ 2 : 0;
        var left = (p == "x") ? main.offsetWidth+ 2 : 0;
        for(;main;main = main.offsetParent){
            top  += main.offsetTop;
            left += main.offsetLeft;
        }
        sub.style.position   = "absolute";
        sub.style.top        = top + 'px';
        sub.style.left       = left + 'px';
        sub.style.visibility = 'hidden';
    }
    
    function p3DDHide(id){
        if(activeLayer[id] != id){
            if(element(id))
                element(id).style.visibility = 'hidden';
        }
    }
    
    function p3DDShow(id){
        if(element(id))
			element(id).style.visibility = 'visible';
    }

    function p3DDHideAll(){
        for(var e in activeLayer){
            element(e).timeout = setTimeout("p3DDHide('" + e + "');",timeout);
            delete activeLayer[e];
        }
    }
    
    function p3DDGetParent(id){
        return p3DDGetLayer(parents[p3DDGetLayer(id)])
    }
    
    function p3DDRebuildTree(id){
        var rebuilds = [];
        if(element(p3DDGetParent(id))){
            var z = p3DDGetParent(id);
            while(true){
                if(element(z)){
                    if(element(z).isMainBar == 1)
                        break;
                    else {
                        rebuilds[z] = z;
                        z = p3DDGetParent(z);
                        continue;
                    }
                }
            }
            for(var e in rebuilds){
                clearTimeout(element(e).timeout);
                activeLayer[e] = e;
            }
        }
    }
    
    function p3DDAssignElements(){
        var e = document.getElementsByTagName("DIV");
        var parent;
        for(var i = 0; i < e.length; i++){
			parent = -1;
            if(e[i].parentNode.id == "p3DDMenuBar")
                e[i].isMainBar = 1;
            else if(e[i].parentNode.id == "p3DDSubMenus"){
                if(e[i].getAttribute("p3DDParent")){
					parent = e[i].getAttribute("p3DDParent");
					element(parent).onmouseover = p3DDNavLayerOver;
					element(parent).onmouseout = p3DDNavLayerOut;
					element(parent).onclick = p3DDHideAll;
                    
                }
                parents[e[i].id] = p3DDGetLayer(parent);
                childs[parent] = e[i].id;
                p3DDLocate(parent,e[i].id,e[i].getAttribute("p3DDDir"));
            }
            else if(e[i].parentNode.parentNode.id == "p3DDSubMenus"){
                if(element(e[i].id)){
                    element(e[i].id).onmouseover = p3DDNavLayerOver;
                    element(e[i].id).onmouseout = p3DDNavLayerOut;
                    element(e[i].id).onclick = p3DDHideAll;
                }
            }
        }
    }
    
    function p3DDNavLayerOver(){
		var layer = p3DDGetLayer(this.id);
        p3DDRebuildTree(layer);
		if(element(layer).timeout != null){
            activeLayer[layer] = layer;
			clearTimeout(element(layer).timeout);
		}
		if(element(childs[this.id])){
            if(element(childs[this.id]).timeout != null){
                clearTimeout(element(childs[this.id]).timeout);
            }
            activeLayer[childs[this.id]] = layer;
            p3DDLocate(this.id,childs[this.id],element(childs[this.id]).getAttribute("p3DDDir"));
			p3DDShow(childs[this.id]);
		}
        var z = p3DDGetParent(this.id);
        if(z != false){
            if(element(z).timeout != null){
                clearTimeout(element(z).timeout);
                activeLayer[z] = z;
            }
        }
    }
    
    function p3DDNavLayerOut(){
		if(element(childs[this.id])){
            delete activeLayer[childs[this.id]];
			element(childs[this.id]).timeout = setTimeout("p3DDHide('" + childs[this.id] + "');",timeout);
		}
		var layer = p3DDGetLayer(this.id);
		if(element(layer).isMainBar != 1){
            delete activeLayer[layer];
			element(layer).timeout = setTimeout("p3DDHide('" + layer + "');",timeout);
        }
        p3DDHideAll();
    }
    
    function p3DDGetLayer(id){
        if(id != null){
            var r;
            if(id.length > 2){
                if(id.indexOf("_") != -1){
                    var s = id.split("_");
                    r = s[0];
                }
                else r = id;
                return r;
            }
            else return false;
        }
        else return false;
        
    }

    // LOAD 
    function p3DDAddOnload(){
        var old = window.onload;
        if (typeof window.onload != 'function') {
            window.onload = p3DDAssignElements;
        }
        else {
            window.onload = function() {
                old();
                p3DDAssignElements();
            };
        }
    }

    p3DDAddOnload();
