menu.js 4.76 KB
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
/**
 * Simple Navigation with replacing old handlers.
 *
 * @param {String} id - id of ul element with navigation lists
 * @param {Object} settings - object with settings
 */
/**
 * global mainNav
 *
 * @deprecated
 * @see lib/web/mage/menu.js
 */
define([
    'prototype'
], function () {
    'use strict';

    /**
     * Main nav.
     */
    window.mainNav = function () {
        var main = {
            'obj_nav':   $(arguments[0]) || $('nav'),
            settings:  {
                'show_delay': 0,
                'hide_delay': 0,
                _ie6: /MSIE 6.+Win/.test(navigator.userAgent),
                _ie7: /MSIE 7.+Win/.test(navigator.userAgent)
            },

            /**
             * @param {Object} obj
             * @param {*} level
             */
            init: function (obj, level) {
                obj.lists = obj.childElements();
                obj.lists.each(function (el, ind) {
                    main.handlNavElement(el);

                    if ((main.settings._ie6 || main.settings._ie7) && level) {
                        main.ieFixZIndex(el, ind, obj.lists.size());
                    }
                });

                if (main.settings._ie6 && !level) {
                    document.execCommand('BackgroundImageCache', false, true);
                }
            },

            /**
             * @param {Object} list
             */
            handlNavElement: function (list) {
                if (list !== undefined) {

                    /**
                     * On mouse over.
                     */
                    list.onmouseover = function () {
                        main.fireNavEvent(this, true);
                    };

                    /**
                     * On mouse out.
                     */
                    list.onmouseout = function () {
                        main.fireNavEvent(this, false);
                    };

                    if (list.down('ul')) {
                        main.init(list.down('ul'), true);
                    }
                }
            },

            /**
             * @param {HTMLElement} el
             * @param {*} i
             * @param {*} l
             */
            ieFixZIndex: function (el, i, l) {
                if (el.tagName.toString().toLowerCase().indexOf('iframe') == -1) { //eslint-disable-line eqeqeq
                    el.style.zIndex = l - i;
                } else {
                    el.onmouseover = 'null';
                    el.onmouseout = 'null';
                }
            },

            /**
             * @param {Object} elm
             * @param {*} ev
             */
            fireNavEvent: function (elm, ev) {
                if (ev) {
                    elm.addClassName('over');
                    elm.down('a').addClassName('over');

                    if (elm.childElements()[1]) {
                        main.show(elm.childElements()[1]);
                    }
                } else {
                    elm.removeClassName('over');
                    elm.down('a').removeClassName('over');

                    if (elm.childElements()[1]) {
                        main.hide(elm.childElements()[1]);
                    }
                }
            },

            /**
             * @param {Object} subElm
             */
            show: function (subElm) {
                if (subElm['hide_time_id']) {
                    clearTimeout(subElm['hide_time_id']);
                }
                subElm['show_time_id'] = setTimeout(function () {
                    if (!subElm.hasClassName('shown-sub')) {
                        subElm.addClassName('shown-sub');
                    }
                }, main.settings['show_delay']);
            },

            /**
             * @param {Object} subElm
             */
            hide: function (subElm) {
                if (subElm['show_time_id']) {
                    clearTimeout(subElm['show_time_id']);
                }
                subElm['hide_time_id'] = setTimeout(function () {
                    if (subElm.hasClassName('shown-sub')) {
                        subElm.removeClassName('shown-sub');
                    }
                }, main.settings['hide_delay']);
            }

        };

        if (arguments[1]) {
            main.settings = Object.extend(main.settings, arguments[1]);
        }

        if (main['obj_nav']) {
            main.init(main['obj_nav'], false);
        }
    };

    document.observe('dom:loaded', function () {
        //run navigation without delays and with default id="#nav"
        //mainNav();

        //run navigation with delays
        window.mainNav('nav', {
            'show_delay': '100',
            'hide_delay': '100'
        });
    });
});