
var simpleMenu = {
    NodeId: 0,
    Node: {
        ELEMENT_NODE: 1,
        ATTRIBUTE_NODE: 2,
        TEXT_NODE: 3,
        COMMENT_NODE: 8,
        DOCUMENT_NODE: 9,
        DOCUMENT_FRAGMENT_NODE: 11
    },
    visibleMenus: [],
    listWalker: function(listElement, ulFn, depth) {
        if(listElement.nodeType != simpleMenu.Node.ELEMENT_NODE) return;

        if(listElement.nodeName.toLowerCase() == 'ul')
            ulFn(listElement, ++depth);

        for(var node in listElement.childNodes) {
            this.listWalker(listElement.childNodes[node], ulFn, depth);
        }
    },
    show: function(e, depth) {
        e.style.display = "block";

        var width = Math.ceil(e.children.length / 15) * 200;
        var maxRight = jQuery("#productMenu")[0].offsetWidth;
        e.style.width = width + "px";
        if(depth > 1) {
            var left;
            var offset = 40;
            var parentPos = findPosition(e.parentNode);
            if(parentPos[0] + e.parentNode.offsetWidth + width  > maxRight)
                left = e.parentNode.offsetLeft - width + 5;
            else
                left = e.parentNode.offsetLeft + e.parentNode.offsetWidth - offset;
            e.style.left = left + "px";

            var maxBottom = document.body.clientHeight + document.body.scrollTop + document.documentElement.scrollTop;
            var clip = parentPos[1] + e.offsetHeight - maxBottom;
            if(clip < 0) clip = 0;
            
            e.style.top = (e.parentNode.offsetTop - clip) + "px";
        } else {
            e.style.position = "absolute";
            e.style.left = Math.min(e.parentNode.offsetLeft, maxRight - width) + "px";
            e.style.top = e.parentNode.offsetHeight + "px";
        }

        e.style.visibility = "visible";
        jQuery(e).addClass("active");
        jQuery(e.parentNode).addClass("active");

    },
    hide: function(e) {
        e.style.visibility = "hidden";
        jQuery(e).removeClass("active");
        jQuery(e.parentNode).removeClass("active");
    },
    addHooverIntent: function(elm, over, out) {
        if(!elm.menuId) elm.menuId = simpleMenu.NodeId++;
        simpleMenu.add(elm, "mouseover", function(e) {
            if(over)
                mouseEvents.push({element: elm, mouseover: function() {over(e);}, mouseout: function(){}});
            mouseEventMask[elm.menuId] = {event: 'mouseover', pos: mouseEvents.length};
        });
        simpleMenu.add(elm, "mouseout", function(e) {
            if(out)
                mouseEvents.push({element: elm, mouseover: function() {}, mouseout: function(){out(e)}});
            mouseEventMask[elm.menuId] = {event: 'mouseout', pos: mouseEvents.length};
        });
    },
    init: function(listElement) {
        this.listWalker(listElement,
                function(e, depth) {
                    simpleMenu.addHooverIntent(e.parentNode, function() {
                        for(var i in simpleMenu.visibleMenus) {
                            if(simpleMenu.visibleMenus[i] === e) return;
                        }
                        while(simpleMenu.visibleMenus.length >= depth) {
                            simpleMenu.hide(simpleMenu.visibleMenus.pop());
                        }
                        simpleMenu.visibleMenus.push(e);
                        simpleMenu.show(e, depth);
                    }, null);

                    simpleMenu.addHooverIntent(e, null, function(evnt) {
                        var x = evnt.pageX;
                        var y = evnt.pageY;

                        for(var i in simpleMenu.visibleMenus) {
                            var elm = simpleMenu.visibleMenus[i];
                            var pos = findPosition(elm);
                            var pos2 =  [pos[0] + elm.offsetWidth, pos[1] + elm.offsetHeight];
                            if(x > pos[0] && x < pos2[0] &&
                               y > pos[1] && y < pos2[1]) return;
                        }
                        while(simpleMenu.visibleMenus.length > 0)
                            simpleMenu.hide(simpleMenu.visibleMenus.pop());
                    });
                    },
                0
                );

    }
}

function findPosition(elm) {
    if(!elm) return [0,0];
    var pos = findPosition(elm.offsetParent);
    return [pos[0] + elm.offsetLeft, pos[1] + elm.offsetTop];
}

if(document.addEventListener) {
    simpleMenu.add = function(element, eventType, handler) {
        element.addEventListener(eventType, handler, false);
    }
} else if(document.attachEvent) {//simulate w3c event handling in ie
    simpleMenu.add = function(element, eventType, handler) {
        var wrappedHandler = function(e) {
            if(!e) e = window.event;
            var event = {
                screenX: e.screenX, screenY: e.screenY,
                clientX: e.clientX, clientY: e.clientY,
                pageX: e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,
                pageY:  e.clientY + document.body.scrollTop + document.documentElement.scrollTop,


                currentTarget: element
            };//todo
            if(Function.prototype.call)
                handler.call(element, event);
            else {
                element._currentHandler = handler;
                element._currentHandler(event);
                element._currentHandler = null;
            }
        }
        element.attachEvent("on" + eventType, wrappedHandler);
    }
}

var mouseVelocity = [0,0];
var mousePos = [0,0];
var mousePos2 = [0,0];
var mouseEvents = [];
var mouseEventMask = {};


var calcVelocity = function(){
    mouseVelocity = [mousePos[0] - mousePos2[0], mousePos[1] - mousePos2[1]];
    mousePos2 = [mousePos[0], mousePos[1]];
    if(mouseVelocity[0] * mouseVelocity[0] + mouseVelocity[1] * mouseVelocity[1] < 5) {
        for(var i in mouseEvents) {
            var mask = mouseEventMask[mouseEvents[i].element.menuId];
            if(mask.pos >= i) {
                if(mask.event == 'mouseover')
                    mouseEvents[i].mouseover();
                if(mask.event == 'mouseout')
                    mouseEvents[i].mouseout();
            }
        }

        mouseEvents = [];
        mouseEventMask = {};
    }
    setTimeout("calcVelocity()", 100);
};


function svanstromsMenu() {
    if(!document.body) {
        setTimeout("svanstromsMenu()", 100);
        return;
    }
    
    simpleMenu.add(document.body, "mousemove", function(e) {
        mousePos = [e.clientX,  e.clientY];
    });
    calcVelocity();
    jQuery("#productMenu>ul>li").not("#productMenu>ul>li.pos0").each(function() {simpleMenu.init(this)});
    jQuery("#productMenu>ul>li.pos0>ul>li").each(function() {simpleMenu.init(this)});
}
svanstromsMenu();