var BUA = navigator.userAgent;
var BIE = BUA.indexOf("MSIE");
var BIsIE = BIE>=0;
var BIsMaccak = BUA.indexOf("Mac")!=-1;
var BVer = BIE>=0?parseFloat(BUA.substring(BIE+5, BIE+6)+"."+BUA.substring(BIE+7, BIE+8)):parseInt(navigator.appVersion.substring(0,1));

var NODE_ID = 0;
var PARENT_NODE = 1;
var DISPLAY_TEXT = 2;
var HELP = 3;
var URL = 4;
var URL_TARGET = 5;

/* ----------------- browsers DOM extensions -------------------------*/
//this is included to implement the Array.push function in ieMac
if (typeof Array.prototype.push == 'undefined') {
	Array.prototype.push=function(){
		var i=0;
	    b=this.length,a=arguments;
		for(i;i<a.length;i++)this[b+i]=a[i];
	    return this.length
	}
}

//this is included to implement the Array.inArray function
if (typeof Array.prototype.inArray == 'undefined') {
	Array.prototype.inArray = function(value){
		for (var i=0; i<=this.length-1; i++) {
			if (this[i] == value) {
				return true;
			}
		}

		return false;
	}
}
/* -----------------  end browsers DOM extensions -------------------------*/


var siteNavigation = new SiteNavigation();

function SiteNavigation() {
	this._mainNavigationId = 6;
	this._linksNavigationId = 000;
	this._footerNavigationId = 7;
	this._clientTemplatePath = '';
	this._selectedNavId = 0;
	
	this._pageTitle = '';
	this._bannerText = '';
	this._bannerImage = '';
	this._bannerImageId = 'bnrImg';
	this._defaultBannerImage = '';
	
	this._mainNavDepthLimit = -1;  //-1 = no limit on depth 
	this._menuCount = 0;
	this._rootNavId = -1;
	this._trail = new Array();
	this._mainNavDOMId = "mainNav";
	this._menuULs = Array(); //internal variable for detecting menu direction

	this.initBeforeLoad = function(){
		this._makeTrail();
	}
	
	this.initAfterLoad = function() {
		this._enableMainNavigation();
	}
	
	this.setSelectedNavId = function(selectedNavId) {
		this._selectedNavId = selectedNavId;
	}
	
	this.setPageTitle = function(pageTextStr) {
		this._pageText = pageTextStr;
	}
	
	this.setBannerText = function(bannerTextStr) {
		this._bannerText = bannerTextStr;
	}
	
	this.setBannerImage = function(bannerImageStr) {
		this._bannerImage = bannerImageStr;
	}
	
	this.setDefaultBannerImage = function(bannerImageStr) {
		this._defaultBannerImage = bannerImageStr;
	}
	
	this.setClientTemplatePath = function(path) {
		this._clientTemplatePath = path;		
	}	
	
	this.buildMainNavigation = function() {
		var out = '';
		
		out = this._buildMainNavigationRC(this._mainNavigationId, 0);					
		return out;
	}

	this._enableMainNavigation = function() {
		this._sfHover();
		
		document.getElementById(this._mainNavDOMId).style.display = "block";
	}
	
	this.buildNavTitle = function() {
		//finds the of the page from the following hirachy
		// bannerText then pageTitle then selectedNavItem title else nothing
		
		if (this._bannerText != '') {
			return this._bannerText;
		} else if (navItemExists(this._selectedNavId)) {
			return getNavItem(this._selectedNavId)[DISPLAY_TEXT];
		} else if (this._pageTitle != '') {
			return this._pageTitle;
		} else {
			return '';
		}
	}
	
	this.buildLinksNav = function() {
		var out = '';
		
		out = '<ul>';
		
		for (var i=0; i<= NavItems.length-1; i++) {
			if (NavItems[i][PARENT_NODE] == this._linksNavigationId) {
				out += "<li>";
				out += "<a href=\""+NavItems[i][URL]+"\" "+(NavItems[i][URL_TARGET] != '' ? 'target="'+NavItems[i][URL_TARGET]+'"' : '')+">"+NavItems[i][DISPLAY_TEXT]+"</a>";
				out += "</li>";
			}
		}
		
		out += '</ul>';
		return out;
	}
	
	this.buildSelectedNav = function() {
		var out = '';
		
		if (!navItemExists(this._selectedNavId)) {
			return '';
		}
		
		var navItem = getNavItem(this._selectedNavId);
		
		if (navItem[PARENT_NODE] == this._mainNavigationId) {
			var parentNodeId = this._selectedNavId;
		} else {
			var parentNodeId = getNavItem(this._selectedNavId)[PARENT_NODE];
		}		
		
		out = '<ul>';
		for (var i=0; i <= NavItems.length-1; i++) {
			if (NavItems[i][PARENT_NODE] == parentNodeId) {
				out += '<li class="'+(NavItems[i][NODE_ID]==this._selectedNavId ? 'selected' : '')+'">';
				out += '<a href="'+NavItems[i][URL]+'" '+(NavItems[i][URL_TARGET] != '' ? 'target="'+NavItems[i][URL_TARGET]+'"' : '')+'>'+NavItems[i][DISPLAY_TEXT]+'</a>';
				if (hasChildren(NavItems[i][NODE_ID])) {
					out += '<ul>';
					for (var s=0; s <= NavItems.length-1; s++) {
						if (NavItems[s][PARENT_NODE] == NavItems[i][NODE_ID]) {
							out += '<li><a href="'+NavItems[s][URL]+'" '+(NavItems[s][URL_TARGET] != '' ? 'target="'+NavItems[s][URL_TARGET]+'"' : '')+'>'+NavItems[s][DISPLAY_TEXT]+'</a></li>';
						}
					}
					out += '</ul>';
				}
				out += '</li>';
			}
		}
		out += '</ul>';		
		
		return out;
	}
	
	this.buildFooterNav = function() {
		var out = '';
		var count = 0;
		var licount = 0;
		
		out = '<ul>';
		
		for (var i=0; i<= NavItems.length-1; i++) {
			if (NavItems[i][PARENT_NODE] == this._footerNavigationId) {count++;}
		}		
		
		for (var i=0; i<= NavItems.length-1; i++) {
			if (NavItems[i][PARENT_NODE] == this._footerNavigationId) {
				licount++
				out += '<li '+(count == licount ? 'style="border-right:none"' : '')+'>';
				out += "<a href=\""+NavItems[i][URL]+"\" "+(NavItems[i][URL_TARGET] != '' ? 'target="'+NavItems[i][URL_TARGET]+'"' : '')+">"+NavItems[i][DISPLAY_TEXT]+"</a>";
				//out += " | </li>";
				out += "  </li>";
				
				
			}
		}
		
		out += '</ul>';
		return out;
	}
	
	this.buildBannerImage = function() {
		if (this._bannerImage == '') {
			document.getElementById('bnrImg').src = this._defaultBannerImage;
		}
	}
	
	this._isSelectedNavIdValid = function(){
		return ((this._selectedNavId > 0) && (getNavItem(this._selectedNavId).length > 0));
	}
	
	this.buildTrail = function(){
		var out = Array();
		var foundMainNav = false;
		
		for (var i=0; i<this._trail.length; i++) {
			if (foundMainNav) {
				var navItem = getNavItem(this._trail[i]);
				out.push('<a href="'+navItem[URL]+'">'+navItem[DISPLAY_TEXT]+'</a>');
			} else if (this._trail[i] == this._mainNavigationId) {
				foundMainNav = true;
			}
		}
		
		return out.join(' > ');
	}
	
	this._sfHover = function() {
		//if (!BIsIE) {return false;}
		
		var mainNavDOMId = siteNavigation._mainNavDOMId;
		var sfEls = document.getElementById(mainNavDOMId).getElementsByTagName("LI");
		
		for (var i=0; i<sfEls.length; i++) {
			sfEls[i].onmouseover=function(e) {
				if (BIsIE) {
					this.className+=" sfhover";
				}
				siteNavigation._sfHoverDetectScreenOverflow(e ? e : event);
			}
			sfEls[i].onmouseout=function() {
				if (BIsIE) {
					this.className=this.className.replace(new RegExp(" sfhover\\b"), "");
				}
			}
			
			if (sfEls[i].parentNode == document.getElementById(mainNavDOMId) && BIsIE) {
				if (BIsIE) {
					//sfEls[i].style.width = '1px';
				}
			}
		}
	}
	
	this._sfHoverDetectScreenOverflow = function(e) {
		var target = e.srcElement ? e.srcElement : e.target;
		var thisUL = target;
		var menuX = 0;
		var browserWidth = 0;
		var branchWidth = 0;
		

		while ((thisUL.tagName != 'UL') && (thisUL.tagName != 'BODY')) {
			thisUL = thisUL.parentNode;
		}
		
		if (thisUL.id == this._mainNavDOMId) {
			thisUL = target.parentNode.parentNode.childNodes[1];
			
			if (thisUL) {
				branchWidth = this._sfHoverDetectWidestBranch(thisUL);
				menuX = this._getElementXPosRelativeToScreen(thisUL);
				browserWidth = (window.innerWidth ? window.innerWidth : document.body.scrollWidth) - 20;
			
				if ((menuX + branchWidth) > browserWidth) {
					thisUL.className = 'leftAlign';
				} else {
					thisUL.className = '';
				}
			}
		}
	}
	
	this._sfHoverDetectWidestBranch = function(HTMLObj){
		
		var widestBranchWidth = HTMLObj.offsetWidth;
		var thisBranchesWidth = 0;
		
		this._menuULs = Array();
		this._sfHoverGetULsAtEndOfBranchesRC(HTMLObj);
		
		for(var i=0; i<this._menuULs.length; i++) {
			thisBranchesWidth = this._sfFoverDetectThisBranchesWidth(HTMLObj, this._menuULs[i]);
			if (thisBranchesWidth > widestBranchWidth) {
				widestBranchWidth = thisBranchesWidth;
			}
		}
		
		return widestBranchWidth;
	}
	
	this._sfFoverDetectThisBranchesWidth = function (topULObj, ULObj) {
		var width = topULObj.offsetWidth;
		
		while (ULObj != topULObj) {
			if (ULObj.tagName == 'UL') {
				width = width + ULObj.offsetWidth;
			}
			ULObj = ULObj.parentNode;
		}
		
		return width;
	}
	
	
	this._sfHoverGetULsAtEndOfBranchesRC = function(HTMLObj) {
		
		for (var i=0; i<HTMLObj.childNodes.length; i++) {
			var child = HTMLObj.childNodes[i];
			if (child.tagName == 'UL') {
				this._menuULs.push(child);
			}
			
			this._sfHoverGetULsAtEndOfBranchesRC(child);
		}
	}
	

	this._getElementXPosRelativeToScreen = function(elementObj) {
		var x = 0;
		
		var element = elementObj.parentNode;
				
		while (element.tagName != 'BODY') {
			x += element.offsetLeft;
			element = element.parentNode;
		}
				
		return x;
	}

	this._buildMainNavigationRC = function(navId, depth){
		var out = '';
		
		if (!hasChildren(navId) || (depth == this._mainNavDepthLimit)){
			return out;
		}
	
		if (this._menuCount == 0){
			out += '<ul id="'+this._mainNavDOMId+'" style="display:none">';
			this._menuCount++;
		} else {
			out += "<ul>";
		}
		
		depth++;
	
		for (var i=0; i<= NavItems.length-1; i++){			
			if (NavItems[i][PARENT_NODE] == navId) {
				
				if (this._trail[2] == NavItems[i][NODE_ID]) {
					var id = 'selectedMainMav';
				} else {
					var id = '';
				}											
				out += '<li id="'+id+'">';
				out += "<a href=\""+NavItems[i][URL]+"\" "+(NavItems[i][URL_TARGET] != '' ? 'target="'+NavItems[i][URL_TARGET]+'"' : '')+"><div>"+NavItems[i][DISPLAY_TEXT]+"</div></a>";
				// the below line commented by subash 28112005==========
				//out += this._buildMainNavigationRC(NavItems[i][NODE_ID], depth);
				out += "</li>";
			}
		}		
		
		out += "</ul>";
		return out;
	}
	
	this._makeTrail = function(){
		if (!this._isSelectedNavIdValid()) {return '';}
		this._makeTrailRc(this._selectedNavId);
		this._trail.reverse();
	}
	
	this._makeTrailRc = function(nodeId){
		if (nodeId != this._rootNavId) {
			this._trail.push(nodeId);
	
			var node = getNavItem(nodeId);
			this._makeTrailRc(node[PARENT_NODE]);
		}
	
		if (nodeId == this._rootNavId){
			this._trail.push(this._rootNavId);
		}
	}
}

/* ----------------- functions for manipulating the NavItems array -------------------------*/
function hasChildren(navId){
	for (var i=0; i<=NavItems.length-1; i++) {
		if (NavItems[i][PARENT_NODE] == navId) {
			return true
		}
	}

	return false;
}


function getNavItem(id){
	//returns an array containing the data from NavItems for the given id
	//

	var navItem = Array();

	for (var i=0; i<NavItems.length; i++) {
		if (NavItems[i][NODE_ID] == id) {
			navItem[NODE_ID] = NavItems[i][NODE_ID];
			navItem[PARENT_NODE] = NavItems[i][PARENT_NODE];
			navItem[DISPLAY_TEXT] = NavItems[i][DISPLAY_TEXT];
			navItem[HELP] = NavItems[i][HELP];
			navItem[URL] = NavItems[i][URL];
			navItem[URL_TARGET] = NavItems[i][URL_TARGET];
		}
	}

	return navItem;
}

function navItemExists(id){
	//returns true or false depending on the existance of the name item

	var navItem = getNavItem(id)
	return navItem.length > 0;
}