$(document).ready(function() {

	var subNav = $('#subNav');
	var subNavObjs = $('#subNav>li.navLevel1');
	var subNavObjsLength = subNavObjs.length;
	var activeNavLevel = 'navLevel1';
	var hash = null;
	var pageClick = false;
	
	if(subNavObjs.length <= 3) {
		subNav.css('height', 209);
	}
	
	if(window.location.hash.substr(1).indexOf('c') != -1) {
		var hash = window.location.hash.substr(2);
	}
	
	/**
	 * @do the right height of every navLink.
	 */
	var doNavLinkHeight = new function() {
		
		var navObjHeight = 191;
		var navBrdHeight = 6;
		var navLinkHeight = 43;
		
		var allNavObjs = subNav.find('li.navObj').not('li.navObj[rel=navLevel3]');
		allNavObjs.each(function() {
			
			var thisObj = $(this);
			var thisObjsLevel = thisObj.attr('rel');
			
			var navLinkClass = 'a.' + thisObjsLevel;
			var navLinks = $(this).find(navLinkClass);
			
			var navChildLevel;
			var navChildLength;
			var doTheMath = function(navChildLength, navChildObj, navChildLink) {
				var objBrdHeight = parseInt((navChildLength*navBrdHeight)-navBrdHeight);
				var objElHeight = parseInt((navObjHeight-objBrdHeight)/navChildLength);
				var lastObjHeight = parseInt(navObjHeight-((objElHeight*navChildLength)+objBrdHeight));
				if(navChildObj.hasClass('last'))
					objElHeight = objElHeight+lastObjHeight;
				var linkPos = parseInt((objElHeight/2)-(navLinkHeight/2));
				
				navChildObj.height(objElHeight);
				navChildLink.css('top', linkPos);
			}
			
			switch (thisObjsLevel) {
				case 'navLevel1':
					navChildLevel = 'li.navObj[rel=navLevel2]';
					var navChildsLevel1 = thisObj.find(navChildLevel);
					navChildLength = navChildsLevel1.length;
					navChildsLevel1.each(function() {
						var navChildObj = $(this);
						var navChildLink = navChildObj.find('a.navLink.navLevel2');
						doTheMath(navChildLength, navChildObj, navChildLink);
					});
				break;
				case 'navLevel2':
					navChildLevel = 'li.navObj[rel=navLevel3]';
					var navChildsLevel2 = thisObj.find(navChildLevel);
					navChildLength = navChildsLevel2.length;
					navChildsLevel2.each(function() {
						var navChildObj = $(this);
						var navChildLink = navChildObj.find('a.navLink.navLevel3');
						doTheMath(navChildLength, navChildObj, navChildLink);
					});
				break;
			}
			
		});
		
	}
	
	/**
	 * the eventhandlers from every single navObj
	 */
	var navEvents = {
		boxHover : function(event, navObjData) {
			if(navObjData.navObjEvents.hover && !navObjData.navObj.hasClass('inActiveObj')) {
				if(event.type == 'mouseenter') {
					navObjData.navObjLink.removeClass('invisible');
					navObjData.navObjMask.removeClass('invisible');
				} else if(event.type == 'mouseleave' && !navObjData.navObjLink.hasClass('invisible')) {
					navObjData.navObjLink.addClass('invisible');
					navObjData.navObjMask.addClass('invisible');
				}
			}
		},
		navLevelBack : function(event, navObjData) {
			if(activeNavLevel == navObjData.nextLevel) {
				navObjData.nextLevelList.addClass('invisible');
				navObjData.navObjSiblings.removeClass('inActiveObj');
				navObjData.navObjEvents.hover = true;
				$('#actSubNavArrow').removeAttr('id');
				activeNavLevel = navObjData.nextLevel;
				if(pageClick == true) {
					navObjData.navObjLink.addClass('invisible');
					navObjData.navObjMask.addClass('invisible');
					$(event.target).trigger('mouseenter');
				}
			} else {
				navObjData.navObj.find('span.subNavArrow').attr('id', 'actSubNavArrow');
				$('#level2Active').removeAttr('id').text('').css('background-image', '');
				$('#actSubNavArrow').removeClass('nextLevel');
				activeNavLevel = navObjData.nextLevel;
				$('li#secActNavObj').removeAttr('id');
				var nextNextLevel = navObjData.nextLevelList.find('ul').not('ul.invisible').addClass('invisible');
				var nextLevelObjs = navObjData.nextLevelList.find('li.invisible').removeClass('invisible');
				var nextLevelActLink = navObjData.nextLevelList.find('a.navLink.actLink').removeClass('actLink');
			}
		},
		navBoxClick : function(event, navObjData) {
			event.stopPropagation();
			if(!navObjData.navObjEvents.link) {
				event.preventDefault();
				
				if(navObjData.nextLevelList.hasClass('invisible')) {
					navObjData.nextLevelList.removeClass('invisible');
					navObjData.navObjSiblings.addClass('inActiveObj');
					navObjData.navObj.find('span.subNavArrow').attr('id', 'actSubNavArrow');
					navObjData.navObjEvents.hover = false;
					activeNavLevel = navObjData.nextLevel;
				} else {
					navEvents.navLevelBack(event, navObjData);
				}
			}
		},
		navObjClick: function(event, navObjData) {
			event.stopPropagation();
			
			if(!navObjData.navObjEvents.link) {
				event.preventDefault();
				
				if(navObjData.nextLevelList.hasClass('invisible')) {
					
					if(navObjData.navObjLevel == 'navLevel2') {
						var actNavText = navObjData.navObjLink.text();
						var actNavBackground = navObjData.navObjLink.attr('rel');
						$('#actSubNavArrow').addClass('nextLevel');
						var level2Act = navObjData.navObj.parent().parent('li.navLevel1').find('span.actLevel2');
						level2Act.attr('id', 'level2Active').text(actNavText).css('background-image', 'url(' + actNavBackground + ')');
					}
					
					activeNavLevel = navObjData.nextLevel;
					navObjData.navObj.attr('id', 'secActNavObj');
					navObjData.nextLevelList.removeClass('invisible');
					navObjData.navObjSiblings.addClass('invisible');
					navObjData.navObjLink.addClass('actLink');
					navObjData.navObjEvents.hover = false;
				}
			}
		}
	}
	
	/**
	 * this function checks the given hash and return true if the right link is in the rootline of the navObj
	 */
	var checkHash = function(navObj, navLink) {
		
		var linkId = 'a#a' + hash;
		
		if(navObj.find(linkId).length > 0) {
			return true;
		} else {
			return false;
		}
		
	}
	
	/**
	 * setting up every navObj on every navLevel
	 */
	var flyThroughNavLevels = new function() {
		
		var navObj;
		var prevLevel;
		var nextLevel;
		var nextLevelSelector;
		
		var navLevelData = function(navObj, navObjLevel, nextLevel, nextLevelListSelector, nextLevelSelector) {
			var navObjParentSelector = 'ul.' + navObjLevel;
			var navObjSiblingSelector = 'li.' + navObjLevel;
			var navObjData = {
				navObj: navObj,
				navObjLevel: navObjLevel,
				nextLevel: nextLevel,
				navObjSelectors: {
					navLink: 'a.navLink.' + navObjLevel,
					navMask: 'div.maskLayer.' + navObjLevel
				},
				navObjLink: null,
				navObjMask: null,
				navObjSiblings: navObj.parent(navObjParentSelector).find(navObjSiblingSelector).not(navObj),
				nextLevelList: navObj.find(nextLevelListSelector),
				nextLevelObjs: navObj.find(nextLevelSelector),
				nextLevelObjsLength: null,
				navObjEvents: {
					hover: true,
					click: true,
					link: true,
					automatic: false
				}
			}
			
			navObjData.navObjLink = navObj.find(navObjData.navObjSelectors.navLink);
			if(navObjLevel == 'navLevel1')
			navObjData.navObjMask = navObj.find(navObjData.navObjSelectors.navMask);
			navObjData.nextLevelObjsLength = navObjData.nextLevelObjs.length;
			
			return navObjData;
			
		}
		
		subNavObjs.each(function() {
			
			var navObj = $(this);
			var navObjLevel = navObj.attr('rel');
			var nextLevel = 'navLevel2';
			var nextLevelListSelector = 'ul.' + nextLevel;
			var nextLevelSelector = 'li.navObj[rel=' + nextLevel + ']';
			
			
			var navObjData = navLevelData(navObj, navObjLevel, nextLevel, nextLevelListSelector, nextLevelSelector);
			
			navObj.bind('mouseenter mouseleave', function(event) {
				navEvents.boxHover(event, navObjData);
			});
			if(navObjData.nextLevelObjsLength > 1)
			//if(navObjData.nextLevelObjsLength > 0)
				navObjData.navObjEvents.link = false;
			if(navObjData.navObjLink.attr('rel') == 'directLink') {
				navObjData.navObjEvents.link = true;
				navObjData.navObjLink.attr('target', '_self');
			}
			
			navObj.bind('click', function(event) {
				pageClick = false;
				if(!navObjData.navObj.hasClass('inActiveObj')) {
					navEvents.navBoxClick(event, navObjData);
				} 
			});
			$('#page').bind('click', function(event) {
				pageClick = true;
				if($('li.inActiveObj').length == (subNavObjsLength-1) && !navObjData.navObj.hasClass('inActiveObj'))
					navEvents.navLevelBack(event, navObjData);
				
			});
			
			if(checkHash(navObjData.navObj, navObjData.navObjLink)) {
				navObj.triggerHandler('mouseenter');
				navObj.triggerHandler('click');
			}
			
			navObjData.nextLevelObjs.each(function() {
				
				var navObj = $(this);
				var navObjLevel = navObj.attr('rel');
				var nextLevel = 'navLevel3';
				var nextLevelListSelector = 'ul.' + nextLevel;
				var nextLevelSelector = 'li.navObj[rel=' + nextLevel + ']';
				
				var navObjData = navLevelData(navObj, navObjLevel, nextLevel, nextLevelListSelector, nextLevelSelector);
				
				
				
				if(navObjData.nextLevelObjsLength > 1)
				//if(navObjData.nextLevelObjsLength > 0)
					navObjData.navObjEvents.link = false;
				
				navObj.bind('click', function(event) {
					navEvents.navObjClick(event, navObjData);
				});
				
				if(checkHash(navObjData.navObj, navObjData.navObjLink)) {
					navObj.triggerHandler('click');
				}
				
				navObjData.nextLevelObjs.each(function() {
					
					var navObj = $(this);
					var navObjLevel = navObj.attr('rel');
					var nextLevel = 'navLevel4';
					var nextLevelListSelector = 'ul.' + nextLevel;
					var nextLevelSelector = 'li.navObj[rel=' + nextLevel + ']';
					
					var navObjData = navLevelData(navObj, navObjLevel, nextLevel, nextLevelListSelector, nextLevelSelector);
					
					if(navObjData.nextLevelObjsLength > 1)
						navObjData.navObjEvents.link = false;
					
					navObj.bind('click', function(event) {
						navEvents.navObjClick(event, navObjData);
					});
					if(checkHash(navObjData.navObj, navObjData.navObjLink)) {
						navObj.triggerHandler('click');
					}
				});
				
			});
			
		});
		
	}
	
});

