/* **** MasterNavigationAPI.js ****
created by: Elaine Harman

This is the MasterNav object used in the iFrame design.  Elaine's going to have to comment on it more extensively.
It's called with:
   MasterNav = new MasterNavigation(NavJSDO [, additional JSDOs]);
*/

// Constructor for page navigation object
function MasterNavigation() {
	this.JSDO = new NavigationJSDO(null);
	var dataArray = new Array();
	for (var j=0; j<arguments.length; j++) dataArray[dataArray.length] = arguments[j].data;
	this.JSDO.data = joinObjects(dataArray);
	this.depth = 0;
	this.flattenNavItems(this.JSDO.data);
	this.overItem = null;
	this.activeItems = new Array(this.depth);
	for (var i=0; i<this.activeItems.length; i++) this.activeItems[i] = null;
	this.deeplinkPath = null;
	this.autoDefaultItemClick = true;
	this.NAVIGATION_STATES = {"out":["Out",""], "on":["On",".live"], "over":["Over",".mo"]};
	this.SUBNAV_DISPLAY_CLASSES = {"hidden":"navHidden", "visible":"navVisible"};
	this.subnavDirection = "up";
	
	// audi hacks-- temporary, should be removed for v2.5
	if (window.storageObj) {
		// override the default classes because audi's are hardcoded wrong
		this.setSubnavDisplayClasses("hidden", "visible");
		// new JSDO functions that will not exist in NavigationJSDO.js until republish
		if (!window.getNavigationId) {
			getNavigationId = new Function("pageName", "return pageNameToIdMap[pageName];");
		}
		if (!window.getPageName) {
			getPageName = new Function("navigationId", 
			"for (var node in pageNameToIdMap) {\
				if (pageNameToIdMap[node] == navigationId) return node;\
			}\
			return \"\";");
		}
	}
}
// Create flat "map" of NavItem objects for everything in the JSDO... Barbie sez: easy access rules.
MasterNavigation.prototype.flattenNavItems = function(data, index) {
	if (!data) return true;
	if (!index) var index = 0;
	for (var nothing in data) {
		if (this.depth < (index + 1)) this.depth = (index + 1);
		break;
	}
	for (var navId in data) {
		if (this.depth < (index + 1)) this.depth = (index + 1);
		this[navId] = new NavItem(navId, this.JSDO.getItemsInNode(data[navId]), index);
		this.flattenNavItems(data[navId], (index + 1));
	}
	return true;
}
MasterNavigation.prototype.clearActiveItems = function(startIndex) {
	for (var i=startIndex; i<this.activeItems.length; i++) {
		if (this.activeItems[i]) {
			this.activeItems[i].toggleSubnav(false);
			changeItemState(this.activeItems[i].id, "out");
			this.activeItems[i] = null;
		}
	}
}
MasterNavigation.prototype.resetActiveItems = function(newItem) {
	var parentList = this.JSDO.lookupPath(newItem.id);
	for (var i=0; i<parentList.length; i++) {
		if (this.activeItems[i] && (this.activeItems[i].id == parentList[i])) continue;
		if (this.activeItems[i]) var oldItemId = this.activeItems[i].id;
		this.activeItems[i] = this[parentList[i]];
		if (oldItemId) itemOutActions(oldItemId);
	}
	for (var j=parentList.length; j<this.activeItems.length; j++) this.activeItems[j] = null;
}
MasterNavigation.prototype.setActiveItems = function(itemId) {
	this.activeItems[this[itemId].hierarchyIndex] = this[itemId];
}
// enable/disable automatic load of the first subnav item's page when subnav is displayed
MasterNavigation.prototype.enableLoadDefaultItem = function() { this.autoDefaultItemClick = true; }
MasterNavigation.prototype.disableLoadDefaultItem = function() { this.autoDefaultItemClick = false; }
// edit the default class state suffixes applied to nav buttons, e.g. "navbg1Out", "navbg1On", "navbg1Over"
MasterNavigation.prototype.setClassStateSuffixes = function(outSuffix, onSuffix, overSuffix) {
	this.NAVIGATION_STATES["out"][0] = outSuffix;
	this.NAVIGATION_STATES["on"][0] = onSuffix;
	this.NAVIGATION_STATES["over"][0] = overSuffix;
}
// edit the default image state suffixes for nav img buttons, e.g. "HomePage_1.gif", "HomePage_1.live.gif", "HomePage_1.mo.gif"
MasterNavigation.prototype.setImageStateSuffixes = function(outSuffix, onSuffix, overSuffix) {
	this.NAVIGATION_STATES["out"][1] = outSuffix;
	this.NAVIGATION_STATES["on"][1] = onSuffix;
	this.NAVIGATION_STATES["over"][1] = overSuffix;
}
// edit the classes used to hide/show a subnav menu, e.g. "navHidden", "navVisible"
MasterNavigation.prototype.setSubnavDisplayClasses = function(hiddenClass, visibleClass) {
	this.SUBNAV_DISPLAY_CLASSES["hidden"] = hiddenClass;
	this.SUBNAV_DISPLAY_CLASSES["visible"] = visibleClass;
}
/** set direction that a vertical subnav will appear on mouseover - either over or below the main nav 
	legal values are 'up' or 'down'
*/
MasterNavigation.prototype.setSubnavDirection = function(pos){
	this.subnavDirection = pos;
}
MasterNavigation.prototype.getSubnavDirection = function(){
	return this.subnavDirection;
}


// Constructor for navigation items
function NavItem(id, subnavList, hierarchyIndex) {
	this.id = id;
	this.subnavList = subnavList;
	this.isSection = (this.subnavList.length) ? true : false;
	this.hierarchyIndex = hierarchyIndex;
	this.useImageButton = (document.images[this.id + "_button"]) ? true : false;
	this.style = null;
}
NavItem.prototype.activateSubnav = function() {
	this.toggleSubnav(true);
	if (!MasterNav.deeplinkPath && MasterNav.autoDefaultItemClick) {
		var defaultSubItem = document.getElementById(this.subnavList[0]);
		if (!defaultSubItem) return;
		var clickFunction = defaultSubItem.onclick;
		clickFunction.call();
	}
}
NavItem.prototype.deactivateSubnav = function() { this.toggleSubnav(false); }
NavItem.prototype.toggleSubnav = function(isShow) {
	try {
		var stateClass = (isShow) ? MasterNav.SUBNAV_DISPLAY_CLASSES["visible"] : MasterNav.SUBNAV_DISPLAY_CLASSES["hidden"];
		if (this.isSection) document.getElementById("subnav_" + this.id).className = stateClass;
		else document.getElementById("placeholder_" + (this.hierarchyIndex+1)).className = stateClass;
	} catch(err) { return; }
}
virtualClick = function(itemId) {
	MasterNav.deeplinkPath = MasterNav.JSDO.lookupPath(itemId);
	for (var i=0; i<MasterNav.deeplinkPath.length; i++) {
		var clickElement = document.getElementById(MasterNav.deeplinkPath[i]);
		if (clickElement) clickElement.onclick.call();
	}
	MasterNav.deeplinkPath = null;
}


// Utility functions
changeItemState = function(itemId, state) {
	if (MasterNav[itemId].useImageButton && (document.images[itemId + "_button"].src.indexOf(getPageName(itemId) + MasterNav.NAVIGATION_STATES[state][1] + ".gif") == -1)) {
		document.images[itemId + "_button"].src = getPageName(itemId) + MasterNav.NAVIGATION_STATES[state][1] + ".gif";
	}
	if (MasterNav[itemId].hasImages) {
		for (var imgName in MasterNav[itemId].imgMap) {
			try {
				document.images[imgName].src = MasterNav[itemId].imgMap[imgName] + MasterNav.NAVIGATION_STATES[state][1] + ".gif";
			} catch(err) { continue; }
		}
	}
	if (MasterNav[itemId].hasClasses) {
		for (var elementId in MasterNav[itemId].classMap) {
			try {
				document.getElementById(elementId).className = MasterNav[itemId].classMap[elementId] + MasterNav.NAVIGATION_STATES[state][0];
			} catch(err) { continue; }
		}
	}
}
itemOver = function(itemId, statusText) {
	if (window.event) window.event.cancelBubble = true;
	window.status = (statusText) ? statusText : "";
	if (!window.MasterNav || (MasterNav && !MasterNav[itemId])) return;
	if (MasterNav.activeItems[MasterNav[itemId].hierarchyIndex] && (MasterNav.activeItems[MasterNav[itemId].hierarchyIndex].id == itemId)) return;
	changeItemState(itemId, "over");
}
itemOut = function(itemId) {
	if (window.event) window.event.cancelBubble = true;
	window.status = "";
	if (!window.MasterNav || (MasterNav && !MasterNav[itemId])) return;
	if (MasterNav.activeItems[MasterNav[itemId].hierarchyIndex] && (MasterNav.activeItems[MasterNav[itemId].hierarchyIndex].id == itemId)) return;
	changeItemState(itemId, "out");
}
itemOn = function(itemId, subnavId) {
	if (window.event) window.event.cancelBubble = true;
	if (!window.MasterNav || (MasterNav && !MasterNav[itemId])) return;
	if (MasterNav.activeItems[MasterNav[itemId].hierarchyIndex] && (MasterNav.activeItems[MasterNav[itemId].hierarchyIndex].id == itemId)) return;
	MasterNav.clearActiveItems(MasterNav[itemId].hierarchyIndex);
	changeItemState(itemId, "on");
	MasterNav[itemId].activateSubnav(subnavId);
	MasterNav.setActiveItems(itemId);
}
setEvent = function(e) { window.e = e; }
loadPage = function(url, target) {
	if (isEditing) return false;
	if (window.overrideUrl) url = window.overrideUrl;
	if (!url) return;
	if (!target) var target = "content_win";
	if (target == "_new") var newwin = window.open(url, "", "");
	else document.getElementById(target).src = url;
	window.overrideUrl = null;
}
syncPage = function(someDoc) {
	var qsparms = getQueryStringParameters(someDoc);
	if (qsparms && qsparms["overrideUrl"]) window.overrideUrl = qsparms["overrideUrl"];
	if (!qsparms || (qsparms && !qsparms["pageName"])) virtualClick(MasterNav.JSDO.findFirstItem());
	if (qsparms && qsparms["pageName"]) {
		if (getNavigationId(qsparms["pageName"])) virtualClick(getNavigationId(qsparms["pageName"]));
		else loadPage();
	}
}
getQueryStringParameters = function(someDoc) {
	if (!someDoc) var someDoc = document;
	var thisqs = someDoc.location.search.substring(1, someDoc.location.search.length);
	if (thisqs.length > 0) {
		var qspairs = thisqs.split("&");
		var qsparms = new Array();
		for (var i=0; i<qspairs.length; i++) {
			var regexp = /\+/g;
			if (!qspairs[i]) continue;
			var qskey = unescape((qspairs[i].split("=")[0]).replace(regexp, " "));
			var qsval = unescape((qspairs[i].split("=")[1]).replace(regexp, " "));
			if (qsparms[qskey] && (qsparms[qskey] == qsval)) continue;
			if (!qsparms[qskey]) {
				qsparms[qskey] = qsval;
				continue;
			}
			if (typeof qsparms[qskey] == "string") qsparms[qskey] = [qsparms[qskey], qsval];
			else qsparms[qskey][qsparms[qskey].length] = qsval;
		}
		return qsparms;
	}
	return null;
}
