/**********************************************************
*
*	Navigation Extra object
*
**********************************************************/
//ORDER  OF TAB INDEXING
	// Initalise global array for tabindexing
	var g_strTabArr  = "";
	g_strTabArr += "['subheading',1]";
	//g_strTabArr += "|['h4',2]";
	g_strTabArr += "|['progressMonitor',-1]";
	g_strTabArr += "|['page',-1]";
	g_strTabArr += "|['content',-1]";
	g_strTabArr += "|['header',-1]";
	g_strTabArr += "|['footer',-1]";
	g_strTabArr += "|['misc',-1]";
	g_strTabArr += "|['fMainMenu', 3]";
	// 10 - 24 reserved for area inside template
	
	//TOP NAV 50
	var intval = 30;
	for(var i = 1 ; i < 50 ; ++i){
		g_strTabArr += "|['nav" + i + "'," +  (intval + i) + "]";
	}//EXAMPLE: g_strTabArr += "|['nav1',101]";
	
	//SIDE NAV 50
	var intval = 100;
	for(var i = 1 ; i < 10 ; ++i){
		g_strTabArr += "|['secondarynav" + i + "'," +  (intval + i) + "]";
	}//EXAMPLE: g_strTabArr += "|['nav1',101]";
	
	//IMAGES
	g_strTabArr += "|['image1', 120]";
	g_strTabArr += "|['image2', 121]";
	g_strTabArr += "|['image3', 122]";
	g_strTabArr += "|['image4', 123]";
	g_strTabArr += "|['image5', 124]";
	g_strTabArr += "|['image6', 125]";
	
	
	//BODY TEXT 150
	var intval = 150;
	for(var i = 1 ; i < 50 ; ++i){
		g_strTabArr += "|['bodyCopy" + i + "'," +  (intval + i) + "]";
	}//EXAMPLE: g_strTabArr += "|['bodyCopy1',101]";

	//LIST TEXT 150
	var intval = 250;
	for(var i = 1 ; i < 100 ; ++i){
		g_strTabArr += "|['listItem" + i + "'," +  (intval + i) + "]";
	}//EXAMPLE: g_strTabArr += "|['listItem1',101]";
	

	//FOOTER NAV 300
	var intval = 300;
	for(var i = 1 ; i < 10 ; ++i){
		g_strTabArr += "|['navFooter" + i + "'," +  (intval + i) + "]";
	}//EXAMPLE: g_strTabArr += "|['navFooter1',101]";

	//FOOTER 500
	g_strTabArr += "|['footerText',500]";


	function manageTabIndex(blnRemove, arrExceptions){
		var objTabArray = g_strTabArr.split("|");
//document.getElementById("header").innerHTML = objTabArray.join("<br/>\n")
		//alert(objTabArray.length);
		for(var i = 0; i < objTabArray.length; i++)	{
			//SET STRING OF [id] to array
			// eval is officially deprecated - don't know who added this, but it shouldn't be here
			if(blnRemove == true){
				objTabArray[i] = eval(objTabArray[i]);
				objNav.setTabIndex(objTabArray[i][0],objTabArray[i][1],true,arrExceptions);
			}else{
				objTabArray[i] = eval(objTabArray[i]);
				objNav.setTabIndex(objTabArray[i][0],objTabArray[i][1]);
			}
		}
	}


	function manageTitleText(){
		
	}

	

	objNav.setTabIndex = function(strObjID, intTabIndex, blnRemove, arrExceptions){
		function isException(strObj, arrExceptions){
			for(var i = 0; i < arrExceptions.length; ++i){
				if(strObj == arrExceptions[i])
					return true;
			}
			return false;
		}
		var blnException	= false;
		var blnPass		= true;
		var objTabIndex		= objBrowser.getObject(strObjID);
		if(objTabIndex){
			var arrBlockTab		= new Array("","<br>","<br/>","&nbsp;"," ","<h1></h1>","<h1>&nbsp;</h1>");
			var arrDivException	= new Array("div_pageofpage","div_pageofpage_d");
			var arrTagException	= new Array("img","embed","textarea","input","!");

			for(var i=0; i < arrDivException.length; i++){
				if(arrDivException[i] == String(strObjID).toLowerCase()){
					blnException = true;
				}
			}
			for(var i=0; i < arrTagException.length; i++){
				if(arrTagException[i] == String(objTabIndex.tagName).toLowerCase()){
					blnException = true;
				}
			}
			if(!blnException){
				for(var i=0; i < arrBlockTab.length; i++){
					if((String(objTabIndex.innerHTML).toLowerCase() == arrBlockTab[i])){
						blnPass = false;
					}
				}
			}
			var nullEmpty;
			if(!blnPass || (blnRemove && !isException(strObjID, arrExceptions)) || objTabIndex.className && objTabIndex.className.toLowerCase().indexOf("inactive")!=-1){
					//if(objBrowser.ie && objBrowser.win){
					objTabIndex.tabIndex = -1;
					objTabIndex.setAttribute("tabIndex", -1);
					//alert(objTabIndex.id + ":: "+objTabIndex.tagName + ":: "+ objTabIndex.tabIndex);
					//alert(objTabIndex.id + " :: " + objTabIndex.tabIndex);
					//}else if(objBrowser.w3c){
						//objTabIndex.tabIndex = nullEmpty;
						//objTabIndex.removeAttribute("tabIndex");
					//}
					//if(objTabIndex.className && objTabIndex.className.toLowerCase().indexOf("inactive")!=-1){
						//objTabIndex.tabIndex = nullEmpty;
					//}
					if(objBrowser.win && objBrowser.ie)
						objTabIndex.hideFocus = true; 
			}else if(blnPass){
				objTabIndex.tabIndex = intTabIndex;
				objTabIndex.setAttribute("tabIndex",intTabIndex);
				if(objBrowser.win && objBrowser.ie)
					objTabIndex.hideFocus = false;
			}
		}
	}




	function manageContentTabIndex(strRootId,intTabIndex,blnRecurse){
		objNav.intTabIndex = intTabIndex;
		var objRoot = document.getElementById(strRootId);
		if(objRoot){
			recurseChildNodes(objRoot,blnRecurse);
		}
	}
	objNav.manageContentTabIndex = manageContentTabIndex;
	
	function getChildElements(objNode){
		for(var i = 0, arrNodes = []; i < objNode.childNodes.length; ++i){
			if(objNode.childNodes[i].nodeType && objNode.childNodes[i].nodeType == 1)
				arrNodes.push(objNode.childNodes[i]);
		}
		//alert(objNode.tagName+"::"+arrNodes.length);
		return arrNodes;
	}
		
	function recurseChildNodes(objRoot, blnRecurse){
		function isTagException(objNode, strProperty, rgxTest){
			if(objNode[strProperty])
				return (objNode[strProperty].search(rgxTest)!=-1);
		}
		for(var i = 0; i < objRoot.childNodes.length; i++){
			var objChild = objRoot.childNodes[i];
			// filter out some empty elements		
			if((objChild.innerHTML && !isTagException(objChild,"tagName",/\b(DIV|UL|OL|DL|OPTION|STRONG|BOLD|EM|I|U|S)\b/) && !(getChildElements(objChild).length == 2 && getChildElements(objChild)[0].tagName == "A" && isTagException(getChildElements(objChild)[1],"tagName",/\b(OL|UL)\b/)) && !(objChild.tagName == "P" && objChild.innerHTML == "&nbsp;") && !(getChildElements(objChild).length == 1 && objChild.firstChild.tagName == "A")) || (isTagException(objChild,"tagName",/\b(A|IMG|LABEL|SELECT|TEXTAREA|INPUT)\b/))){
				objChild.tabIndex = objNav.intTabIndex++;
				objChild.setAttribute("tabIndex",objNav.intTabIndex);
			}		
			if(blnRecurse && objChild.childNodes && objChild.childNodes.length > 0)
				recurseChildNodes(objChild, blnRecurse);
		}
	}
// key press handler
//window.counter = 0;
document.onkeydown = function(e){
	if(objBrowser.ie && objBrowser.major < 6){
	e = window.event;
	//if(document.getElementById("debug"))
		//document.getElementById("debug").innerText = ++window.counter;
	//alert(Boolean(document.currentTab) + " :: " + e.srcElement.tagName + " :: " + e.srcElement.id + " :: " + e.srcElement.tabIndex);
		if(e.keyCode == 9){
			var blnMaintainNativeTabs = tabEventListener(e.shiftKey);
			document.skipNextTab = false;
			// important to return false if we are overriding native tabbing function
			return blnMaintainNativeTabs;
		}
	}

	// This is to ensure that tab works on embedded plugins such as quicktime	
	if(document.currentTab && document.currentTab.tagName == "EMBED" && document.currentTab.type == "video/quicktime"){
		//alert(((document.currentTab)?document.currentTab.id:"None") + " : "+e.keyCode);
		if(e.keyCode == 13){ // enter key
			if((objBrowser.firefox && objBrowser.win) && document.currentTab)
				if(document.currentTab.GetRate() == 1)
					document.currentTab.Stop();
				else
					document.currentTab.Play();
		}else if(e.keyCode == 9 && !objBrowser.ie){ // tab key on non ie browsers
			var blnMaintainNativeTabs = tabEventListener(e.shiftKey);
			document.skipNextTab = true;
			// important to return false if we are overriding native tabbing function
			return blnMaintainNativeTabs;
		}
	}
}
document.onkeypress = function(e){
	e = e || window.event;
	if(!objBrowser.ns)
		e.cancelBubble = true;
	if(e.keyCode == 13){ // enter key
		var objSrc = e.srcElement;
		if(objSrc && objBrowser.ie)
			return bubbleEvent(objSrc);
		else if((!objBrowser.ie) && document.currentTab){ 
			var ua = navigator.userAgent;
			if((objBrowser.gecko && parseFloat(ua.substring(ua.indexOf("rv:")+3,ua.length-1)) < 1.8) || (objBrowser.firefox && parseFloat(objBrowser.major+"."+objBrowser.minor) < 1.5) && document.currentTab.tagName == "EMBED")
				sendMessageToFlash("AccessManager.click",true, document.currentTab.id);
			return bubbleEvent(document.currentTab);
		}
	}else if(e.keyCode == 9 && !objBrowser.ie){ // tab key on non ie browsers
		var blnMaintainNativeTabs = tabEventListener(e.shiftKey);//(!document.skipNextTab)?tabEventListener(e.shiftKey):tabEventListener(e.shiftKey);
		document.skipNextTab = false;
		// important to return false if we are overriding native tabbing function
		return blnMaintainNativeTabs;
	}
}

// finds an onclick or onmousedown of an object or a parent element and calls it
function bubbleEvent(objSrc){
	if(objSrc.onmousedown && (objSrc.onmousedown() == false))
		return false;
	if(objSrc.onmouseup && (objSrc.onmouseup() == false))
		return false;
	if(objSrc.onclick && (objSrc.onclick() == false))
		return false;
	if(objSrc.parentNode && objSrc.parentNode.tagName != "BODY")
		bubbleEvent(objSrc.parentNode);
	return true;
}
function keyEventListener(strKey){
	var arrElements = objNav.accessKeys;
	for(var i = 0; i < arrElements.length; ++i){
		//if(arrElements[i].onkeyup)
			objBrowser.getObject(arrElements[i]).onkeyup(strKey);
	}
}
// module level variables
var m_tabIndexArray;
// IMPORTANT: intTabIndex initialised to 199 to get around a bug in mac ie which crashes when trying to increment
// or decrement a value less than 199 in a global variable from within the scope of a local function (tabEventListener)
var intTabIndex = 199;
function tabEventListener(blnShift, blnKillFocus){
	var macFix = intTabIndex - 200;
	var ua = navigator.userAgent;
	if(!document.skipNextTab){
		if(!m_tabIndexArray)
		{
			buildTabIndexArray(document.body);
		}
		//alert(m_tabIndexArray.length);
		if(m_tabIndexArray.length == 0)
			return true;
		// initialise variable if it doesn't exist already, increment it if it does
		if(!blnShift){
			++macFix;
		}else{
			--macFix;
		}
		// if we've reached the last tabindex reset to zero, the beginning of the array
		if(macFix >= m_tabIndexArray.length){
			macFix = 0;
		}
		if(macFix < 0){
			macFix = m_tabIndexArray.length-1;
		}
	}
	//alert(document.currentTab.tagName + " :: " + document.currentTab.id + " :: " + document.currentTab.tabIndex);
	// reset previously tabbed item
	if(document.currentTab){
		with(document.currentTab){
			/*if(!style.width) style.width = (offsetWidth+2) + "px";
			else style.width = (parseInt(style.width)+2) + "px";
			if(!style.height) style.height = (offsetHeight+2) + "px";
			else style.height = (parseInt(style.height)+2) + "px";*/
			var strTag = document.currentTab.tagName.toLowerCase();
			if((strTag == "embed" && document.currentTab.type == "application/x-shockwave-flash") || (strTag == "object" && document.currentTab.classid == "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000")){
				//alert("test out" + document.currentTab.id);				
			}
			if(!(objBrowser.ie && objBrowser.win) && !(objBrowser.firefox && (parseFloat(objBrowser.major+"."+objBrowser.minor)>=1.5))){
				if(!(objBrowser.ns && tagName.toLowerCase() == "a")){
					for(var i in oBorder){
						style[i] = oBorder[i];
					}
				}
			}
			if(blur){
				blur();
			}
		}
	}
	if(blnKillFocus){
		intTabIndex = macFix + 200;
		return;
	}
	// if the object is disabled move on to next tabindex
	if(m_tabIndexArray[macFix].tabIndex < 0 || (m_tabIndexArray[macFix].className && m_tabIndexArray[macFix].className.toLowerCase().indexOf("disabled") != -1)){
		intTabIndex = macFix + 200;
		tabEventListener(blnShift);
		macFix = intTabIndex - 200;
	}else{ // set next object in tab array as the current tabbed object
	//alert("tIndex: "+ m_tabIndexArray[macFix].tabIndex + ":: "+ m_tabIndexArray[macFix].id + ":: "+ m_tabIndexArray[macFix].tagName);
		//alert(m_tabIndexArray[macFix].tagName + ":" + m_tabIndexArray[macFix].id);
		document.currentTab = m_tabIndexArray[macFix];
		with(document.currentTab){
			var strTag = document.currentTab.tagName.toLowerCase();
				//alert("tag: "+strTag+", classid: "+document.currentTab.classid);
			if((strTag == "embed" && document.currentTab.type == "application/x-shockwave-flash") || (strTag == "object" && document.currentTab.classid == "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000")){
				//
			}
			if(!(objBrowser.ie && objBrowser.win)){
				document.currentTab.oBorder = new Object();
				if(!objBrowser.safari && !(objBrowser.mac && objBrowser.ie)){
					for(var i in style){
						var strStyle = new String(i);
						var strValue = new String(style[i]);
						if(strStyle.toLowerCase().match("border")){
							oBorder[strStyle] = strValue;
						}
					}
				}else{
					// iterate through style values (order of style rule specificity respected but cascading ignored unfortunately)
					var arrBorderStyles = ["Color","Width","Style"];
					var arrBorderEdges = ["Bottom","Top","Left","Right"];
					for(var i = 0, strProp = ""; i < arrBorderStyles.length; ++i){
						strProp = "border"+arrBorderStyles[i];
						oBorder[strProp] = style[strProp];
						for(var j = 0; j < arrBorderEdges.length; ++j){
							strProp = "border"+arrBorderEdges[j];
							if(i == 0)
								oBorder[strProp] = style[strProp];
							strProp += arrBorderStyles[i];
							oBorder[strProp] = style[strProp];
						}
					}
				}
				if(!(objBrowser.firefox && (parseFloat(objBrowser.major+"."+objBrowser.minor)>=1.5))){
					if(!(objBrowser.ns && tagName.toLowerCase() == "a")){
						style.border = "1px dotted #999999";
					}
				}
			}
			if(focus){ 
				focus();
			}
		}
	}
	intTabIndex = macFix + 200;
	return false;
}
// creates an array of all child elements of an object with a tabindex
function buildTabIndexArray(obj){
	if(!m_tabIndexArray)
		m_tabIndexArray = new Array();
	// look for objects that shouldn't be tabbing - disabled or not visible
	var blnExclude = false;
	var objParent = obj;
	while(objParent && objParent.tagName!="BODY"){
		if(objParent.style && (objParent.style.display == "none" || objParent.style.visibility == "hidden"))
			blnExclude = true;
		objParent = objParent.parentNode;
	}
	if(!blnExclude){
		// loop through all children
		for(var i = 0; i < obj.childNodes.length; i++){
			var oChild = obj.childNodes[i];
			// get tab index of this child
			var intTabIndex = (oChild.getAttribute) ? oChild.getAttribute("tabIndex") : oChild.tabIndex;
			intTabIndex = parseInt(intTabIndex);
			if(objBrowser.ie && objBrowser.major < 6 && intTabIndex == 0){
				oChild.tabIndex = intTabIndex = -1;
			}
			if(!isNaN(intTabIndex) && !blnExclude){
				var blnInsert = false;
				// loop through tab array to see where this new object should be placed
				for(var j = 0; j < m_tabIndexArray.length; j++){
					var intCompTab = (m_tabIndexArray[j].getAttribute) ? m_tabIndexArray[j].getAttribute("tabIndex") : m_tabIndexArray[j].tabIndex;
					intCompTab = parseInt(intCompTab);
					// found an object with a higher tab index - this object goes before it
					if(intTabIndex < intCompTab){
						blnInsert = true;
						insertArrayElement(j,oChild);
						break;
					}
				}
				// reached the end of the array without placing the object
				// so we add it to the end
				if(!blnInsert)
					insertArrayElement(m_tabIndexArray.length,oChild);
			}
			// if this object has children recurse the function
			if(oChild.childNodes)
				buildTabIndexArray(oChild);
		}
	}
}
// inserts an element in an array based on a supplied position index
function insertArrayElement(intIndex,objInsert){
	var oCopyArray = new Array();
	for(var i = 0; i < intIndex; i++){
		oCopyArray[oCopyArray.length] = m_tabIndexArray[i];
	}
	oCopyArray[oCopyArray.length] = objInsert;
	for(i = intIndex; i < m_tabIndexArray.length; i++){
		oCopyArray[oCopyArray.length] = m_tabIndexArray[i];
	}
	m_tabIndexArray = oCopyArray;
}