$.fn.isActive = function () {
    var style = $(this).css('display');
    return style === 'block';
};

$.fn.mouseInside = function (e) {
    var element = $(this);
    var elementOffset = element.offset();
    var left = elementOffset.left;
    var top = elementOffset.top;
    var right = left + element.width();
    var bottom = top + element.height();

    var valueInRange = function (value, min, max) {
        return (value >= min) && (value <= max);
    };
    
    var result = valueInRange(e.pageX, left - 5, right) && valueInRange(e.pageY, top - 5, bottom);

    return result;
};

$.fn.hideElement = function (e) {
    var el = $(this);
    var mouseInsideElement = $(this).mouseInside(e);
    if (mouseInsideElement === false) {
        el.hide();
    }
};

$.fn.hideElems = function (selector) {
    $(this).parent().find(selector).each(function (ind, elem) {
        $(elem).hide();
    });
};

$.fn.parentMenu = function () {
    return $(this).parent().parent();
};

$.fn.isFirstMenu = function () {
    return $(this).parent().parent().get(0).tagName.toLowerCase() == 'div';
};

$.fn.isRightPos = function () {
    return $(this).children('a.right').size() > 0;
};

$.fn.menu = function (parentMenu) {
    $(this).find('li').each(function (i, el) {
        var subMenu = $(el).find('ul:first');
        if (subMenu.size() > 0 && subMenu.isActive() === false) {
            $(el).mouseenter(function () {
                $(this).hideElems('ul');

                subMenu.mouseleave(function (e) {
                    subMenu.hideElement(e);
                });

                var position = $(this).position();
                var _top = ((parseInt(position.top) + parseInt($(this).parent().height())) - 2);
                var _left = (parseInt(position.left));

                if ($(this).isFirstMenu() === false) {
                    _left += $(this).width();
                    _top = parseInt(position.top) - $(this).scrollTop();
                }
                if ($(this).isRightPos()) {
                    _left = -(_left + 15);
                }
                _left += 'px';
                _top += 'px';

                subMenu.css({ top: _top, left: _left });
                subMenu.show();
            }).mouseleave(function (e) {
                subMenu.hideElement(e);
            });
        }
        subMenu.menu(subMenu);
    });
};
