/* * DC Vertical Mega Menu - jQuery vertical mega menu * Copyright (c) 2011 Design Chemical * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * */ (function($){ //define the new for the plugin ans how to call it $.fn.dcVerticalMegaMenu = function(options){ //set default options var defaults = { classParent: 'dc-mega', arrow: true, classArrow: 'dc-mega-icon', classContainer: 'sub-container', classSubMenu: 'sub', classMega: 'mega', classSubParent: 'mega-hdr', classSubLink: 'mega-hdr', classRow: 'row', rowItems: 3, speed: 'fast', effect: 'show', direction: 'right' }; //call in the default otions var options = $.extend(defaults, options); var $dcVerticalMegaMenuObj = this; var timer; var timer2; //act upon the element that is passed into the design return $dcVerticalMegaMenuObj.each(function(options){ $mega = $(this); if(defaults.direction == 'left'){ $mega.addClass('left'); } else { $mega.addClass('right'); } // Get Menu Width var megaWidth = $mega.outerWidth(); // Set up menu $('> li',$mega).each(function(){ var $parent = $(this); var $megaSub = $('> ul',$parent); if($megaSub.length > 0){ // no use 2012.11.21 //$('> a',$parent).addClass(defaults.classParent).append(''); $megaSub.addClass(defaults.classSubMenu).wrap('
'); var $container = $('.'+defaults.classContainer,$parent); if($('ul',$megaSub).length > 0){ $parent.addClass(defaults.classParent+'-li'); $container.addClass(defaults.classMega); // Set sub headers $('> li',$megaSub).each(function(){ $(this).addClass('mega-unit'); if($('> ul',this).length){ $(this).addClass(defaults.classSubParent); $('> a',this).addClass(defaults.classSubParent+'-a'); } else { $(this).addClass(defaults.classSubLink); $('> a',this).addClass(defaults.classSubLink+'-a'); } }); // Create Rows var hdrs = $('.mega-unit',$parent); rowSize = parseInt(defaults.rowItems); for(var i = 0; i < hdrs.length; i+=rowSize){ hdrs.slice(i, i+rowSize).wrapAll(''); } // Get mega dimensions var itemWidth = $('.mega-unit',$megaSub).outerWidth(true); var rowItems = $('.row:eq(0) .mega-unit',$megaSub).length; var innerItemWidth = itemWidth * rowItems; // for IE6 var IE6 = (navigator.userAgent.indexOf("MSIE 6")>=0) ? true : false; if( IE6){ innerItemWidth += 5; } var totalItemWidth = innerItemWidth + containerPad; // Set mega header height $('.row',this).each(function(){ $('.mega-unit:last',this).addClass('last'); var maxValue = undefined; $('.mega-unit > a',this).each(function(){ var val = parseInt($(this).height()); if (maxValue === undefined || maxValue < val){ maxValue = val; } }); $('.mega-unit > a',this).css('height',maxValue+'px'); $(this).css('width',innerItemWidth+'px'); }); var subWidth = $megaSub.outerWidth(true); var totalWidth = $container.outerWidth(true); var containerPad = totalWidth - subWidth; // Calculate Row Height $('.row',$megaSub).each(function(){ var rowHeight = $(this).height(); $(this).parent('.row').css('height',rowHeight+'px'); }); $('.row:last',$megaSub).addClass('last'); $('.row:first',$megaSub).addClass('first'); } else { $container.addClass('non-'+defaults.classMega); } } var $container = $('.'+defaults.classContainer,$parent); var subWidth = $megaSub.outerWidth(true); // Get flyout height var subHeight = $container.height(); var itemHeight = $parent.outerHeight(true); var scrollHeight = $(window).height()-150; // Set position to top of parent if(subHeight > scrollHeight) { $container.css({ height: scrollHeight+'px', overflowY: 'scroll', marginTop: -itemHeight+'px', zIndex: '1000', width: subWidth+ 10 + 'px' }).hide(); } else { $container.css({ height: subHeight+'px', marginTop: -itemHeight+'px', zIndex: '1000', width: subWidth+ 10 + 'px' }).hide(); } }); // HoverIntent Configuration var config = { sensitivity: 2, // number = sensitivity threshold (must be 1 or higher) interval: 100, // number = milliseconds for onMouseOver polling interval over: megaOver, // function = onMouseOver callback (REQUIRED) timeout: 0, // number = milliseconds delay before onMouseOut out: megaOut // function = onMouseOut callback (REQUIRED) }; $('li',$dcVerticalMegaMenuObj).hoverIntent(config); function megaOver(){ var that = this; clearTimeout(timer2); timer2 = setTimeout(function(){ var $link = $('> a',that); var $subNav = $('.sub',that); var $container = $('.sub-container',that); var width = $container.width(); var outerHeight = $container.outerHeight(); var height = $container.height(); var itemHeight = $(that).outerHeight(true); var offset = $link.offset(); var scrollTop = $(window).scrollTop(); var offset = offset.top - scrollTop; var bodyHeight = $(window).height(); var maxHeight = bodyHeight - offset; var xsHeight = maxHeight - outerHeight; var containerMargin; $(that).addClass('mega-hover'); if(xsHeight < 0){ containerMargin = xsHeight - itemHeight; $container.css({marginTop: containerMargin+'px'}); } else { containerMargin = 0 - itemHeight; $container.css({marginTop: containerMargin+'px'}); } if( (bodyHeight-140) < outerHeight){ containerMargin -= (bodyHeight-140) - outerHeight; $container.css({marginTop: containerMargin+'px'}); } var containerPosition = {right: megaWidth}; if(defaults.direction == 'right'){ containerPosition = {left: megaWidth}; } if(defaults.effect == 'fade'){ $container.css(containerPosition).fadeIn(defaults.speed); } if(defaults.effect == 'show'){ $container.css(containerPosition).show(); } if(defaults.effect == 'slide'){ $container.css({ width: 0, height: 0, opacity: 0}); if(defaults.direction == 'right'){ $container.show().css({ left: megaWidth }); } else { $container.show().css({ right: megaWidth }); } $container.animate({ width: width, height: height, opacity: 1 }, defaults.speed); } }, 280); } function megaOut(){ var that = this; clearTimeout(timer2); timer2 = setTimeout(function(){ $(that).removeClass('mega-hover'); var $container = $('.sub-container',that); $container.hide(); }, 500); } }); }; })(jQuery);