PageSourceSearch

https://www.vocallity.com/template/aa49d3be8e1740c2bd42ef9229f6bb6b/js/megamenu.js

js vocallity.com collected 2026-10-09 00:11:43 UTC 16,224 bytes, 380 lines download raw bytes

1(function() {
2
3    'use strict';
4    var inBrowser = typeof window !== 'undefined' && Object.prototype.toString.call(window) !== '[object Object]',
5        isIE = inBrowser && (navigator.userAgent.indexOf("MSIE") > -1);
6    var win = inBrowser ? window : global;
7    var LIB = {};
8
9    LIB.mmPlugin = function(menu, opts) {
10
11        var noop = function() {};
12        var menuContainer = menu,
13            activeMenuitem = null,
14            mousePosition = [],
15            lastDelayPosition = null,
16            timeoutId = null,
17            options = Object.assign({}, {
18                menuItem: ".theme-menu > ul > li",
19                megamenuItem: "data-megamenu",
20                megamenuContent: "[data-megamenu-content] .zpmm-inner",
21                megamenuDirection: "below",
22                megamenuEvent: "hover",
23                onMouseEnterMenuItem: noop,
24                onMouseLeaveMenuItem: noop,
25                activateMenuItem: noop,
26                deactivateMenuItem: noop,
27                exitMenuContainer: noop
28            },
29            opts);
30
31        var previousMousePosition = 3,
32            mousePositionDelay = 400;
33            
34        var mousemoveDocument = function(e) {
35            mousePosition.push({
36                x: e.pageX,
37                y: e.pageY
38            });
39            if (mousePosition.length > previousMousePosition) {
40                mousePosition.shift();
41            }
42        };
43
44        var mouseleaveMenu = function() {
45            if (timeoutId) {
46                clearTimeout(timeoutId);
47            }
48
49            if (options.exitMenuContainer(this)) {
50                if (activeMenuitem) {
51                    options.deactivateMenuItem(activeMenuitem);
52                }
53
54                activeMenuitem = null;
55            }
56            return this;
57        };
58
59        var mouseenterMenuContent = function() {
60            if (timeoutId) {
61                clearTimeout(timeoutId);
62            }
63        }
64
65        var mouseenterMenuitem = function() {
66                if (timeoutId) {
67                    clearTimeout(timeoutId);
68                }
69
70                options.onMouseEnterMenuItem(this);
71                possiblyActivate(this);
72                return this;
73            },
74            mouseleaveMenuitem = function() {
75                options.onMouseLeaveMenuItem(this);
76                return this;
77            };
78        var clickMenuitem = function(e) {
79            e.preventDefault();
80            activate(this);
81        };
82        var activate = function(megamenuItem) {
83            if (megamenuItem == activeMenuitem && options.megamenuEvent == 'hover') {
84                return;
85            } else if (megamenuItem == activeMenuitem && options.megamenuEvent == 'click') {
86                options.deactivateMenuItem(activeMenuitem);
87                activeMenuitem = null;
88                return;
89            }
90
91            if (activeMenuitem) {
92                options.deactivateMenuItem(activeMenuitem);
93            }
94
95            options.activateMenuItem(megamenuItem);
96            activeMenuitem = megamenuItem;
97        };
98
99        var possiblyActivate = function(megamenuItem) {
100            if (!megamenuItem.hasAttribute(options.megamenuItem)) {
101                if (activeMenuitem) {
102                    options.deactivateMenuItem(activeMenuitem);
103                    activeMenuitem = null;
104                }
105                return;
106            }
107
108            var delay = activationDelay();
109
110            if (delay) {
111                timeoutId = setTimeout(function() {
112                    possiblyActivate(megamenuItem);
113                }, delay);
114            } else {
115                activate(megamenuItem);
116            }
117        };
118
119        var activationDelay = function() {
120            function getOffset(element) {
121                if (!element.getClientRects().length) {
122                    return {
123                        top: 0,
124                        left: 0
125                    };
126                }
127
128                let rect = element.getBoundingClientRect();
129                let win = element.ownerDocument.defaultView;
130                return ({
131                    top: rect.top + win.pageYOffset,
132                    left: rect.left + win.pageXOffset
133                });
134            }
135            if (!activeMenuitem || !activeMenuitem.hasAttribute(options.megamenuItem)) {
136
137                return 0;
138            }
139
140            var activeMegamenuContentId = activeMenuitem.getAttribute('data-megamenu');
141            var activemegamenuContent = document.querySelector("[data-megamenu-content='" + activeMegamenuContentId + "']");
142
143            var offsetEl = getOffset(activemegamenuContent);
144            var offsetLeft = offsetEl.left;
145            var offsetTop = offsetEl.top,
146                upperLeft = {
147                    x: offsetLeft,
148                    y: offsetTop
149                },
150                upperRight = {
151                    x: offsetLeft + activemegamenuContent.offsetWidth,
152                    y: upperLeft.y
153                },
154                lowerLeft = {
155                    x: offsetLeft,
156                    y: offsetTop + activemegamenuContent.offsetHeight
157                },
158                lowerRight = {
159                    x: offsetLeft + activemegamenuContent.offsetWidth,
160                    y: lowerLeft.y
161                },
162                curLoc = mousePosition[mousePosition.length - 1],
163                prevLoc = mousePosition[0];
164
165            if (!curLoc) {
166                return 0;
167            }
168
169            if (!prevLoc) {
170                prevLoc = curLoc;
171            }
172
173            if (lastDelayPosition &&
174                curLoc.x == lastDelayPosition.x && curLoc.y == lastDelayPosition.y) {
175                return 0;
176            }
177            var isPointInsideTriangle = isInsideTriangle(curLoc.x, curLoc.y, prevLoc.x, prevLoc.y, upperLeft.x, upperLeft.y, upperRight.x, upperRight.y);
178            if (options.megamenuDirection == "right") {
179                var isPointInsideTriangle = isInsideTriangle(curLoc.x, curLoc.y, prevLoc.x, prevLoc.y, upperLeft.x, upperLeft.y, lowerLeft.x, lowerLeft.y);
180            }
181            function isInsideTriangle(px, py, ax, ay, bx, by, cx, cy) {
182                var v0 = [cx - ax, cy - ay];
183                var v1 = [bx - ax, by - ay];
184                var v2 = [px - ax, py - ay];
185
186                var dot00 = (v0[0] * v0[0]) + (v0[1] * v0[1]);
187                var dot01 = (v0[0] * v1[0]) + (v0[1] * v1[1]);
188                var dot02 = (v0[0] * v2[0]) + (v0[1] * v2[1]);
189                var dot11 = (v1[0] * v1[0]) + (v1[1] * v1[1]);
190                var dot12 = (v1[0] * v2[0]) + (v1[1] * v2[1]);
191
192                var invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
193
194                var u = (dot11 * dot02 - dot01 * dot12) * invDenom;
195                var v = (dot00 * dot12 - dot01 * dot02) * invDenom;
196
197                return ((u >= 0) && (v >= 0) && (u + v < 1));
198            }
199
200            if (isPointInsideTriangle) {
201                lastDelayPosition = curLoc;
202                return mousePositionDelay;
203            }
204
205            lastDelayPosition = null;
206            return 0;
207        };
208
209        if (options.megamenuEvent == 'hover') {
210            var megamenuContent = document.querySelectorAll(options.megamenuContent);
211            for (var i = 0; i < megamenuContent.length; i++) {
212                megamenuContent[i].addEventListener('mouseenter', mouseenterMenuContent);
213            }
214            var megamenuBackdrop = document.querySelector(".zpmm-backdrop");
215            megamenuBackdrop.addEventListener('mouseenter', mouseleaveMenu);
216            var menuItem = menuContainer.querySelectorAll(options.menuItem);
217            for (var i = 0; i < menuItem.length; i++) {
218                menuItem[i].addEventListener('mouseenter', mouseenterMenuitem);
219                menuItem[i].addEventListener('mouseleave', mouseleaveMenuitem);
220            }
221            document.addEventListener("mousemove", mousemoveDocument);
222        } else if (options.megamenuEvent == 'click') {
223            var menuItem = menuContainer.querySelectorAll(options.menuItem);
224            for (var i = 0; i < menuItem.length; i++) {
225                menuItem[i].addEventListener('click', clickMenuitem);
226            }
227        }
228    }
229
230    win.$mm = LIB.mmPlugin;
231
232})();
233
234
235function initMegamenu() {
236    var megamenuContent = $D.getAll('[data-megamenu-content]');
237    var megamenuContentContainer = $D.get('[data-megamenu-content-container]');
238    if(megamenuContent && megamenuContent.length>0 && megamenuContentContainer){
239        if (window.innerWidth >= 992) {
240            var megamenuBackdrop = document.querySelector(".zpmm-backdrop");
241            var megamenuDirection = document.querySelector("[data-megamenu-direction]").getAttribute('data-megamenu-direction');
242            if ((typeof(megamenuContent) != 'undefined' && megamenuContent != null) && (typeof(megamenuContentContainer) != 'undefined' && megamenuContentContainer != null)) {
243                moveMegamenuContent(megamenuContentContainer, megamenuContent);
244            }
245
246            var menu = document.querySelector("[data-megamenu-content-container]  .theme-menu > ul");
247            $mm(menu, {
248                megamenuDirection: megamenuDirection,
249                activateMenuItem: activateMegamenu,
250                deactivateMenuItem: deactivateMegamenu,
251                exitMenuContainer: exitMegamenu
252            });
253
254            function activateMegamenu(megamenuItem) {
255                var megamenuContentId = megamenuItem.getAttribute('data-megamenu'),
256                    megamenuContent = document.querySelector("[data-megamenu-content='" + megamenuContentId + "']"),
257                    megamenuDirection = document.querySelector("[data-megamenu-direction]").getAttribute('data-megamenu-direction'),
258                    sidebarnav = document.querySelector('.theme-veritical-nav-with-sidebar');
259                if (typeof(sidebarnav) == 'undefined' || sidebarnav == null) {
260                    document.body.classList.add("theme-body-overflowhidden");
261                }
262                megamenuContent.classList.add("mmactive");
263                if (megamenuDirection == 'right') {
264                    var megamenuContentContainer = $D.get('[data-megamenu-content-container]');
265                    var megamenuItemBounding = megamenuItem.getBoundingClientRect();
266                    var firstMegamenuItemBounding = megamenuItem.parentNode.firstChild.getBoundingClientRect();
267                    var firstVisibleMegamenuItem, lastVisibleMegamenuItem, elPos;
268                    var megamenuItems = megamenuItem.parentNode.querySelectorAll("[data-megamenu]");
269                    for (var i = 0; i < megamenuItems.length; i++) {
270                        var isElemOutOfViewport = isOutOfViewport(megamenuItems[i]);
271                        if ((firstVisibleMegamenuItem == 'undefined' || firstVisibleMegamenuItem == null) && isElemOutOfViewport.top == false) {
272                            firstVisibleMegamenuItem = megamenuItems[i]
273                        }
274                        if ((firstVisibleMegamenuItem != 'undefined' || firstVisibleMegamenuItem != null) && (lastVisibleMegamenuItem == 'undefined' || lastVisibleMegamenuItem == null) && isElemOutOfViewport.bottom == true) {
275                            lastVisibleMegamenuItem = megamenuItems[i - 1]
276                        } else if (i == megamenuItems.length - 1) {
277                            lastVisibleMegamenuItem = megamenuItems[i]
278                        }
279                    }
280                    elPos = getPosition(firstVisibleMegamenuItem);
281                    megamenuContent.style.top = elPos.top - 30 + "px";
282                    if ((lastVisibleMegamenuItem.getBoundingClientRect().top - firstVisibleMegamenuItem.getBoundingClientRect().top) < 450) {
283                        megamenuContent.style.height = 500 + "px";
284                    } else {
285                        megamenuContent.style.height = lastVisibleMegamenuItem.getBoundingClientRect().top + lastVisibleMegamenuItem.getBoundingClientRect().height - firstVisibleMegamenuItem.getBoundingClientRect().top + 60 + "px";
286                    }
287                    megamenuContent.style.left = megamenuContentContainer.clientWidth + "px";
288                    megamenuContent.style.width = (window.innerWidth || document.documentElement.clientWidth) - megamenuContentContainer.clientWidth + "px";
289
290
291                    if (typeof(sidebarnav) == 'undefined' || sidebarnav == null) {
292                        megamenuContent.style.top = firstMegamenuItemBounding.top - 30 + "px";
293                    }
294
295
296                }
297                megamenuItem.classList.add("theme-menu-selected");
298                megamenuBackdrop.style.display = "block";
299            }
300
301            function deactivateMegamenu(megamenuItem) {
302                var megamenuContentId = megamenuItem.getAttribute('data-megamenu'),
303                    megamenuContent = document.querySelector("[data-megamenu-content='" + megamenuContentId + "']"),
304                    megamenuDirection = document.querySelector("[data-megamenu-direction]").getAttribute('data-megamenu-direction'),
305                    sidebarnav = document.querySelector('.theme-veritical-nav-with-sidebar');
306                if (typeof(sidebarnav) == 'undefined' || sidebarnav == null) {
307                    document.body.classList.remove("theme-body-overflowhidden");
308                }
309                megamenuContent.classList.remove("mmactive");
310                megamenuItem.classList.remove("theme-menu-selected");
311                if (megamenuDirection == 'right') {
312                    megamenuContent.style.top = "";
313                    megamenuContent.style.bottom = "";
314                    megamenuContent.style.left = "";
315                    megamenuContent.style.width = "";
316                    megamenuContent.style.maxHeight = "";
317                }
318                megamenuBackdrop.style.display = "none";
319                lastVisibleMegamenuItem = firstVisibleMegamenuItem = undefined;
320            }
321
322            function exitMegamenu(backdrop) {
323                return true;
324            }
325        } else {
326            moveMegamenuContentResponsive(megamenuContent);
327        }
328    }
329}
330
331function moveMegamenuContent(container, content) {
332    for (var i = 0; i < content.length; i++) {
333        $D.append(container, content[i]);
334    }
335}
336
337function moveMegamenuContentResponsive(content) {
338    var contentId, container;
339    for (var i = 0; i < content.length; i++) {
340        contentId = content[i].getAttribute('data-megamenu-content');
341        container = document.querySelector("[data-megamenu='" + contentId + "'] > ul");
342        $D.append(container, content[i]);
343    }
344}
345
346var isOutOfViewport = function(elem) {
347    var bounding = elem.getBoundingClientRect();
348    var out = {};
349    out.bounding = bounding;
350    out.top = bounding.top < 0;
351    out.left = bounding.left < 0;
352    out.bottom = bounding.bottom > (window.innerHeight || document.documentElement.clientHeight);
353    out.right = bounding.right > (window.innerWidth || document.documentElement.clientWidth);
354    out.any = out.top || out.left || out.bottom || out.right;
355    out.all = out.top && out.left && out.bottom && out.right;
356    out.elh = bounding.height;
357    out.vw = (window.innerWidth || document.documentElement.clientWidth);
358    out.vh = (window.innerHeight || document.documentElement.clientHeight);
359    return out;
360};
361
362function getPosition(elem) {
363    var bounding = elem.getBoundingClientRect();
364    var elPos = {};
365    var body = document.body;
366    var docEl = document.documentElement;
367    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
368    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
369    var clientTop = docEl.clientTop || body.clientTop || 0;
370    var clientLeft = docEl.clientLeft || body.clientLeft || 0;
371    elPos.top = Math.round(bounding.top + scrollTop - clientTop);
372    elPos.left = Math.round(bounding.left + scrollLeft - clientLeft);
373    return elPos;
374}
375
376$E.callOnLoad(initMegamenu);
377
378window.addEventListener('resize', function(event) {
379    initMegamenu();
380});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.