// ----------------- textresizedetector.js starts here ------------------------
/** 
 *  @fileoverview TextResizeDetector
 * 
 *  Detects changes to font sizes when user changes browser settings
 *  <br>Fires a custom event with the following data:<br><br>
 * 	iBase  : base font size  	
 *	iDelta : difference in pixels from previous setting<br>
 *  	iSize  : size in pixel of text<br>
 *  
 *  * @author Lawrence Carvalho carvalho@uk.yahoo-inc.com
 * @version 1.0
 *
 *	REQUIRED BY: zones-navigation-rollover
 */

/**
 * @constructor
 */
TextResizeDetector = function() { 
    var el  = null;
	var iIntervalDelay  = 200;
	var iInterval = null;
	var iCurrSize = -1;
	var iBase = -1;
 	var aListeners = [];
 	var createControlElement = function() {
	 	el = document.createElement('span');
		el.id='textResizeControl';
		el.innerHTML='&nbsp;';
		el.style.position="absolute";
		el.style.left="-9999px";
		var elC = document.getElementById(TextResizeDetector.TARGET_ELEMENT_ID);
		// insert before firstChild
		if (elC)
			elC.insertBefore(el,elC.firstChild);
		iBase = iCurrSize = TextResizeDetector.getSize();
 	};

 	function _stopDetector() {
		window.clearInterval(iInterval);
		iInterval=null;
	};
	function _startDetector() {
		if (!iInterval) {
			iInterval = window.setInterval('TextResizeDetector.detect()',iIntervalDelay);
		}
	};
 	
 	 function _detect() {
 		var iNewSize = TextResizeDetector.getSize();
		
 		if(iNewSize!== iCurrSize) {
			for (var 	i=0;i <aListeners.length;i++) {
				aListnr = aListeners[i];
				var oArgs = {  iBase: iBase,iDelta:((iCurrSize!=-1) ? iNewSize - iCurrSize + 'px' : "0px"),iSize:iCurrSize = iNewSize};
				if (!aListnr.obj) {
					aListnr.fn('textSizeChanged',[oArgs]);
				}
				else  {
					aListnr.fn.apply(aListnr.obj,['textSizeChanged',[oArgs]]);
				}
			}

 		}
 		return iCurrSize;
 	};
	var onAvailable = function() {
		
		if (!TextResizeDetector.onAvailableCount_i ) {
			TextResizeDetector.onAvailableCount_i =0;
		}

		if (document.getElementById(TextResizeDetector.TARGET_ELEMENT_ID)) {
			TextResizeDetector.init();
			if (TextResizeDetector.USER_INIT_FUNC){
				TextResizeDetector.USER_INIT_FUNC();
			}
			TextResizeDetector.onAvailableCount_i = null;
		}
		else {
			if (TextResizeDetector.onAvailableCount_i<600) {
	  	 	    TextResizeDetector.onAvailableCount_i++;
				setTimeout(onAvailable,200)
			}
		}
	};
	setTimeout(onAvailable,500);

 	return {
		 	/*
		 	 * Initializes the detector
		 	 * 
		 	 * @param {String} sId The id of the element in which to create the control element
		 	 */
		 	init: function() {
		 		
		 		createControlElement();		
				_startDetector();
 			},
			/**
			 * Adds listeners to the ontextsizechange event. 
			 * Returns the base font size
			 * 
			 */
 			addEventListener:function(fn,obj,bScope) {
				aListeners[aListeners.length] = {
					fn: fn,
					obj: obj
				}
				return iBase;
			},
			/**
			 * performs the detection and fires textSizeChanged event
			 * @return the current font size
			 * @type {integer}
			 */
 			detect:function() {
 				return _detect();
 			},
 			/**
 			 * Returns the height of the control element
 			 * 
			 * @return the current height of control element
			 * @type {integer}
 			 */
 			getSize:function() {
	 				var iSize;
			 		return el.offsetHeight;
		 		
		 		
 			},
 			/**
 			 * Stops the detector
 			 */
 			stopDetector:function() {
				return _stopDetector();
			},
			/*
			 * Starts the detector
			 */
 			startDetector:function() {
				return _startDetector();
			}
 	}
 }();

TextResizeDetector.TARGET_ELEMENT_ID = 'doc';
TextResizeDetector.USER_INIT_FUNC = null;



// ------------------ textresizedetector.js ends here -------------------------
// ------------------- textresizeinit.js starts here --------------------------
/*
	detect the users font size and adjust the layout appropriately
	
	REQUIRED BY: zones-navigation-rollover
*/
 	function init()  {
	   var iBase = TextResizeDetector.addEventListener(onFontResize,null);
	   var bodyTag = document.getElementById('header');
	   if(bodyTag)  {
		   if (iBase>27)  {
				bodyTag.className='large-type';
			}
		}
	}
	//id of element to check for and insert control
	TextResizeDetector.TARGET_ELEMENT_ID = 'header';
	//function to call once TextResizeDetector has init'd
	TextResizeDetector.USER_INIT_FUNC = init;
		function onFontResize(e,args) {
			// to aid navigation roll-overs
			zone_navigation_rollover.simpleNavResizer();
			// end of aid to navigaiton roll-overs
			var bodyTag = document.getElementById('header');
			if(bodyTag){
				//27 is the last font size for the standard layout
				if (args[0].iSize>27)  {
					bodyTag.className='large-type';
				}
				if (args[0].iSize<26)
				{
					bodyTag.className='';
				}
			}
		}
// -------------------- textresizeinit.js ends here ---------------------------
/*
	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;
				
			this.focused = true;
			if (!checkClass(this, thisClassHover)) {
				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){
				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").getElementsByTagName('a');
		
		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 -----------------------------