/*! **********************************************************************
*  	MegaMenu JQuery Plugin v 1.9
*  	Copyright (c) 3M 2012. All rights reserved
*  	Last Modified: 06/17/2013
*  	Asset ID: 1319244999950
*  	Authors: @A1QQ1ZZ
*  	to see unminified version view /3MContentRetrievalAPI/BlobServlet?assetId=1319244999950&assetType=MMM_Image&blobAttribute=ThumbnailImage
*	Initialize with:
	$(document).ready(function() {
		$('#psnwrap').PSNMegaMenu({//options here -->});
	});
************************************************************************/
(function( $ ) {
	
	function _mmPluginDebug(msg) {
		
		if (urlHash.debug) {

			if (urlHash.debug=="megamenu") {
		
				if (window.console && window.console.log){ 
		
					window.console.log(msg);
		
				}
		
			}
			
		}
		
  	};
	
	function _mmPurgeArray(ar){
		var obj = {};
		var temp = [];
		for(var i=0;i<ar.length;i++){
			if(obj[ar[i]]!=ar[i]){
				obj[ar[i]] = ar[i];
				temp.push(ar[i]);
			}
		}
		return temp;
	};
	
	function _mmResizeItems(tc, nc, s){
		var numsteps=Math.floor(nc/tc);
		var bHgt=new Array(tc);
		var chckSteps=0;
		var lchkd=0;
		for(var i=1;i<=numsteps;i++){
			/* debug */ _mmPluginDebug("row"+i);
			/* grab tallest size of row group */
			for(var j=1;j<=tc;j++){
				var stepa=(j+lchkd);
				bHgt[j]=jQuery("#menu"+s+"cat"+stepa).height();
				/* debug */ _mmPluginDebug("#menu"+s+"cat"+stepa+" size= "+bHgt[j]+"px");
			}
			
			bHgt.sort(function(a,b){return b-a});
			/* debug */ _mmPluginDebug("row"+i+" tallest category size= "+bHgt[0]+"px");
			
			for(var k=1;k<=tc;k++){
				var stepb=(k+lchkd);
				jQuery("#menu"+s+"cat"+stepb).height(bHgt[0]);
				if(k%tc==0){
					jQuery("#menu"+s+"cat"+stepb).css('border','none');	
				}
			}
			
			lchkd+=tc;
			for(var l=0; l<=tc;l++){
				bHgt[l]=0;	
			}
			
		}
			
	}
	
	$.fn.PSNMegaMenu = function(options) {
		
		var _settings = $.extend({
		
			_menuWdt:jQuery('#tablewrap').outerWidth(true),
			_mmEnable: true,
			_mmAnimation: true,
			_mmJSONLink:null,
			_mmMouseOverSensitivity:50,
			_mmMouseOutSensitiivty:300,
			_mmSpeed:150,
			_mmTestData:null,
			_mmmmenuwidth:960,
			_mm1ColumnLinkRange:[13],
			_mm2ColumnLinkRange:[14,26],
			_mm3ColumnLinkRange:[27,39],
			_mm4ColumnLinkRange:[40],
			_mmInt:0,
			_mmgrpid:null,
			_mmShwGrndChldrn:true,
			_mmpsnLinkClass:"PSNlinkActive",
			_mmCntnrClass:"mmmmegamenu",
			_mmIndMMClass:"mmmhasmegamenu",
			_mmSnglCol:false
			
		}, options);
		
		return this.each(function() {
			var _el = $(this);
			_mmGetJsonUrl(_el, _settings);
		});

	};
	
	function _mmGetJsonUrl(_el, _settings){
		
		var _mmMtaLng, _mmMtaCvrg, _mmMtaLngCvrg, _mmJsonURL, _mmLnkRel, _mmLnkRelStr, _mmLnkAtrElmts;
		
		_mmLnkAtrElmts = new Array();

		jQuery(_el).find('li').each(function (i){
			
			if(!jQuery(this).hasClass('psnsecondary')){
				
				if (jQuery(this).find('a').attr('data-psn')) {
					
					_mmLnkRel = jQuery(this).find('a').attr('data-psn');
					
					_mmLnkAtrElmts.push(_mmLnkRel);
					
				}
				
			}
		})
		
		_mmMtaLng = jQuery('meta[name|=DC_language]').attr('content');
		
		_mmMtaCvrg = jQuery('meta[name|=DC_coverage]').attr('content');

		if(typeof _mmMtaLng !== 'undefined' || typeof _mmMtaCvrg !== 'undefined') {
			_mmMtaCvrg = '?locale='+_mmMtaLng+'_'+_mmMtaCvrg+'&a=Nav';
		} else {
			_mmMtaCvrg = '' ;       
		}

		if (typeof themeJSON !== 'undefined') {
			_mmLnkRelStr = themeJSON + _mmMtaCvrg+'&uniqueNames='+_mmLnkAtrElmts.join(','); 
			/* debug */ _mmPluginDebug("JSON content: "+_mmLnkRelStr);   
		}
  
		if (_settings._mmJSONLink !== null) {
			_mmLnkRelStr = _settings._mmJSONLink; 
		}

		_mmPullJSON(_el, _mmLnkRelStr, _settings);
		
	}
	
	function _mmPullJSON(_el, _mmLnkRelStr, _settings){

		jQuery.ajax({
			dataType: "json",
			url: _mmLnkRelStr,
			context: document.body,
			success: function(data){ 
			
				/* debug */ _mmPluginDebug("ajax data= "+data);
				_mmParseJSON(_el,data,_mmLnkRelStr,_settings); 
			
			},
			error: function(request,error){
				
				if(window.location.href.indexOf('http:')>-1){
				
					
				
					if (error == "timeout") {
				
						
				
					}else {
					
					
					
					}
					
				}else{
								
					_mmParseJSON(_el, _settings._mmTestData, _mmLnkRelStr, _settings);
					
				}
			}
		});
	
	}
	
	function _mmParseJSON(_el, _data, _mmLnkRelSring, _settings){
			
		_mmlinkElements = {};
		
		jQuery(_el).find('li').each(function (i){
			
			var _mmlistItem = jQuery(this);
			
			_mmlinkText = _mmlistItem.find('a').attr('data-psn');
			
			if(!_mmlistItem.hasClass('psnsecondary')){
				
				_mmlinkElements[_mmlinkText] = _mmlistItem;
				
			} 
			
		});

		jQuery.each(_data.navItems, function(_j, _data) { 

			_jsonLinkTitle = _data.UniqueName;
			
			if (_mmlinkElements[_jsonLinkTitle]) {
				if(_el = _mmlinkElements[_jsonLinkTitle]) {

					_mmAddLinks(_el, _el, _data, _j, _settings);

				}
			}
		
		})

		_mmCreateInteraction(_el, _settings);
		
	}
	
	function _mmAddLinks(_el, _el, _data, _j, _settings){
			
		var s=_settings, megamenu='', megamenuchild, totallinks=0, totalcolumns=0, total_mmmmenuwidth=0;
		
		if (_el.find('.'+_settings._mmCntnrClass).size()==0){
			
			if (_data.children) { 
				
				/* Get total number of links */
				jQuery.each(_data.children, function(index) {
					
					/* debug */ _mmPluginDebug("child"+index+" = "+this.UniqueName);
					
					totallinks++;
					
					/* Check - for grandchildren */
					if(this.children){
						
						/* Loop - through grandchildren */
						jQuery.each(this.children, function(index) {
							
							totallinks++;
								
						});

					}
					
				});
				
				
				_el.addClass(_settings._mmIndMMClass);
				
				s._mmInt++;
				
				megamenu = jQuery('<div id="menu'+s._mmInt+'" class="'+_settings._mmCntnrClass+'">').appendTo(_el);
				
				megamenu.attr('rel',totallinks);
				
				/* Set the number of columns needed based on number of links range */
				if(totallinks >=s._mm4ColumnLinkRange[0]){
					totalcolumns=4;
					total_mmmmenuwidth=(s._mmmmenuwidth/4)*totalcolumns;
					var _posOffset=_el.position();
					megamenu.css({'visibility':'hidden', 'display':'block', 'width':total_mmmmenuwidth+'px','left': '-'+_posOffset.left+'px'});
				}
				if(totallinks >=s._mm3ColumnLinkRange[0] && totallinks<=s._mm3ColumnLinkRange[1]){
					totalcolumns=3;
					total_mmmmenuwidth=(s._mmmmenuwidth/4)*totalcolumns;
					megamenu.css({'visibility':'hidden', 'display':'block', 'width':total_mmmmenuwidth+'px'});	
				}
				if(totallinks >=s._mm2ColumnLinkRange[0] && totallinks<=s._mm2ColumnLinkRange[1]){
					totalcolumns=2;	
					total_mmmmenuwidth=(s._mmmmenuwidth/4)*totalcolumns+10;
					megamenu.css({'visibility':'hidden', 'display':'block', 'width':total_mmmmenuwidth+'px'});	
				}
				if(totallinks <=s._mm1ColumnLinkRange[0]){
					totalcolumns=1;	
					total_mmmmenuwidth=(s._mmmmenuwidth/4)*totalcolumns;
					megamenu.css({'visibility':'hidden', 'display':'block', 'width':total_mmmmenuwidth+'px'});	
				}
				
				
			}

		}
		
		if (_data.children && megamenu!='') {
				
			/* Loop - children */
			if(_settings._mmSnglCol==false){
				megamenu.append('<div>');
			}

			jQuery.each(_data.children, function(index) {
				
				if(_settings._mmSnglCol==false){
					megamenu.find('div').append('<p id="menu'+s._mmInt+'cat'+(index+1)+'">');
				}
				
				if(_settings._mmSnglCol==false){
					megamenuchild=megamenu.find('div > p:last-child');
				}
				/* Create - child link */
				
				if(_settings._mmSnglCol==false){
					if(this.URL!='' && this.URL!='#'){
						megamenuchild.append('<p class="'+_settings._mmCntnrClass+'-c"><a href="'+this.URL+'">'+this.title+'</a></p>');
					}else{
						megamenuchild.append('<p class="'+_settings._mmCntnrClass+'-c" rel="label">'+this.title+'</p>');
					}
				}else{
					megamenu.append('<a href="'+this.URL+'"><p>'+this.title+'</p></a>');
				}
				
				/* Check - for grandchildren */

				if(this.children && s._mmShwGrndChldrn==true && _settings._mmSnglCol==false){
					
					megamenuchild.append('<p class="'+_settings._mmCntnrClass+'-g">');
					
					megamenugrandchildren=megamenu.find('div > p:last-child').find('p.'+_settings._mmCntnrClass+'-g');
					/* Loop - through grandchildren */
					jQuery.each(this.children, function(index) {
						
						/* Create - grandchild link */
						megamenugrandchildren.append('<a href="'+this.URL+'">'+this.title+'</a>');
						
					});
					
				}
				
			});
			
			if(_settings._mmSnglCol==false){
				megamenu.find('div').append('<br style="clear:both">');
			}
		}
		
		/* debug */ _mmPluginDebug("MEGAMENU"+s._mmInt+": Start - Adjust Heights");
		
		/* debug */ _mmPluginDebug("totalnumber of links= "+totallinks);
		
		if(totallinks!=0 && _settings._mmSnglCol==false){
			var numChldrn=megamenu.find('div > p').size();
			_mmResizeItems(totalcolumns, numChldrn, s._mmInt);
		}
		
		/* debug */ _mmPluginDebug("MEGAMENU"+s._mmInt+": End - Adjust Heights");

	}
	
	function _mmCreateInteraction(_el, _settings){
		
		var s=_settings;
		
		var _mmAnimSpd;
		
		_mmAnimSpd = _settings._mmSpeed;

		if(_settings._mmAnimation == true) {
			
			jQuery("#psn > li").hoverIntent( 
			
				function(){
					
					var _mmCMM="", _mmCMMLnk="", _mmCMMCntnr="";
					
					_mmCMM = jQuery(this), _mmCMMLnk = jQuery(this).find('> a:first-child'), _mmCMMCntnr = _mmCMM.find('.'+_settings._mmCntnrClass);
					
					var megamenuListItems = jQuery('#psn > li');
					
					megamenuListItems.each(function (i){
		  
						if(jQuery(this).hasClass('PSNactive')){
							
							$settings.mmMouseOutSensitivity = 2000;
							
							jQuery(this).removeClass('PSNactive');
							
							jQuery(this).find('.'+_settings._mmCntnrClass).slideUp(_mmAnimSpd/2,function(){
								jQuery(this).css({'visibility':'hidden','display':'block'});	
							});
							
						}
					})     
							 
					if (_mmCMM.hasClass(_settings._mmIndMMClass)) {
					
						_mmCMMLnk.addClass(_settings._mmpsnLinkClass);
						
						_mmCMM.find('.'+_settings._mmCntnrClass).css({'visibility':'visible','display':'block'});
						
						_mmCMM.find('.'+_settings._mmCntnrClass).slideDown(_mmAnimSpd);
						
					} else {
	
						_mmCMM.find('.'+_settings._mmCntnrClass).css({'visibility':'visible','display':'block'});
						
					}
				}, 
				function(){
					
					var _mmCMM="", _mmCMMLnk="", _mmCMMCntnr="";
					
					_mmCMM = jQuery(this), _mmCMMLnk = jQuery(this).find('> a:first-child'), _mmCMMCntnr = _mmCMM.find('.'+_settings._mmCntnrClass);
					
					_mmCMM.removeClass('PSNactive');
					
					_mmCMMLnk.removeClass(_settings._mmpsnLinkClass);
					
					if(_settings._mmAnimation == true) {

						_mmCMM.find('.'+_settings._mmCntnrClass).slideUp(_mmAnimSpd,function(){
								jQuery(this).css({'visibility':'hidden','display':'block'});	
							});

					} else {

						_mmCMM.find('.'+_settings._mmCntnrClass).css({'visibility':'hidden','display':'block'});
							
					}
					
				}
			)
			
		} else {
			
			jQuery("#psn > li").hover( 
				function(){
					
					var _mmCMM="", _mmCMMLnk="", _mmCMMCntnr="";
					
					_mmCMM = jQuery(this), _mmCMMLnk = jQuery(this).find('a:first-child'), _mmCMMCntnr = _mmCMM.find('.'+_settings._mmCntnrClass);

					if (_mmCMM.hasClass(_settings._mmIndMMClass)) {

						_mmCMMLnk.addClass(_settings._mmpsnLinkClass);

						_mmCMM.find('.'+_settings._mmCntnrClass).css({'visibility':'visible','display':'block'});

					}
				}, 
				function(){
					
					var _mmCMM="", _mmCMMLnk="", _mmCMMCntnr="";
					
					_mmCMM = jQuery(this), _mmCMMLnk = jQuery(this).find('a:first-child'), _mmCMMCntnr = _mmCMM.find('.'+_settings._mmCntnrClass);
					
					_mmCMMLnk.removeClass(_settings._mmpsnLinkClass);
					
					if (_mmCMM.hasClass(_settings._mmIndMMClass)) {

						_mmCMM.find('.'+_settings._mmCntnrClass).css({'visibility':'hidden','display':'block'});

					}
				}
			)
		}
	
	}	

})( jQuery );
/*! **********************************************************************
*	MegaMenu :End
************************************************************************/
