﻿// RM jQuery Menu function v1.0
/* 
 * Options
 * dropDownClass: Text:     The class to distinguish a list item has a drop down menu
 * showHideClass: Text:     The class which toggles if a menu is visible or not
 * menuTimeDelay: Number:   The delay in milliseconds a menu is visible for when not selected
 */

jQuery.fn.menu = function (options) {
    fnOptions = jQuery.extend({
        dropDownClass: "has-drop",
        showHideClass: "show",
        menuTimeDelay: 1000
    }, options);

    var _menuTimeoutArray = Array();

    return this.each(function (index, item) {
        var _this = $(item);
        if (_this.hasClass(fnOptions.dropDownClass)) {
            var _targetMenu = $("> ul", _this);
            var _level1Menu = _targetMenu.hasClass("menu-l1");
            var _menuLevel = _targetMenu.parents("ul").length;

            _this.hover(function () {
                var _dimensions = { width: _this.outerWidth(), height: _this.outerHeight() };

                //Remove any sibling dropdown menus
                _this.siblings("li." + fnOptions.dropDownClass).children(".drop-down-menu").removeClass(fnOptions.showHideClass);

                //clear any timeouts on menus which are about to be hidden
                if (_menuTimeoutArray[_menuLevel] != null) {
                    clearTimeout(_menuTimeoutArray[_menuLevel]);
                }

                //redraw
                var position = _this.position();
                var menuPos = _level1Menu ?
                    {
                        x: position.left,
                        y: position.top + _dimensions.height
                    }
                    :
                    {
                        x: (position.left + _dimensions.width) + 2,
                        y: position.top - 1
                    }
                ;

                _targetMenu.css({ left: menuPos.x, top: menuPos.y });
                _targetMenu.addClass(fnOptions.showHideClass);
            },
            function () {
                //Add timeout to an array of timeouts. One for each menu
                _menuTimeoutArray[_menuLevel] = setTimeout(function () {
                    $("#nav ul.menu-l" + _menuLevel).removeClass(fnOptions.showHideClass);
                }, fnOptions.menuTimeDelay);
            });
        }
    });
}
