????JFIF??x?x????'
Server IP : 79.136.114.73 / Your IP : 3.137.223.8 Web Server : Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.29 OpenSSL/1.0.1f System : Linux b8009 3.13.0-170-generic #220-Ubuntu SMP Thu May 9 12:40:49 UTC 2019 x86_64 User : www-data ( 33) PHP Version : 5.5.9-1ubuntu4.29 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /var/www/www.astacus.se/wp-content/plugins/Temp-Hold/ubermenu/assets/js/ |
Upload File : |
/* * ubermenu.js * * http://wpmegamenu.com * * Copyright Chris Mavricos, SevenSpark http://sevenspark.com */ //Define dependencies first because deferred scripts don't respect document ready order ;var uber_supports = (function() { var div = document.createElement('div'), vendors = 'Khtml Ms O Moz Webkit'.split(' '); return function(prop) { var len = vendors.length; if ( prop in div.style ) return true; prop = prop.replace(/^[a-z]/, function(val) { return val.toUpperCase(); }); while(len--) { if ( vendors[len] + prop in div.style ) { return true; } } return false; }; })(); function uber_op( id , args , def ){ //If no id if( !ubermenu_data.hasOwnProperty( id ) ){ return def; } var val = ubermenu_data[id]; if( args.hasOwnProperty( 'datatype' ) ){ switch( args['datatype'] ){ case 'numeric': val = parseInt( val ); break; case 'boolean': if( val == 'on' || val == 1 || val == '1' ){ val = true; } else{ val = false; } break; } } return val; } ;(function($,sr){ // debouncing function from John Hann // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ var debounce = function (func, threshold, execAsap) { var timeout; return function debounced () { var obj = this, args = arguments; function delayed () { if (!execAsap) func.apply(obj, args); timeout = null; }; if (timeout) clearTimeout(timeout); else if (execAsap) func.apply(obj, args); timeout = setTimeout(delayed, threshold || 100); }; } jQuery.fn[sr] = function(fn){ return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); }; })(jQuery,'ubersmartresize'); ;(function ( $, window, document, undefined ) { 'use strict'; var pluginName = "ubermenu", defaults = { breakpoint: uber_op( 'responsive_breakpoint' , { datatype: 'numeric' } , 959 ), touchEvents: true, mouseEvents: true, retractors: true, touchOffClose: uber_op( 'touch_off_close' , {datatype: 'boolean' } , true ), //true, moveThreshold: 10, //Distance until tap is cancelled in deference to move/scroll submenuAnimationDuration: 500, //ms duration or submenu close time ignoreDummies: true, clicktest: false, windowstest: false, debug: false, debug_onscreen: false, remove_conflicts: uber_op( 'remove_conflicts' , {datatype: 'boolean' } , true ), reposition_on_load: uber_op( 'reposition_on_load' , { datatype: 'boolean' } , false ), accessible: uber_op( 'accessible' , {datatype: 'boolean' } , true ), retractor_display_strategy: uber_op( 'retractor_display_strategy' , {datatype: 'string'}, 'responsive' ), intent_delay: uber_op( 'intent_delay' , { datatype: 'numeric' } , 300 ), //delay before the menu closes intent_interval: uber_op( 'intent_interval' , { datatype: 'numeric' } , 100 ), //polling interval for mouse comparisons intent_threshold: uber_op( 'intent_threshold' , { datatype: 'numeric' } , 300 ), //maximum number of pixels mouse can move to be considered intent scrollto_offset: uber_op( 'scrollto_offset' , { datatype: 'numeric' } , 0 ), scrollto_duration: uber_op( 'scrollto_duration' , { datatype: 'numeric' } , 1000 ), collapse_after_scroll: uber_op( 'collapse_after_scroll' , {datatype:'boolean'}, true ), }/*, keys = { BACKSPACE: 8, COMMA: 188, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, LEFT: 37, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SPACE: 32, TAB: 9, UP: 38 }*/; // instantiate variables // cX, cY = current X and Y position of mouse, updated by mousemove event // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval var cX, cY, pX, pY; function Plugin ( element, options ) { var plugin = this; //reference for all this.element = element; this.$ubermenu = $( this.element ); this.orientation = this.$ubermenu.hasClass( 'ubermenu-vertical' ) ? 'v' : 'h'; this.settings = $.extend( {}, defaults, options ); this._defaults = defaults; this._name = pluginName; this.settings.responsive = this.$ubermenu.hasClass( 'ubermenu-responsive' ) ? true : false; if( this.settings.debug && this.settings.debug_onscreen ){ $( 'body' ).append( '<div id="uber-onscreen-debug" style="color:#eee;z-index:10000;background:#222;position:fixed;left:0; bottom:0; width:100%; height:50%; padding:10px;overflow:scroll;"> ' ); this.debug_target = $( '#uber-onscreen-debug' ); this.debug_target.on( 'click' , function(){ if( $(this).height() < 100 ) $(this).height( '50%' ); else $(this).height( '50px' ); }); } this.log( '-- START UBERMENU DEBUG --' ); this.events_disabled = false; this.suppress_clicks = false; //Set to true if the mouse events support 'pointerup', which handles both touch and click (but not hover) this.touchenabled = ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0); if( this.touchenabled ){ this.$ubermenu.addClass( 'ubermenu-touch' ); } else this.$ubermenu.addClass( 'ubermenu-notouch' ); if( window.navigator.pointerEnabled ){ this.touchStart = 'pointerdown'; this.touchEnd = 'pointerup'; this.touchMove = 'pointermove'; this.suppress_clicks = true; } else if( window.navigator.msPointerEnabled ){ this.touchStart = 'MSPointerDown'; this.touchEnd = 'MSPointerUp'; this.touchMove = 'MSPointerMove'; this.suppress_clicks = true; } else{ this.touchStart = 'touchstart'; this.touchEnd = 'touchend'; this.touchMove = 'touchmove'; } this.toggleevent = this.touchEnd == 'touchend' ? this.touchEnd + ' click' : this.touchEnd; //add click except for IE this.transitionend = 'transitionend.ubermenu webkitTransitionEnd.ubermenu msTransitionEnd.ubermenu oTransitionEnd.ubermenu'; //Are transitions supported? this.transitions = uber_supports( 'transition' ) && !this.$ubermenu.hasClass( 'ubermenu-transition-none' ); if( !this.transitions ) this.$ubermenu.addClass( 'ubermenu-no-transitions' ); //Detect crappy Android & Windows browsers and disable transitions var ua = navigator.userAgent.toLowerCase(); this.log( ua ); this.allow_trigger_overrides = true; this.noTouchEnd = false; var android = this.settings.android = /android/.test( ua ); var windowsmobile = this.settings.windowsmobile = /iemobile/.test( ua ); if( android || windowsmobile ){ //this.log( 'android or windows' ); //alert( ua ); if( ( android && !( /chrome/.test( ua ) || /firefox/.test( ua ) || /opera/.test( ua ) ) ) || ( windowsmobile ) ){ this.settings.touchOffClose = false; this.disableTransitions(); //Crap Android browsers don't fire touchend properly if( android && !windowsmobile ){ //adjust to better determine android UA string instead this.$ubermenu .removeClass( 'ubermenu-trigger-hover_intent' ) .removeClass( 'ubermenu-trigger-hover' ) .addClass( 'ubermenu-trigger-click' ); this.settings.touchEvents = false; this.allow_trigger_overrides = false; } } } if( windowsmobile ){ this.log( 'disable touchoff close and accessibility' ); this.settings.touchOffClose = false; //improper event delegation in windows this.settings.accessible = false; //WTF Microsoft this.settings.mouseEvents = false; } var safari5 = ( !/chrome/.test( ua ) ) && ( /safari/.test( ua ) ) && ( /version\/5/.test( ua ) ); if( safari5 ){ this.disableTransitions(); } //Reflow right items this.last_width = window.innerWidth; var cur_width = this.last_width; var $right_items = plugin.$ubermenu.find( '.ubermenu-item-level-0.ubermenu-align-right' ); if( $right_items.length ){ $(window).ubersmartresize( function(){ cur_width = window.innerWidth; if( plugin.last_width <= plugin.settings.breakpoint && cur_width >= plugin.settings.breakpoint ){ $right_items.hide(); $right_items[0].offsetHeight; $right_items.show(); //reflow } plugin.last_width = cur_width; }); } //TESTING if( this.settings.clicktest ) this.touchEnd = 'click'; this.init(); } Plugin.prototype = { init: function () { this.log( 'Initializing UberMenu' ); this.$ubermenu.removeClass( 'ubermenu-nojs' ); //We're off and running this.removeConflicts(); //Stop other JS from interfering when possible // var plugin = this; // $( '.ubermenu a' ).on( 'click touchend mouseenter mouseover mousedown mouseup' , function( e ){ // plugin.log( e.type + ' ' + $(this).text() ); // }); //Initialize user interaction events this.initializeSubmenuToggleTouchEvents(); this.initializeSubmenuToggleMouseEvents(); this.initializeRetractors(); this.initializeResponsiveToggle(); this.initializeTouchoffClose(); this.initializeTabs(); this.initializeSubmenuPositioning(); this.initializeSegmentCurrentStates(); this.initializeAccessibilityOnTab(); this.initializeImageLazyLoad(); }, removeConflicts: function(){ if( this.settings.remove_conflicts ){ this.$ubermenu.find( '.ubermenu-item, .ubermenu-target, .ubermenu-submenu' ).add( this.$ubermenu ) .removeAttr( 'style' ) .unbind().off(); } }, /* Initalizers */ initializeAccessibilityOnTab: function(){ if( !this.settings.accessible ) return; var plugin = this; //Initialize $( 'body' ).on( 'keydown.ubermenu' , function( e ){ var keyCode = e.keyCode || e.which; if( keyCode == 9 ){ $( 'body' ).off( 'keydown.ubermenu' ); plugin.initializeAccessibility(); } }); }, initializeImageLazyLoad: function(){ var plugin = this; $( '.ubermenu-item-level-0' ).one( 'ubermenuopen' , function(){ $( this ).find( '.ubermenu-image-lazyload' ).each( function(){ //Responsive images - add srcset and sizes if present if( $( this ).data( 'srcset' ) ){ $( this ) .attr( 'srcset' , $( this ).data( 'srcset' ) ) .attr( 'sizes' , $( this ).data( 'sizes' ) ) } //Whether responsive images (4.4+) or not, set src attribute $( this ) .attr( 'src' , $( this ).data( 'src' ) ) .removeClass( 'ubermenu-image-lazyload' ); }); setTimeout( function(){ plugin.clearTabSizes(); plugin.sizeTabs(); }, 300 ); }); }, initializeAccessibility: function(){ var plugin = this; var tabbables = '.ubermenu-target, a, input, select, textarea'; plugin.$current_focus = false; plugin.mousedown = false; plugin.$ubermenu.addClass( 'ubermenu-accessible' ); //Focus plugin.$ubermenu.on( 'focus' , tabbables , function(){ if( !plugin.mousedown ){ var $target = $(this); plugin.$current_focus = $target; var $item = $target.parent( '.ubermenu-item' ); //get the LI parent of A if( $item.length ){ //Top level items - just close everything else if( $item.is( '.ubermenu-item-level-0' ) ){ plugin.closeAllSubmenus(); } //Items with submenus - open the submenus if( $item.is( '.ubermenu-has-submenu-drop' ) ){ //Delay .5s so that if we want we can tab right through setTimeout( function(){ if( !$target.is( ':focus' ) ) return; //skip if item no longer focused //Close the submenus of all siblings $item.siblings( '.ubermenu-has-submenu-drop' ).each( function(){ plugin.closeSubmenu( $(this) , 'umac' , plugin ); }); //Open this item's submenu plugin.openSubmenu( $item, 'umac' , plugin ); }, 500 ); } //Focusout - any time an element is blurred, check to see if the //xUse focusout because it handles blur on all types of child elements //plugin.$ubermenu.on( 'focusout' , '.ubermenu-item-level-0' , function(){ //plugin.$ubermenu.on( 'blur' , tabbables , function(e){ $target.on( 'blur.ubermenu' , tabbables , function(e){ if( !plugin.mousedown ){ plugin.$current_focus = false; $(this).off( 'blur.ubermenu' ); //If a new focus within the menu isn't set within .5s, assume we've left the menu focus setTimeout( function(){ if( !plugin.$current_focus ){ //console.log( 'abandon ' , plugin.$current_focus ); plugin.closeAllSubmenus(); } }, 500 ); } plugin.mousedown = false; }); } } plugin.mousedown = false; }); //Keyboard interactions - left, right, escape plugin.$ubermenu.find( '.ubermenu-item-level-0' ).on( 'keydown' , function(e){ //var $uber = jQuery( '.ubermenu' ); //console.log( e.which ); switch( e.which ){ case 39: //right plugin.closeAllSubmenus(); //console.log( 'right ' + jQuery( this ).next().attr('id') ); $( this ).next().find( '.ubermenu-target' ).focus(); break; case 37: //left plugin.closeAllSubmenus(); //console.log( 'left '+ jQuery( this ).prev().attr('id') ); jQuery( this ).prev().find( '.ubermenu-target' ).focus(); break; case 27: //escape //console.log( 'esc' ); //jQuery( this ).find( '.ubermenu-target' ).focus(); plugin.closeAllSubmenus(); break; } }); //Mousedown - flag a mouse interaction - focus event above will be ignored if focus is result of mouse plugin.$ubermenu.on( 'mousedown' , function(e){ plugin.mousedown = true; setTimeout( function(){ plugin.mousedown = false; }, 100 ); }); }, initializeSubmenuPositioning: function(){ var plugin = this; plugin.positionSubmenus(); $(window).ubersmartresize(function(){ plugin.positionSubmenus(); }); if( this.settings.reposition_on_load ){ $(window).on( 'load' , function(){ plugin.positionSubmenus(); }); } }, initializeSubmenuToggleTouchEvents: function (){ if( !this.settings.touchEvents ) return; var plugin = this; //Touch Events //this.$ubermenu.on( this.touchStart , '.ubermenu-item' , function(e){ plugin.handleTouchInteraction( e , this , plugin ); } ); this.$ubermenu.on( this.touchStart , '.ubermenu-target:not(.shiftnav-toggle)' , function(e){ plugin.handleTouchInteraction( e , this , plugin ); } ); //this.$ubermenu.on( this.touchEnd , '.ubermenu-item' , this.handleSubmenuToggle ); //Added only on touchStart //this.$ubermenu.on( this.touchMove , '.ubermenu-item' , this.preventInteractionOnScroll ); //Prevent "Ghost Clicks" this.$ubermenu.on( 'click' , '.ubermenu-has-submenu-drop > .ubermenu-target, .ubermenu-tab.ubermenu-item-has-children > .ubermenu-target' , function(e){ plugin.handleClicks( e , this , plugin ); } ); }, initializeSubmenuToggleMouseEvents: function( plugin ){ plugin = plugin || this; //Assign this to plugin if not passed //Don't initialize if mouse events are disabled if( !plugin.settings.mouseEvents ) return; if( plugin.settings.clicktest ) return; if( plugin.settings.windowstest ) return; plugin.log( 'initializeSubmenuToggleMouseEvents' ); var evt = ''; var trigger = 'hover'; if( plugin.$ubermenu.hasClass( 'ubermenu-trigger-click' ) ){ trigger = 'click'; } else if( plugin.$ubermenu.hasClass( 'ubermenu-trigger-hover_intent' ) ){ trigger = 'hover_intent'; } if( trigger == 'click' ){ //In the event this device supports 'pointerup', let that event handle the interactions rather than the click event if( !this.suppress_clicks ){ evt = 'click.ubermenu-submenu-toggle'; //evt = 'mouseup.ubermenu-submenu-toggle'; this.$ubermenu.on( evt , '.ubermenu-item.ubermenu-has-submenu-drop:not([data-ubermenu-trigger]) > .ubermenu-target' , function(e){ plugin.handleMouseClick( e , this , plugin ); } ); this.$ubermenu.on( 'click.ubermenu-click-target' , '.ubermenu-item:not(.ubermenu-has-submenu-drop):not([data-ubermenu-trigger]) > .ubermenu-target' , function(e){ plugin.handleLink( e , this , plugin ); } ); } } else if( trigger == 'hover_intent' ){ evt = 'mouseenter.mouse_intent'; // > .ubermenu-target this.$ubermenu.on( evt , '.ubermenu-item.ubermenu-has-submenu-drop:not([data-ubermenu-trigger])' , function(e){ plugin.handleMouseIntent( e , this , plugin ); } ); this.$ubermenu.on( 'click.ubermenu-click-target' , '.ubermenu-item:not([data-ubermenu-trigger]) > .ubermenu-target' , function(e){ plugin.handleLink( e , this , plugin ); } ); } else{ evt = 'mouseenter.ubermenu-submenu-toggle'; this.$ubermenu.on( evt , '.ubermenu-item.ubermenu-has-submenu-drop:not([data-ubermenu-trigger]) > .ubermenu-target' , function(e){ plugin.handleMouseover( e , this , plugin ); } ); this.$ubermenu.on( 'click.ubermenu-click-target' , '.ubermenu-item:not([data-ubermenu-trigger]) > .ubermenu-target' , function(e){ plugin.handleLink( e , this , plugin ); } ); } //Now find divergents if( this.allow_trigger_overrides ){ plugin.$ubermenu.find( '.ubermenu-item[data-ubermenu-trigger]' ).each( function(){ var $li = $( this ); trigger = $li.data( 'ubermenu-trigger' ); if( trigger == 'click' ){ if( !this.suppress_clicks ){ //hmm $li.on( 'click.ubermenu-submenu-toggle' , '.ubermenu-target' , function(e){ plugin.handleMouseClick( e , this , plugin ); } ); } } else if( trigger == 'hover_intent' ){ $li.on( 'mouseenter.mouse_intent' , function(e){ plugin.handleMouseIntent( e , this , plugin ); } ); //$li.find( '> .ubermenu-target' ).on( 'click.ubermenu-click-target' , function(e){ plugin.handleLink( e , this , plugin ); } ); } //Hover else{ $li.on( 'mouseenter.ubermenu-submenu-toggle' , '.ubermenu-target' , function(e){ plugin.handleMouseover( e , this , plugin ); } ); } }); } else{ //If trigger overrides aren't allowed, default tabs to click plugin.$ubermenu.find( '.ubermenu-tab' ).on( 'click.ubermenu-submenu-toggle' , '.ubermenu-target' , function(e){ plugin.handleMouseClick( e , this , plugin ); } ); } //this.$ubermenu.on( 'mouseout.ubermenu-submenu-toggle' , '.ubermenu-item' , this.handleMouseout ); //now only added on mouseover }, disableSubmenuToggleMouseEvents: function(){ this.log( 'disableSubmenuToggleMouseEvents' ); this.events_disabled = true; }, reenableSubmenuToggleMouseEvents: function( plugin ){ plugin = plugin || this; plugin.log( 'reenableSubmenuToggleMouseEvents' ); plugin.events_disabled = false; }, initializeRetractors: function() { if( !this.settings.retractors ) return; //Don't initialize if retractors are disabled var plugin = this; this.$ubermenu.on( 'click' , '.ubermenu-retractor' , function(e){ plugin.handleSubmenuRetractorEnd( e , this , plugin ); } ); //set up the retractors if( this.settings.touchEvents ) this.$ubermenu.on( this.touchStart , '.ubermenu-retractor' , function(e){ plugin.handleSubmenuRetractorStart( e , this , plugin ); } ); // > .ubermenu-target //If this device does not support touch interactions, and the strategy is touch, remove the mobile retractors if( !this.touchenabled && plugin.settings.retractor_display_strategy == 'touch' ){ this.$ubermenu.find( '.ubermenu-retractor-mobile' ).remove(); this.$ubermenu.find( '.ubermenu-submenu-retractor-top' ).removeClass( 'ubermenu-submenu-retractor-top' ).removeClass( 'ubermenu-submenu-retractor-top-2' ); } }, initializeResponsiveToggle: function(){ var plugin = this; var toggle_selector = '.ubermenu-responsive-toggle[data-ubermenu-target=' + plugin.$ubermenu.attr('id') + '], .ubermenu-responsive-toggle[data-ubermenu-target=_any_]'; //if( plugin.$ubermenu.hasClass( 'ubermenu-main' ) ){ // toggle_selector+= ', .ubermenu-responsive-toggle[data-ubermenu-target=_main_]'; //} plugin.log( 'initializeResponsiveToggle ' + this.toggleevent ); $( document ).on( this.toggleevent , toggle_selector , function(e){ plugin.handleResponsiveToggle( e , this , plugin ); } ); }, initializeTouchoffClose: function(){ if( !this.settings.touchOffClose ) return; //Don't initialize if touch off close is disabled var plugin = this; $( document ).on( this.touchStart+'.ubermenu_touchoff' , function(e){ plugin.handleTouchoffCloseStart( e, this , plugin ); } ); $( document ).on( this.touchEnd+'.ubermenu_touchoff' , function(e){ plugin.handleTouchoffClose( e, this , 'touch' , plugin ); } ); if( !this.suppress_clicks ) $( document ).on( 'mouseup.ubermenu_clickoff' , function(e){ plugin.handleTouchoffClose( e, this , 'click' , plugin ); } ); //use mouseup instead of click for firefox }, initializeTabs: function(){ var plugin = this; var responsive = plugin.settings.responsive && ( window.innerWidth <= plugin.settings.breakpoint ) ? true : false; plugin.$tab_blocks = plugin.$ubermenu.find( '.ubermenu-tabs' ); //Reverse order so we do the innermost panels first plugin.$tab_blocks = $( plugin.$tab_blocks.get().reverse() ); //When all the images load, check the tabs $(window).on( 'load' , function(){ plugin.sizeTabs(); }); //When the window is resized, check the tabs plugin.windowwidth = window.innerWidth; $(window).ubersmartresize(function(){ plugin.oldwindowwidth = plugin.windowwidth; plugin.windowwidth = window.innerWidth; //only run if width has changed if( plugin.windowwidth != plugin.oldwindowwidth ){ plugin.clearTabSizes( plugin ); plugin.sizeTabs(); plugin.checkActiveTabs( plugin ); } }); //When the submenu is opened (first time only), check the tabs plugin.$ubermenu.find( '.ubermenu-item-level-0.ubermenu-has-submenu-drop' ).on( 'ubermenuopen.sizetabs' , function(){ $(this).off( 'ubermenuopen.sizetabs' ); plugin.sizeTabs(); }); //plugin.sizeTabs(); //Look for dynamically sized tabs, as we need to resize each time we switch tabs plugin.$ubermenu.find( '.ubermenu-tabs.ubermenu-tabs-dynamic-sizing' ).on( 'ubermenuopen' , '> .ubermenu-tabs-group > .ubermenu-tab' , function(){ plugin.sizeTabsDynamic( $(this).closest( '.ubermenu-tabs' ) ); }); if( !responsive ){ plugin.initializeActiveTab( plugin ); } }, checkActiveTabs: function( plugin ){ if( window.innerWidth <= plugin.settings.breakpoint ){ //close all open tabs plugin.$tab_blocks.find( '.ubermenu-tab.ubermenu-active' ).removeClass( 'ubermenu-active' ); } else{ plugin.initializeActiveTab( plugin ); } }, initializeActiveTab: function( plugin ){ plugin.$ubermenu.find( '.ubermenu-tabs-show-default > .ubermenu-tabs-group' ).each( function(){ //If there are no active tabs, activate the first one if( $(this).find( '> .ubermenu-tab.ubermenu-active' ).length === 0 ){ plugin.openSubmenu( $(this).find( '> .ubermenu-tab' ).first() , 'tab default' , plugin ); } }); }, clearTabSizes: function( plugin ){ plugin = plugin || this; plugin.$ubermenu.find( '.ubermenu-submenu , .ubermenu-tabs , .ubermenu-tab-content-panel , .ubermenu-tabs-group' ).css( 'min-height' , '' ); }, sizeTabs: function(){ var plugin = this; var responsive = plugin.settings.responsive && ( window.innerWidth <= plugin.settings.breakpoint ) ? true : false; //If this is responsive and we're below the breakpoint, don't size the tabs if( responsive ) return; plugin.initializeActiveTab( plugin ); //Do each tabs block plugin.$tab_blocks.each( function(){ //Stacked is if tabs are (a) Layout: Top, (b) Layout: Bottom, (c) Responsive Mode var stacked = false; if( ( $(this).hasClass( 'ubermenu-tab-layout-top' ) || $(this).hasClass( 'ubermenu-tab-layout-bottom' ) ) && !responsive ) { stacked = true; } $(this).data( 'um-stacked' , stacked ); var maxh = 0; var $tree; if( responsive ){ $tree = $(this).parentsUntil( '.ubermenu' ).add( $(this).parents( '.ubermenu' ) ); } else{ $tree = $(this).parentsUntil( '.ubermenu-item-level-0' ); } $tree.addClass( 'ubermenu-test-dimensions' ); //Find the maximum panel height for this group - only immediate tab panels, not nested var $panels = $( this ).find( ' > .ubermenu-tabs-group > .ubermenu-tab > .ubermenu-tab-content-panel' ); var oh; $panels.each( function(){ $(this).addClass( 'ubermenu-test-dimensions' ); oh = $(this).outerHeight(); //outerheight if( oh > maxh ) maxh = oh; $(this).data('um-oh', oh); $(this).removeClass( 'ubermenu-test-dimensions' ); }); $(this).data( 'um-max-panel-height' , maxh ); //if( $(this).is( '#menu-item-185' ) ){ if( $(this).hasClass( 'ubermenu-tabs-dynamic-sizing' ) ){ plugin.sizeTabsDynamic( $(this) , false ); } else{ plugin.sizeTabsMax( $(this) ); } $tree.removeClass( 'ubermenu-test-dimensions' ); }); }, sizeTabsMax: function( $tab_block ){ var maxh = $tab_block.data( 'um-max-panel-height' ); var stacked = $tab_block.data( 'um-stacked' ); var $tabsgroup = $tab_block.find( '> .ubermenu-tabs-group' ); //If left or right layout, set min-height on tabs group as well if( !stacked ){ if( $tabsgroup.outerHeight() > maxh ){ maxh = $tab_block.outerHeight(); } $tabsgroup.css( 'min-height' , maxh ); } //If top or bottom layout, set height for entire block else{ //console.log( maxh , $tabsgroup.outerHeight() ); $tab_block.css( 'min-height' , maxh + $tabsgroup.outerHeight() ); } //var $sub = $tab_block.closest( '.ubermenu-submenu-drop' ); //$sub.css( 'min-height' , false ); //this line does nothing, false is not valid - use '' to unset //Set panel heights $tabsgroup.find( '> .ubermenu-tab > .ubermenu-tab-content-panel' ).css( 'min-height' , maxh ); }, sizeTabsDynamic: function( $tab_block , animate ){ if( animate === undefined ) animate = true; if( animate ){ animate = $tab_block.hasClass( 'ubermenu-tabs-dynamic-sizing-animate' ); } var plugin = this; var responsive = plugin.settings.responsive && ( window.innerWidth <= plugin.settings.breakpoint ) ? true : false; if( responsive ) return; //don't size when mobile var stacked = $tab_block.data( 'um-stacked' ); //Look at the tabs group for the active item var $tabsgroup = $tab_block.find( '> .ubermenu-tabs-group' ); var prev_height = $tabsgroup.outerHeight(); $tabsgroup.css( 'min-height' , '0' ); //reset height var $active_panel = $tabsgroup.find( '> .ubermenu-active > .ubermenu-tab-content-panel' ); var active_oh = $active_panel.data( 'um-oh' ); var tg_oh = $tabsgroup.outerHeight(); var maxh = tg_oh > active_oh ? $tab_block.outerHeight() : active_oh; //get the max height of the tabs group vs active tab if( !stacked ){ if( animate ){ $tabsgroup.css( 'min-height' , prev_height ); $tabsgroup.stop().animate( { 'min-height' : maxh } , 300 , 'swing' , function(){ $active_panel.css( 'overflow' , 'auto' ); //force repaint for background images }); //set the tabs group height } else{ $tabsgroup.css( 'min-height' , maxh ); //set the tabs group height } } //If top or bottom layout, set height for entire block else{ if( animate ){ $tab_block.stop().animate( { 'min-height' : maxh + $tabsgroup.outerHeight() } , 300 , 'swing' , function(){ $active_panel.css( 'overflow' , 'auto' ); }); } else{ $tab_block.css( 'min-height' , maxh + $tabsgroup.outerHeight() ); } } }, initializeSegmentCurrentStates: function(){ this.$ubermenu.find( '.ubermenu-current-menu-item' ).first().parents( '.ubermenu-item:not( .ubermenu-nocurrent )' ).addClass( 'ubermenu-current-menu-ancestor' ); }, disableTransitions: function(){ this.transitions = false; this.$ubermenu .removeClass( 'ubermenu-transition-slide' ) .removeClass( 'ubermenu-transition-fade' ) .removeClass( 'ubermenu-transition-shift' ) .addClass( 'ubermenu-no-transitions' ) .addClass( 'ubermenu-transition-none' ); }, /* Handlers */ handleClicks: function( e , a , plugin ){ var $a = $(a); //Kill any clicks flagged by touchend if( $a.data( 'ubermenu-killClick' ) ){ e.preventDefault(); //e.stopPropagation(); plugin.log( 'killed click after touchend ', e ); } //Reset flag in any event //plugin.log( 'reset kill click' ); //$a.data( 'ubermenu-killClick' , false ); }, handleTouchInteraction: function( e , target , plugin ){ // e.preventDefault(); //this would stop clicks, but also scroll, which is a problem e.stopPropagation(); //If we're touching Windows, disable transitions if( e.type.indexOf( 'pointer' ) >= 0 ) plugin.disableTransitions(); var $target = $( target ); //Move to HandleTap // $target.data( 'ubermenu-killClick' , true ); //Prevent Clicks from being handled normally // $target.data( 'ubermenu-killHover' , true ); //Prevent hover from being handled normally // setTimeout( function(){ $target.data( 'ubermenu-killClick' , false ).data( 'ubermenu-killHover' , false ); } , 1000 ); $target.parent().off( 'mouseleave.mouse_intent_none' ); //don't allow hover intent out if we're touching plugin.log( 'touchstart ' + e.type + ' ' + $target.text() , e ); //Setup touch events //plugin.log( 'setup touch events' ); $target.on( plugin.touchEnd , function( e ){ plugin.handleTap( e , this , plugin ); } ); $target.on( plugin.touchMove , function( e ){ plugin.preventInteractionOnScroll( e , this , plugin ); } ); //Note original event points for comparison //Standard if( e.originalEvent.touches ){ $target.data( 'ubermenu-startX' , e.originalEvent.touches[0].clientX ); $target.data( 'ubermenu-startY' , e.originalEvent.touches[0].clientY ); } //Microsoft else if( e.originalEvent.clientY ){ var pos = $target.offset(); //$target.data( 'ubermenu-pos' , pos ); $target.data( 'ubermenu-startX' , e.originalEvent.clientX ); $target.data( 'ubermenu-startY' , e.originalEvent.clientY ); } // else if( e.changedTouches ){ // $target.data( 'ubermenu-startX' , e.changedTouches[0].pageX ); // $target.data( 'ubermenu-startY' , e.changedTouches[0].pageY ); // } }, preventInteractionOnScroll: function( e , target , plugin ){ plugin.log( 'touchmove interaction ' + e.type, e ); var $target = $( target ); //Check to see if the touch points were close enough together to be considered a tap //If not, they were a move/scroll, so unbind the touch event handlers and don't trigger menu if( e.originalEvent.touches ){ if( Math.abs( e.originalEvent.touches[0].clientX - $target.data( 'ubermenu-startX' ) ) > plugin.settings.moveThreshold || Math.abs( e.originalEvent.touches[0].clientY - $target.data( 'ubermenu-startY' ) ) > plugin.settings.moveThreshold ){ plugin.log( 'Preventing interaction on scroll, reset handlers (standard)' ); plugin.resetHandlers( $target , 'preventScroll touches' , plugin ); } else{ plugin.log( 'diff = ' + Math.abs( e.originalEvent.touches[0].clientY - $target.data( 'ubermenu-startY' ) ) ); } } else if( e.originalEvent.clientY ){ var pos = $target.data( pos ); if( Math.abs( e.originalEvent.clientX - $target.data( 'ubermenu-startX' ) ) > plugin.settings.moveThreshold || Math.abs( e.originalEvent.clientY - $target.data( 'ubermenu-startY' ) ) > plugin.settings.moveThreshold ){ plugin.log( 'Preventing interaction on scroll, reset handlers (standard)' ); plugin.resetHandlers( $target , 'preventScroll client' , plugin ); } else{ plugin.log( 'diff = ' + e.originalEvent.clientY + ' - ' + $target.data( 'ubermenu-startY' ) + ' = ' + Math.abs( e.originalEvent.clientY - $target.data( 'ubermenu-startY' ) ) ); } } /* else if( e.changedTouches ){ if( Math.abs( e.changedTouches[0].pageX - $target.data( 'ubermenu-startX' ) ) > plugin.settings.moveThreshold || Math.abs( e.changedTouches[0].pageY - $target.data( 'ubermenu-startY' ) ) > plugin.settings.moveThreshold ){ plugin.log( 'Preventing interaction on scroll, reset handlers (Windows)' ); plugin.resetHandlers( $target ); } }*/ else plugin.log( 'no touch points found!' ); }, /* Handle tap - a touch interaction that completed */ handleTap: function( e , target , plugin ){ e.preventDefault(); e.stopPropagation(); var $target = $( target ); //.parent(); //Quit if this was triggered after regular hover (which happens on IE) //Kill any touches flagged by mouseenter if( $target.data( 'ubermenu-killTouch' ) ){ plugin.log( 'kill tap' ); e.preventDefault(); e.stopPropagation(); } else{ var $li = $target.parent(); plugin.log( 'handleTap [' + $target.text() + ']', e.type ); //$target.data( 'ubermenu-killHover' , true ); $target.data( 'ubermenu-killClick' , true ); //Prevent Clicks from being handled normally $target.data( 'ubermenu-killHover' , true ); //Prevent hover from being handled normally setTimeout( function(){ $target.data( 'ubermenu-killClick' , false ).data( 'ubermenu-killHover' , false ); } , 1000 ); // //Close up other submenus before proceeding // plugin.closeSubmenuInstantly( $li.siblings( '.ubermenu-active' ) ); // //Toggle Submenus // if( $li.hasClass( 'ubermenu-has-submenu-drop' ) ){ //if submenu is already open, close it and allow link to be followed if( $li.hasClass( 'ubermenu-active' ) ){ //Don't close tabs, unless we're on mobile if( !$li.hasClass( 'ubermenu-tab' ) || window.innerWidth <= plugin.settings.breakpoint ){ plugin.closeSubmenu( $li , 'toggleUberMenuActive' , plugin ); } //plugin.followLink( e , $li , plugin ); plugin.handleLink( e , target , plugin , true ); } //if submenu is closed, open the submenu, prevent link from being followed else{ plugin.openSubmenu( $li , 'toggle' , plugin ); } } // //Follow links that don't have submenus // else{ //plugin.followLink( e , $li , plugin ); plugin.handleLink( e , target , plugin , true ); } } //Reset flag in any event $target.data( 'ubermenu-killTouch' , false ); //plugin.resetHandlers( $li ); //plugin.log( 'reset handlers' ); plugin.resetHandlers( $target , 'handleTap' , plugin ); }, handleLink: function( e , link , plugin , follow ){ follow = follow || false; plugin.log( 'handleLink' ); //e.preventDefault(); var $link = $( link ); if( !$link.is( 'a' ) ) return; var href = $link.attr( 'href'); var scrolltarget = $link.data( 'ubermenu-scrolltarget' ); if( scrolltarget ){ var $target_el = $( scrolltarget ).first(); if( $target_el.length > 0 ){ e.preventDefault(); $link.trigger( 'ubermenuscrollto' ); var $li = $link.parent( '.ubermenu-item' ); $li.addClass( 'ubermenu-current-menu-item' ); $li.siblings().removeClass( 'ubermenu-current-menu-item' ).removeClass( 'ubermenu-current-menu-parent' ).removeClass( 'uberemnu-current-menu-ancestor' ); var anim_done = false; $( 'html,body' ).animate({ scrollTop: $target_el.offset().top - plugin.settings.scrollto_offset }, plugin.settings.scrollto_duration , 'swing' , function(){ //after scroll if( !anim_done ){ plugin.closeSubmenu( $link.closest( '.ubermenu-item-level-0' ) , 'handeLink' , plugin ); if( plugin.settings.collapse_after_scroll && !plugin.$ubermenu.hasClass( 'ubermenu-responsive-nocollapse' ) ) plugin.toggleMenuCollapse( 'toggle' , false , plugin ); $link.trigger( 'ubermenuscrollto_complete' ); anim_done = true; } }); return false; //don't follow any links if this scroll target is present } //if target isn't present here, redirect with hash else{ if( href && href.indexOf( '#' ) == -1 ){ //check that hash does not already exist if( scrolltarget.indexOf( '#' ) == -1 ){ //if this is a class, add a hash tag scrolltarget = '#'+scrolltarget; } window.location = href + scrolltarget; //append hash/scroll target to URL and redirect e.preventDefault(); } //No href, no worries } } if( !href ){ e.preventDefault(); } //Handle clicks (where default was already prevented) else{ if( follow && e.isDefaultPrevented() ){ plugin.log( 'default prevented, follow link' ); if( $link.attr( 'target' ) == '_blank' ){ window.open( href , '_blank'); } else{ window.location = href; } } } }, handleMouseClick: function( e , target , plugin ){ plugin.log( 'handleMouseClick', e ); //Stop link follow //e.preventDefault(); //defer to 'else' so that the second click can be handled naturally var $target = $( target ); if( $target.data( 'ubermenu-killClick' ) ){ plugin.log( 'handleMouseClick: killClick' ); return; //3.0.4.1 } var $item = $target.parent( '.ubermenu-item' ); //$( li ); if( $item.length ){ //Check if this is already open if( $item.hasClass( 'ubermenu-active' ) ){ //If it's a link, follow if( $target.is( 'a' ) ){ plugin.handleLink( e , target , plugin ); } //If it's not a link (and not a tab), retract if( !$item.hasClass( 'ubermenu-tab' ) ){ plugin.closeSubmenu( $item , 'retract' ); } } //Close other menus, open this one else{ //Submenu to open if( $item.hasClass( 'ubermenu-has-submenu-drop' ) ){ e.preventDefault(); //Not already active, don't allow click plugin.closeSubmenuInstantly( $item.siblings( '.ubermenu-active' ) ); plugin.openSubmenu( $item , 'click' , plugin ); } //Allow link to be followed else{ //Just let it go //plugin.handleLink( e , target , plugin ); } } } //Only attach mouseout after mouseover, this way menus opened by touch won't be closed by mouseout //$( li ).on( 'mouseout.ubermenu-submenu-toggle' , function( e ){ plugin.handleMouseout( e , this , plugin ); } ); }, handleMouseIntent: function( e , item , plugin ){ ///*target*/ plugin.log( 'handleMouseIntent' ); //var $target = $( target ); //var $item = $target.parent( '.ubermenu-item' ); var $item = $( item ); //console.log( '[' + $item.find('> .ubermenu-target').text() + '] handle mouse_intent' ); //Cancel Timer if( $item.data( 'mouse_intent_timer' ) ){ $item.data( 'mouse_intent_timer' , clearTimeout( $item.data( 'mouse_intent_timer' ) ) ); //console.log( 'clear timeout' ); } //Prevent Touch events, which will occur on IE // var $target = $item.find( '> .ubermenu-target' ); // $target.data( 'ubermenu-killTouch' , true ); // setTimeout( function(){ $target.data( 'ubermenu-killTouch' , false ); } , 1000 ); //Quit if this was triggered by touch var $a = $item.find( '.ubermenu-target' ); //Kill any hovers flagged by touchstart if( $a.data( 'ubermenu-killHover' ) ){ plugin.log( 'killHover MouseIntent' ); e.preventDefault(); e.stopPropagation(); return; } pX = e.pageX; pY = e.pageY; $item.on( 'mousemove.mouse_intent' , plugin.trackMouse ); $item.data( 'mouse_intent_timer' , setTimeout( function(){ plugin.compare( e , $item , plugin.handleMouseIntentSuccess , plugin ); }, plugin.settings.intent_interval )); //Cancel if out - since we only hook up the close submenu event after a successfull intent $item.on( 'mouseleave.mouse_intent_none' , function(){ //plugin.log( 'mouseleave' ); $(this).data( 'mouse_intent_timer' , clearTimeout( $(this).data( 'mouse_intent_timer' ) ) ); $item.data( 'mouse_intent_state' , 0 ); $item.off( 'mouseleave.mouse_intent_none' ); if( $a.data( 'ubermenu-killHover' ) ){ plugin.log( 'killHover MouseIntent_Cancel' ); e.preventDefault(); e.stopPropagation(); return; } plugin.closeSubmenu( $item , 'mouse_intent_cancel' , plugin ); }); //} //else console.log( 'STATE 1' ); }, handleMouseIntentSuccess: function( e , $item , plugin ){ plugin.log( 'handleMouseIntentSuccess' ); //Cancel the quickleave event $item.off( 'mouseleave.mouse_intent_none' ); //Quit if this was triggered by touch - on Android Stock, this is triggered after touch, but mouseenter is triggered before var $a = $item.find( '.ubermenu-target' ); //Kill any hovers flagged by touchstart if( $a.data( 'ubermenu-killHover' ) ){ plugin.log( 'Kill hover on IntentSuccess' ); e.preventDefault(); e.stopPropagation(); return; } //Reset flag in any event $a.data( 'ubermenu-killHover' , false ); plugin.triggerSubmenu( e , $item , plugin ); //Setup mouseleave, but not for tabs if( !$item.hasClass( 'ubermenu-tab' ) ){ $item.on( 'mouseleave.mouse_intent' , function( e ){ plugin.handleMouseIntentLeave( e , this , plugin ); } ); } }, handleMouseIntentLeave: function( e , item , plugin ){ //var $target = $( target ); //var $item = $target.parent( '.ubermenu-item' ); var $item = $( item ); //console.log( '[' + $item.find('> .ubermenu-target').text() + '] handle mouse_intent LEAVE' ); //Cancel timer if( $item.data( 'mouse_intent_timer' ) ){ $item.data( 'mouse_intent_timer' , clearTimeout( $item.data( 'mouse_intent_timer' ) ) ); //console.log( 'clear timeout' ); } $item.off( 'mousemove.mouse_intent' , plugin.trackMouse ); //$item.off( 'mouseleave.mouse_intent' ); //special if( $item.data( 'mouse_intent_state' ) == 1 ){ //$item.data( 'mouse_intent_state' , 0 ); $item.data( 'mouse_intent_timer' , setTimeout( function(){ plugin.delayMouseLeave( e , $item , plugin.handleMouseIntentLeaveSuccess , plugin ); }, plugin.settings.intent_delay ) ); } }, handleMouseIntentLeaveSuccess: function( e , $el , plugin ){ $el.off( 'mouseleave.mouse_intent' ); //special if( $el.find( '> .ubermenu-target' ).data( 'ubermenu-killHover' ) ) return; plugin.closeSubmenu( $el , 'mouse_intent_leave' , plugin ); }, delayMouseLeave: function( e , $el , func , plugin ){ //console.log( 'delay mouse leave ' ); $el.data( 'mouse_intent_timer' , clearTimeout( $el.data( 'mouse_intent_timer' ) ) ); $el.data( 'mouse_intent_state' , 0 ); return func.apply( $el ,[e,$el,plugin]); }, trackMouse: function( e ) { cX = e.pageX; cY = e.pageY; }, compare: function( e , $el , func , plugin ){ //console.log( 'compare' ); $el.data( 'mouse_intent_timer' , clearTimeout( $el.data( 'mouse_intent_timer' ) ) ); // compare mouse positions to see if they've crossed the threshold if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < plugin.settings.intent_threshold ) { //console.log( 'threshold met' ); $el.off( 'mousemove.mouse_intent' , plugin.track ); // set hoverIntent state to true (so mouseOut can be called) $el.data( 'mouse_intent_state' , 1 ); return func.apply( $el , [e,$el,plugin] ); } else { //console.log( 'keep polling' ); // set previous coordinates for next time pX = cX; pY = cY; // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs) $el.data( 'mouse_intent_timer' , setTimeout( function(){ plugin.compare( e , $el , func , plugin ); } , plugin.settings.intent_interval ) ); } }, triggerSubmenu: function( e , $item , plugin ){ plugin.closeSubmenuInstantly( $item.siblings( '.ubermenu-active, .ubermenu-in-transition' ) ); plugin.openSubmenu( $item , 'mouseenter' , plugin ); }, handleMouseover: function( e , target , plugin ){ if( plugin.events_disabled ) return; var $target = $( target ); $target.data( 'ubermenu-killTouch' , true ); setTimeout( function(){ $target.data( 'ubermenu-killTouch' , false ); } , 1000 ); plugin.log( 'handleMouseenter, add mouseleave', e ); var $item = $target.parent( '.ubermenu-item' ); //$( li ); if( $item.length ){ if( !$item.hasClass( 'ubermenu-active' ) ){ plugin.triggerSubmenu( e , $item , plugin ); //Set up mouseleave event, but no hover out for Tabs if( !$item.hasClass( 'ubermenu-tab' ) ){ $item.on( 'mouseleave.ubermenu-submenu-toggle' , function( e ){ plugin.handleMouseleave( e , this , plugin ); } ); } } } }, //Mouseleave should be for LI so that we can use subs handleMouseleave: function( e , li , plugin ){ plugin.log( 'handleMouseleave, remove mouseleave', e ); $( li ).off( 'mouseleave.ubermenu-submenu-toggle' ); //Unbind mouseout event, it'll be rebind next mouseover plugin.closeSubmenu( $( li ) , 'mouseout' ); }, handleSubmenuRetractorStart: function( e , li , plugin ){ e.preventDefault(); e.stopPropagation(); $( li ).on( plugin.touchEnd , function( e ){ plugin.handleSubmenuRetractorEnd( e , this , plugin ); } ); plugin.log( 'handleSubmenuRetractorStart ' + $( li ).text()); }, handleSubmenuRetractorEnd: function( e , li , plugin ){ e.preventDefault(); e.stopPropagation(); var $parent_item = $( li ).closest( '.ubermenu-item' ); plugin.closeSubmenu( $parent_item , 'handleSubmenuRetractor' ); $( li ).off( plugin.touchEnd ); plugin.log( 'handleSubmenuRetractorEnd ' + $parent_item.find('> .ubermenu-target').text()); return false; }, handleResponsiveToggle: function( e , toggle , plugin ){ plugin.log( 'handleResponsiveToggle ' + e.type , e ); e.preventDefault(); e.stopPropagation(); //Prevent Double-fire //some browsers fire click and touch, so prevent the click manually if( e.type == 'touchend' ){ plugin.$ubermenu.data( 'ubermenu-prevent-click' , true ); setTimeout( function(){ plugin.$ubermenu.data( 'ubermenu-prevent-click' , false ); }, 500 ); } else if( e.type == 'click' && plugin.$ubermenu.data( 'ubermenu-prevent-click' ) ){ plugin.$ubermenu.data( 'ubermenu-prevent-click' , false ); return; } //TODO just call off/on click.xyz? or binding already fired? //Or should we just have a state set that returns, independent of event type plugin.toggleMenuCollapse( 'toggle' , toggle , plugin ); }, handleTouchoffCloseStart: function( e , _this , plugin ){ plugin.touchoffclosestart = $( window ).scrollTop(); }, handleTouchoffClose: function( e , _this , eventtype , plugin ){ //Only fire if the touch event occurred outside the menu AND we've clicked OR we've touched but haven't scrolled if( !$(e.target).closest( '.ubermenu' ).length && ( eventtype == 'click' || plugin.touchoffclosestart == $( window ).scrollTop() ) ){ plugin.log( 'touchoff close ', e ); //If there are any submenus to close, close them and temporarily disable hover events if( plugin.closeAllSubmenus() ){ //console.log( plugin.settings.submenuAnimationDuration ); //temporarily disable hovering so that the mouseover event doesn't fire and reopen the menu plugin.disableSubmenuToggleMouseEvents(); window.setTimeout( function(){ //plugin.initializeSubmenuToggleMouseEvents( plugin ); plugin.reenableSubmenuToggleMouseEvents( plugin ); }, plugin.settings.submenuAnimationDuration ); //can't call /e.preventDefault(); because it will stop mouseover events from firing } } }, /* Controllers */ toggleMenuCollapse: function( action , toggle , plugin ){ plugin = plugin || this; toggle = toggle || '.ubermenu-resposive-toggle'; //console.log( toggle + '[data-ubermenu-target="'+ plugin.$ubermenu.attr( 'id' ) + '"]' ); var $toggle; //Passed regular Object if( typeof toggle == 'object' ){ $toggle = $( toggle ); } //Passed selector string else{ $toggle = $( toggle + '[data-ubermenu-target="'+ plugin.$ubermenu.attr( 'id' ) + '"]'); } action = action || 'toggle'; if( action == 'toggle' ){ if( plugin.$ubermenu.hasClass( 'ubermenu-responsive-collapse' ) ){ action = 'open'; } else{ action = 'close'; } } //plugin.$ubermenu.slideToggle(); if( action == 'open' ){ plugin.$ubermenu.removeClass( 'ubermenu-responsive-collapse' ); $toggle.trigger( 'ubermenutoggledopen' ); $toggle.toggleClass( 'ubermenu-responsive-toggle-open' ); } else{ plugin.$ubermenu.addClass( 'ubermenu-responsive-collapse' ); $toggle.trigger( 'ubermenutoggledclose' ); $toggle.toggleClass( 'ubermenu-responsive-toggle-open' ); } //plugin.$ubermenu.toggleClass( 'ubermenu-responsive-collapse' ); //$toggle.trigger( 'ubermenutoggled' ); if( plugin.transitions && !plugin.$ubermenu.hasClass( 'ubermenu-responsive-nocollapse' ) ){ plugin.$ubermenu.addClass( 'ubermenu-in-transition' ); plugin.$ubermenu.on( plugin.transitionend + '_toggleubermenu', function(){ plugin.$ubermenu.removeClass( 'ubermenu-in-transition' ); plugin.$ubermenu.off( plugin.transitionend + '_toggleubermenu' ); }); } }, positionSubmenus: function(){ var plugin = this; if( plugin.orientation == 'h' ){ plugin.$ubermenu.find( '.ubermenu-submenu-drop.ubermenu-submenu-align-center' ).each( function(){ var $parent = $(this).parent( '.ubermenu-item' ); var $sub = $(this); var $container; if( plugin.$ubermenu.hasClass( 'ubermenu-bound' ) ){ $container = $parent.closest( '.ubermenu , .ubermenu-submenu' ); // main menu bar } else if( plugin.$ubermenu.hasClass( 'ubermenu-bound-inner' ) ){ $container = $parent.closest( '.ubermenu-nav , .ubermenu-submenu' ); // inner menu bar } else{ var $parent_sub = $parent.closest( '.ubermenu-submenu' ); //Find the closest relatively positioned element if( $parent_sub.length === 0 ){ $container = plugin.$ubermenu.offsetParent(); } else{ $container = $parent_sub; } } var sub_width = $sub.outerWidth(); var parent_width = $parent.outerWidth(); var parent_left_edge = $parent.offset().left; var container_width = $container.width(); var container_left_edge = $container.offset().left; // console.log( $container ); // console.log( 'parent_width: ' + parent_width ); // console.log( 'parent_left: ' + parent_left_edge ); // console.log( 'container_width: ' + container_width ); // console.log( 'container_left: ' + container_left_edge ); var center_left = ( parent_left_edge + ( parent_width / 2 ) ) - ( container_left_edge + ( sub_width / 2 ) ); //If submenu is left of container edge, align left var left = center_left > 0 ? center_left : 0; //If submenu width is larger than container width, center to container (menu bar) if( sub_width > container_width ){ left = ( sub_width - container_width ) / -2; } //If submenu is right of container edge, align right else if( left + sub_width > container_width ){ //left = container_width - sub_width; $sub.css( { 'right' : 0 , 'left' : 'auto' } ); left = false; } if( left !== false ){ $sub.css( 'left' , left ); } }); } }, openSubmenu: function( $li , tag , plugin ){ plugin = plugin || this; plugin.log( 'Open Submenu ' + tag ); if( !$li.hasClass( 'ubermenu-active' ) ){ $li.addClass( 'ubermenu-active' ); if( plugin.transitions ){ $li.addClass( 'ubermenu-in-transition' ); $li.find( '> .ubermenu-submenu' ).on( plugin.transitionend + '_opensubmenu', function(){ plugin.log( 'finished submenu open transition' ); $li.removeClass( 'ubermenu-in-transition' ); $( this ).off( plugin.transitionend + '_opensubmenu' ); }); } $li.trigger( 'ubermenuopen' ); } }, closeSubmenu: function( $li , tag , plugin ){ plugin = plugin || this; plugin.log( 'closeSubmenu ' + $li.find( '>a' ).text() + ' [' + tag + ']' ); //If this menu is currently active and has a submenu, close it if( $li.hasClass( 'ubermenu-item-has-children' ) && $li.hasClass( 'ubermenu-active' ) ){ if( plugin.transitions ){ $li.addClass( 'ubermenu-in-transition' ); //transition class keeps visual flag until transition completes } $li.each( function(){ var _$li = $(this); var _$ul = _$li.find( '> .ubermenu-submenu' ); //Remove the transition flag once the transition is completed if( plugin.transitions ){ _$ul.on( plugin.transitionend + '_closesubmenu', function(){ plugin.log( 'finished submenu close transition' ); _$li.removeClass( 'ubermenu-in-transition' ); _$ul.off( plugin.transitionend + '_closesubmenu' ); }); } }); } //Actually remove the active class, which causes the submenu to close $li.removeClass( 'ubermenu-active' ); $li.trigger( 'ubermenuclose' ); }, //Close subs without transition closeSubmenuInstantly: function( $li ){ if( $li.length === 0 ) return; var plugin = this; $li.addClass( 'ubermenu-notransition' ); $li.removeClass( 'ubermenu-active' ).removeClass( 'ubermenu-in-transition' ); $li[0].offsetHeight; //triggers reflow $li.removeClass( 'ubermenu-notransition' ); $li.trigger( 'ubermenuclose' ); }, //Top level subs only closeAllSubmenus: function(){ //$( this.element ).find( 'li.menu-item-has-children' ).removeClass( 'ubermenu-active' ); var $actives = this.$ubermenu.find( '.ubermenu-item-level-0.ubermenu-active' ); if( $actives.length ) this.closeSubmenuInstantly( $actives ); return $actives.length; }, resetHandlers: function( $target , tag , plugin ){ plugin.log( 'ResetHandlers: ' + tag ); $target.off( this.touchEnd ); $target.off( this.touchMove ); var $item = $target.parent(); $item.off( 'mousemove.mouse_intent' ); $item.off( 'mouseleave.mouse_intent_none' ); $item.data( 'mouse_intent_timer' , clearTimeout( $item.data( 'mouse_intent_timer' ) ) ); $item.data( 'mouse_intent_state' , 0 ); }, log: function( content , o , plugin ){ plugin = plugin || this; if( plugin.settings.debug ){ if( plugin.settings.debug_onscreen ){ this.debug_target.prepend( '<div class="um-debug-content">'+content+'</div>' ); } else console.log( content , o ); } } }; /* $.fn[ pluginName ] = function ( options ) { return this.each(function() { if ( !$.data( this, "plugin_" + pluginName ) ) { $.data( this, "plugin_" + pluginName, new Plugin( this, options ) ); } }); }; */ $.fn[ pluginName ] = function ( options ) { var args = arguments; if ( options === undefined || typeof options === 'object' ) { return this.each(function() { if ( !$.data( this, "plugin_" + pluginName ) ) { $.data( this, "plugin_" + pluginName, new Plugin( this, options ) ); } }); } else if ( typeof options === 'string' && options[0] !== '_' && options !== 'init') { // Cache the method call to make it possible to return a value var returns; this.each(function () { var instance = $.data(this, 'plugin_' + pluginName); // Tests that there's already a plugin-instance and checks that the requested public method exists if ( instance instanceof Plugin && typeof instance[options] === 'function') { // Call the method of our plugin instance, and pass it the supplied arguments. returns = instance[options].apply( instance, Array.prototype.slice.call( args, 1 ) ); } // Allow instances to be destroyed via the 'destroy' method if (options === 'destroy') { $.data(this, 'plugin_' + pluginName, null); } }); // If the earlier cached method gives a value back return the value, otherwise return this to preserve chainability. return returns !== undefined ? returns : this; } }; })( jQuery, window, document ); (function($){ var ubermenu_is_initialized = false; //jQuery( document ).ready( function($){ jQuery(function($) { initialize_ubermenu( 'document.ready' ); }); //Backup $( window ).on( 'load' , function(){ initialize_ubermenu( 'window.load' ); }); function initialize_ubermenu( init_point ){ if( ubermenu_is_initialized ) return; ubermenu_is_initialized = true; if( ( typeof console != "undefined" ) && init_point == 'window.load' ) console.log( 'Notice: UberMenu initialized via ' + init_point + '. This indicates that an unrelated error on the site prevented it from loading via the normal document ready event.' ); //Scroll to non-ID "hashes" if( window.location.hash.substring(1,2) == '.' ){ var $scrollTarget = $( 'body' ).find( window.location.hash.substring(1) ); if( $scrollTarget.length ) window.scrollTo( 0 , $scrollTarget.offset().top - ubermenu_data.scrollto_offset ); } //Make sure offset is applied to normal hashes else if( window.location.hash.length ){ setTimeout( function(){ try{ var $scrollTarget = $( 'body' ).find( window.location.hash ); if( $scrollTarget.length ) window.scrollTo( 0 , $scrollTarget.offset().top - ubermenu_data.scrollto_offset ); } catch(error){ //not an element identifier, don't scroll } }, 100 ); } $( '#wp-admin-bar-ubermenu_loading' ).remove(); $( '.ubermenu' ).ubermenu({ //touchOffClose: false //debug: true //debug_onscreen: true //mouseEvents: false //clicktest: true }); //Google Maps if( typeof google !== 'undefined' && typeof google.maps !== 'undefined' && typeof google.maps.LatLng !== 'undefined') { $('.ubermenu-map-canvas').each(function(){ var $canvas = $( this ); var dataZoom = $canvas.attr('data-zoom') ? parseInt( $canvas.attr( 'data-zoom' ) ) : 8; var latlng = $canvas.attr('data-lat') ? new google.maps.LatLng($canvas.attr('data-lat'), $canvas.attr('data-lng')) : new google.maps.LatLng(40.7143528, -74.0059731); var myOptions = { zoom: dataZoom, mapTypeId: google.maps.MapTypeId.ROADMAP, center: latlng }; var map = new google.maps.Map(this, myOptions); if($canvas.attr('data-address')){ var geocoder = new google.maps.Geocoder(); geocoder.geocode({ 'address' : $canvas.attr('data-address') }, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { map.setCenter(results[0].geometry.location); latlng = results[0].geometry.location; var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location, title: $canvas.attr('data-mapTitle') }); } }); } else{ //place marker for regular lat/long var marker = new google.maps.Marker({ map: map, position: latlng, title: $canvas.attr('data-mapTitle') }); } var $li = $(this).closest( '.ubermenu-has-submenu-drop' ); var mapHandler = function(){ google.maps.event.trigger(map, "resize"); map.setCenter(latlng); //Only resize the first time we open $li.off( 'ubermenuopen', mapHandler ); }; $li.on( 'ubermenuopen', mapHandler ); }); } } })(jQuery); /* * Deprecated API Functions */ //jQuery( '.ubermenu' ).ubermenu( 'openSubmenu' , jQuery( '#menu-item-401' ) ); function uberMenu_openMega( id ){ jQuery( '.ubermenu' ).ubermenu( 'openSubmenu' , jQuery( id ) ); } function uberMenu_openFlyout( id ){ jQuery( '.ubermenu' ).ubermenu( 'openSubmenu' , jQuery( id ) ); } function uberMenu_close( id ){ jQuery( '.ubermenu' ).ubermenu( 'closeSubmenu' , jQuery( id ) ); } function uberMenu_redrawSubmenus(){ jQuery( '.ubermenu' ).ubermenu( 'positionSubmenus' ); }