/*
	this script shows the roll-overs for the crumb navigation

	if javascript is turned off no rollovers appear
	
	REQUIRES: textresizedetector and textresizeinit to run before this
	
*/

( function () {
	var timeout;
	
	function pollForLoad () {
		var crumbNav = document.getElementById("crumb-nav");
		if (crumbNav) {
			zone_navigation_rollover.setupNavRolloverEvents(crumbNav);
			clearInterval (timeout);
		}
	}

	timeout = setInterval(pollForLoad, 500);
} ) ();


zone_navigation_rollover = ( function () {
	var zone_navigation_rollover = {};
	
	function checkClass(navItem,class1) {
	      var regExpString = '\\b'+class1+'\\b';
	      var regularExpression = new RegExp(regExpString);
	      return regularExpression.test(navItem.className);
	}
	
	var currentPositionNames = [/\bfirst-end\b/, 
					/\bfirst-hover-end\b/,
					/\bfirst-end-hover\b/,
					/\bfirst-second\b/,
					/\bfirst-hover-second\b/,
					/\bfirst-second-hover\b/];
	var localNavItemMatcher = /\bfirst-local-item\b/;
					
	// this is used instead of getting the current background position as it is not reliably implemented across browser.
	var currentYPositions = [-13,-114,-215,-316,-417,-518];
					
	function removeClass(classes, className) {
  		for(var i=0; i<classes.length; i++){
  			if(classes[i] === className) {
  				classes.splice(i, 1);
  				return;
  			}
  		}
	}
	
	function addClass(classes, className) {
   		classes.push( className );
	}
	
	function determineChangesToSwapClassesOn(navItem,class1,class2){
		var classes = navItem.className.split(' ');
    	removeClass(classes, class1);
    	addClass(classes, class2);
    	var classString = classes.join(' ');
		
		var updateInfo = zone_navigation_rollover.determineBackgroundPositionAndPadding(classString);
		
    	updateInfo.className = classString;
    	
    	return updateInfo;
	}
		
	function eventProvider(navItem, thisClass, thisClassHover, previousNavItem, previousClass, previousClassHover) {
		
		//check for focus already
		navItem.focused = false;
		
		//accommodate the resizing of text
		var navItemInfo = zone_navigation_rollover.determineBackgroundPositionAndPadding(navItem.className);
		zone_navigation_rollover.updateNavItems(navItem, navItemInfo);
		
		navItem.hasFocus = function () { 
			return this.focused; 
		};
		
		navItem.onmouseover = function () {
			var navItemInfo, previousNavItemInfo;
			
			navItemInfo = determineChangesToSwapClassesOn(this, thisClass, thisClassHover);
			if (previousNavItem) { 
				previousNavItemInfo = determineChangesToSwapClassesOn( previousNavItem, previousClass, previousClassHover); 
			}
			
			zone_navigation_rollover.updateNavItems( navItem, navItemInfo, previousNavItem, previousNavItemInfo);
		};
		
		navItem.onmouseout = function () {
			var navItemInfo, previousNavItemInfo;
				
			if (!this.focused) {		 
				navItemInfo = determineChangesToSwapClassesOn( this, thisClassHover, thisClass);
				if (previousNavItem) { 
					previousNavItemInfo = determineChangesToSwapClassesOn( previousNavItem, previousClassHover, previousClass); 
				}
			
				zone_navigation_rollover.updateNavItems( navItem, navItemInfo, previousNavItem, previousNavItemInfo);
			}
		};
		navItem.onfocus = function () {
			var navItemInfo, previousNavItemInfo;
			
			navItemInfo = determineChangesToSwapClassesOn( this, thisClass, thisClassHover);
			if (previousNavItem) { 
				previousNavItemInfo = determineChangesToSwapClassesOn( previousNavItem, previousClass, previousClassHover);
			}
			
			zone_navigation_rollover.updateNavItems( navItem, navItemInfo, previousNavItem, previousNavItemInfo);
			
		};
		navItem.onblur = function () {
			var navItemInfo, previousNavItemInfo;
				
			this.focused = false;
			navItemInfo = determineChangesToSwapClassesOn( this, thisClassHover, thisClass);
			if (previousNavItem) { 
				previousNavItemInfo = determineChangesToSwapClassesOn( previousNavItem, previousClassHover, previousClass); 
			}
			
			zone_navigation_rollover.updateNavItems( navItem, navItemInfo, previousNavItem, previousNavItemInfo);
		};
	}
	
	/* if the text size is different from normal, center the arrow. */
	zone_navigation_rollover.determineBackgroundPositionAndPadding = function(classString) {
		var textSize = Number(TextResizeDetector.getSize());
		var result = {};
		
		if (classString && textSize) {
			if (textSize < 40) {
					
				// 16px specified in base.css for navigation
				var yPosition = ((textSize - 16) / 2);
				var currentPlacementY = 0;
				
				for (var i = 0; i < currentPositionNames.length; i++) {
					if (currentPositionNames[i].test(classString)) {
						currentPlacementY = currentYPositions[i];
					}
				}
				
				var newYPosition = yPosition + currentPlacementY;
				result.backgroundPosition = "100% " + newYPosition + "px";
				
				// add a bit of padding when text size goes up
				var isLocalNavItem = localNavItemMatcher.test(classString);
			
				if (!isLocalNavItem) {
					if (textSize > 20) {
						result.paddingRight = "20px";
					} else if (textSize <= 20) {
						result.paddingRight = "15px";
					}
				} else {
					result.paddingRight = "5px";
				}
			} else { 
				result.backgroundPosition = "-460px 0";
				result.paddingRight = "5px";
			}
		}
		return result;
	};
	
	zone_navigation_rollover.updateNavItems = function(navItem, navItemInfo, previousNavItem, previousNavItemInfo) {
		navItem.style.backgroundPosition = navItemInfo.backgroundPosition;
    	navItem.className = navItemInfo.className ? navItemInfo.className : navItem.className;
		navItem.style.paddingRight = navItemInfo.paddingRight;
		if(previousNavItemInfo) {
			previousNavItem.style.backgroundPosition = previousNavItemInfo.backgroundPosition;
	    	previousNavItem.className = previousNavItemInfo.className;
			previousNavItem.style.paddingRight = previousNavItemInfo.paddingRight;
		}
	};
	
	zone_navigation_rollover.setupNavRolloverEvents = function(crumbNav) {
	
		var numOfCrumbs = 0;
		var previous = null;
		var crumb;
		var crumbs = crumbNav.getElementsByTagName('li');
		numOfCrumbs = crumbs.length;
		
		if (numOfCrumbs === 1) {
			/* the only one */
			crumb = crumbs[0].getElementsByTagName('a')[0];
			eventProvider(crumb, 'first-end', 'first-hover-end');
		}
		else if (numOfCrumbs > 1) {
			for(var i=0;i<numOfCrumbs;i++){
				crumb = crumbs[i].getElementsByTagName('a')[0];
				/* first and not the only one */
				if (i === 0) {
					eventProvider(crumb, 'first-second', 'first-hover-second');
				}	
				/* the last one */	
				if (numOfCrumbs === (i + 1)) {
					previous = crumbs[i - 1].getElementsByTagName('a')[0];
					eventProvider(crumb, 'first-end', 'first-hover-end', previous, 'first-second', 'first-second-hover');
				}
				/* the second one of many */
				if (numOfCrumbs > 2 && i === 1) { 
					previous = crumbs[i - 1].getElementsByTagName('a')[0];	
					eventProvider(crumb, 'first-second', 'first-hover-second', previous, 'first-second', 'first-second-hover');
				}
			}
		}
		
		/* roll-over effect with tags on last crumb */
		var localNav = document.getElementById('local-nav');
		if (localNav) {
			var localNavItems = localNav.getElementsByTagName('a');
			var lastCrumb = crumbs[numOfCrumbs-1].getElementsByTagName('a')[0];
			if(lastCrumb && localNavItems[0]){
				eventProvider(localNavItems[0],'first-local-item','first-local-item',lastCrumb,'first-end','first-end-hover');
			}
		}
	};
	
	/* textresizedetector notifies us of a text change so that we can change the arrow */
	zone_navigation_rollover.simpleNavResizer = function(){
		if (!document.getElementById) {
			return false;
		}
			
		var crumbNavItems = document.getElementById("crumb-nav") ? document.getElementById("crumb-nav").getElementsByTagName('a') : false;
		
		var textSize = Number(TextResizeDetector.getSize());
		var updateInfo;
		if (crumbNavItems) {
			for (var i = 0; i < crumbNavItems.length; i++) {
				if (Number(textSize) < 40) {
					updateInfo = zone_navigation_rollover.determineBackgroundPositionAndPadding(crumbNavItems[i].className);
				} else { 
					updateInfo = {};
					updateInfo.backgroundPosition = "-460px 0";
					updateInfo.paddingRight = "5px";
				}
				zone_navigation_rollover.updateNavItems(crumbNavItems[i], updateInfo);
			}
		}
	}
	
	return zone_navigation_rollover;
} ) ();


// ---------------------- zone-navigation-rollover.js ends here -----------------------------
