// JavaScript Document/* * DC Mega Menu - jQuery 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 defaults for the plugin and how to call it		$.fn.dcMegaMenu = function(options){		//set default options  		var defaults = {			classParent: 'dc-mega',			rowItems: 3,			speed: 'fast',			effect: 'fade',			event: 'hover',			classSubParent: 'mega-hdr',			classSubLink: 'mega-hdr'		};		//call in the default otions		var options = $.extend(defaults, options);		var $dcMegaMenuObj = this;		//act upon the element that is passed into the design    		return $dcMegaMenuObj.each(function(options){			megaSetup();						function megaOver(){				var subNav = $('.sub',this);				$(this).addClass('mega-hover');				if(defaults.effect == 'fade'){					$(subNav).fadeIn(defaults.speed);				}				if(defaults.effect == 'slide'){					$(subNav).show(defaults.speed);				}			}			function megaAction(obj){				var subNav = $('.sub',obj);				$(obj).addClass('mega-hover');				if(defaults.effect == 'fade'){					$(subNav).fadeIn(defaults.speed);				}				if(defaults.effect == 'slide'){					$(subNav).show(defaults.speed);				}			}			function megaOut(){				var subNav = $('.sub',this);				$(this).removeClass('mega-hover');				$(subNav).hide();			}			function megaActionClose(obj){				var subNav = $('.sub',obj);				$(obj).removeClass('mega-hover');				$(subNav).hide();			}			function megaReset(){				$('li',$dcMegaMenuObj).removeClass('mega-hover');				$('.sub',$dcMegaMenuObj).hide();			}			function megaSetup(){				$arrow = '<span class="dc-mega-icon"></span>';				var classParentLi = defaults.classParent+'-li';				var menuWidth = $($dcMegaMenuObj).outerWidth(true);				$('> li',$dcMegaMenuObj).each(function(){					//Set Width of sub					var mainSub = $('> ul',this);					var primaryLink = $('> a',this);					if($(mainSub).length > 0){						$(primaryLink).addClass(defaults.classParent).append($arrow);						$(mainSub).addClass('sub').wrap('<div class="sub-container" />');												var position = $(this).position();						parentLeft = position.left;													if($('ul',mainSub).length > 0){							$(this).addClass(classParentLi);							$('.sub-container',this).addClass('mega');							$('> li',mainSub).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',this);							rowSize = parseInt(defaults.rowItems);							for(var i = 0; i < hdrs.length; i+=rowSize){								hdrs.slice(i, i+rowSize).wrapAll('<div class="row" />');							}							// Get Sub Dimensions & Set Row Height							$(mainSub).show();														// Get Position of Parent Item							var parentWidth = $(this).width();							var parentRight = parentLeft + parentWidth;														// Check available right margin							var marginRight = menuWidth - parentRight;														// // Calc Width of Sub Menu							var subWidth = $(mainSub).outerWidth(true);							var totalWidth = $(mainSub).parent('.sub-container').outerWidth(true);							var containerPad = totalWidth - subWidth;							var itemWidth = $('.mega-unit',mainSub).outerWidth(true);							var rowItems = $('.row:eq(0) .mega-unit',mainSub).length;							var innerItemWidth = itemWidth * rowItems;							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');							});														// // Calc Required Left Margin incl additional required for right align							var marginLeft = (totalItemWidth - parentWidth)/2;							if(marginRight < marginLeft){								marginLeft = marginLeft + marginLeft - marginRight;							}							var subLeft = parentLeft - marginLeft;							// If Left Position Is Negative Set To Left Margin							if(subLeft < 0){								$('.sub-container',this).css('left','0');							}else if(marginRight < marginLeft){								$('.sub-container',this).css('right','0');							}else {								$('.sub-container',this).css('left',parentLeft+'px').css('margin-left',-marginLeft+'px');							}														// Calculate Row Height							$('.row',mainSub).each(function(){								var rowHeight = $(this).height();								$('.mega-unit',this).css('height',rowHeight+'px');								$(this).parent('.row').css('height',rowHeight+'px');							});							$(mainSub).hide();											} else {							$('.sub-container',this).addClass('non-mega').css('left',parentLeft+'px');						}					}				});				// Set position of mega dropdown to bottom of main menu				var menuHeight = $('> li > a',$dcMegaMenuObj).outerHeight(true);				$('.sub-container',$dcMegaMenuObj).css({top: menuHeight+'px'}).css('z-index','1000');								if(defaults.event == 'hover'){					// 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: 400, // number = milliseconds delay before onMouseOut						out: megaOut // function = onMouseOut callback (REQUIRED)					};					$('li',$dcMegaMenuObj).hoverIntent(config);				}								if(defaults.event == 'click'){									$('body').mouseup(function(e){						if(!$(e.target).parents('.mega-hover').length){							megaReset();						}					});					$('> li > a.'+defaults.classParent,$dcMegaMenuObj).click(function(e){						var $parentLi = $(this).parent();						if($parentLi.hasClass('mega-hover')){							megaActionClose($parentLi);						} else {							megaAction($parentLi);						}						e.preventDefault();					});				}			}		});	};})(jQuery);
