    // wd_state = "closed", "closing", "opening", "opened"
    var wd_showTimeout = 100;
    var wd_hideTimeout = 500;
    
    function wd_getObj (name)
    {
        var e = document.getElementById (name);
        return e;
    }
    
    function wd_setTimeout (wyrazenie, czas)
    {
        var e = window.setTimeout (wyrazenie, czas);
        return e;
    }
    
    function wd_clearTimeout (id)
    {
        window.clearTimeout (id);
    }

    function wd_openMenu (id, recurse)
    {
        var children = wd_getObj ('wd_menu' + id);
        if (children && children.wd_state == "closed" || children.wd_state == "closing")
        {
            if (children.wd_hideTimeout)
                wd_clearTimeout (children.wd_hideTimeout);
                
            children.wd_showTimeout = wd_setTimeout ("wd_showMenu (\"" + id + "\")", wd_showTimeout);
            children.wd_state = "opening";
            
            var parent = wd_getObj ('wd_menu' + children.wd_parent);
            if (recurse && parent)
            {
                wd_openMenu (children.wd_parent, recurse);
            }
        }
    }

    function wd_showMenu (id)
    {
        var parent = wd_getObj ('wd_item' + id);
        var children = wd_getObj ('wd_menu' + id);
        
        if (parent && children);
        {
            var left = DL_GetElementLeft(parent);
            var top = DL_GetElementTop(parent);
        
            var width = parent.offsetWidth;
            var height = parent.offsetHeight;
            var child_width = children.offsetWidth;
            var child_height = children.offsetHeight;
            
            var left_shift = 0;
            var top_shift = 0;
            switch (children.wd_orientation)
            {
                case 3:
                    left_shift -= child_width - children.wd_horizontal_shift;
                    top_shift -= (children.wd_orientation_align ? 0 : (child_height - height)) - children.wd_vertical_shift;
                    break;
                case 2:
                    top_shift -= child_height - children.wd_vertical_shift;
                    left_shift -= (children.wd_orientation_align ? 0 : (child_width - width)) - children.wd_horizontal_shift;
                    break;
                case 1:
                    left_shift += width + children.wd_horizontal_shift;
                    top_shift -= (children.wd_orientation_align ? (child_height - height) : 0) - children.wd_vertical_shift;
                    break;
                case 0:
                    top_shift += height + children.wd_vertical_shift;
                    left_shift -= (children.wd_orientation_align ? (child_width - width) : 0) - children.wd_horizontal_shift;
                    break;
            }
            
            children.style.left = left + left_shift;
            children.style.top = top + top_shift;

            children.style.visibility='visible';
            
            children.wd_state = "opened";
        }
    }

    function wd_hideMenu (id, recurse)
    {
        var children = wd_getObj ('wd_menu' + id);
        if (children && children.wd_state == "opened" || children.wd_state == "opening")
        {
            if (children.wd_showTimeout)
                wd_clearTimeout (children.wd_showTimeout);

            children.wd_hideTimeout = wd_setTimeout ("wd_closeMenu (\"" + id + "\")", wd_hideTimeout);
            children.wd_state = "closing";

            var parent = wd_getObj ('wd_menu' + children.wd_parent);
            if (recurse && parent)
            {
                wd_hideMenu (children.wd_parent);
            }
        }
    }
    
    function wd_closeMenu (id)
    {
        var parent = wd_getObj ('wd_item' + id);
        var children = wd_getObj ('wd_menu' + id);
        
        if (parent && children);
        {
            children.style.visibility='hidden';
            children.wd_state = "closed";
        }
    }
