






// Boolean: false if Object contains nothing but undefined or null
hasNodes = function(obj) {
	for (node in obj) {
		if ((null == node) || (undefined == node)) continue;
		return true;
	}
	return false;
}
// Object: concats a list of Objects
joinObjects = function() {
	var newObj = {};
	var objectList = new Array();
	if (!arguments.length) return newObj;
	if ((arguments.length == 1) && arguments[0].length) objectList = arguments[0];
	if (!arguments[0].length) objectList = arguments;
	for (var i=0; i<objectList.length; i++) {
		for (var item in objectList[i]) newObj[item] = objectList[i][item];
	}
	return newObj;
}
// Number: the number of items at one level of an object
getItemCount = function(data) {
	if (arguments.length == 0) return;
	var i = 0;
	for (var node in data) i++;
	return i;
}


// Constructor for nav data object
function NavigationJSDO(data) { this.data = data; }

// Array: retrieve list of items in one node of navigation (e.g. one main section's subnav items)
NavigationJSDO.prototype.getItemsInNode = function(node) {
	if (!arguments.length && !node) var node = this.data;
	var itemList = new Array();
	for (var navItem in node) itemList[itemList.length] = navItem;
	return itemList;
}
// Array: retrieve list of items in every node on one level of navigation (e.g. all main sections' subnav items)
NavigationJSDO.prototype.getItemsAtLevel = function(targetLevel, node, atLevel) {
	if (!arguments.length) var targetLevel = 1;
	if ((arguments.length < 2) && !node) var node = this.data;
	if (arguments.length < 3) var atLevel = 0;
	var itemList = new Array();
	if (atLevel == (targetLevel - 1)) {
		for (var branch in node) itemList[itemList.length] = branch;
	} else {
		for (var branch in node) itemList = itemList.concat(this.getItemsAtLevel(targetLevel, node[branch], (atLevel + 1)));
	}
	return itemList;
}
// Array: hierarchical list of any parent ids up to and including the given id
NavigationJSDO.prototype.lookupPath = function(id, data) {
	if (arguments.length == 1) var data = this.data;
	if (!data) return [];
	if (data[id]) return [id];
	for (var node in data) {
		var pathList = this.lookupPath(id, data[node]);
		if (pathList.length) return [node].concat(pathList);
	}
	return [];
}
// String: finds first item in a node that does not have subnodes
NavigationJSDO.prototype.findFirstItem = function(data) {
	if (arguments.length == 0) var data = this.data;
	for (var node in data) {
		if (hasNodes(data[node])) return this.findFirstItem(data[node]);
		else return node;
	}
	return "";
}

NavJSDO = new NavigationJSDO({"ab0dbf8891691004817600145edef087":{},"aaf0b5f091691004815a00145edef087":{"ab092ba891691004815f00145edef087":{},"ab092ba891691004816200145edef087":{},"ab092ba891691004816000145edef087":{},"ab092ba891691004816300145edef087":{},"ab092ba891691004816100145edef087":{},"ab092ba891691004815e00145edef087":{}},"aaf0b5f091691004815b00145edef087":{"ab0a930891691004816a00145edef087":{},"ab0a930891691004816d00145edef087":{},"ab0a930891691004816400145edef087":{},"ab0a930891691004816b00145edef087":{},"ab0a930891691004816e00145edef087":{},"ab0a930891691004816500145edef087":{},"ab0a930891691004816700145edef087":{},"ab0a930891691004816300145edef087":{},"ab0a930891691004816c00145edef087":{},"ab0a930891691004816800145edef087":{},"ab0a930891691004816900145edef087":{}},"aaf0b5f091691004815c00145edef087":{"ab0c0df091691004816f00145edef087":{},"ab0c0df091691004816e00145edef087":{},"ab0c0df091691004817000145edef087":{}},"aaf0b5f091691004815d00145edef087":{"ab0cf85091691004817200145edef087":{},"ab0cf85091691004817000145edef087":{},"ab0cf85091691004817100145edef087":{}},"aaf0b5f091691004815e00145edef087":{},"ab0dbf8891691004817500145edef087":{}});

pageNameToIdMap = {"PreOwnedVehicleSearch_1":"ab0a930891691004816d00145edef087","NewModelsPage_3":"ab0a930891691004816300145edef087","QuickQuoteForm_1":"ab0a930891691004816b00145edef087","FinancePreQualForm_1":"ab0c0df091691004816f00145edef087","Employment_1":"ab092ba891691004815e00145edef087","ServiceSection":"aaf0b5f091691004815d00145edef087","Welcome_1":"ab092ba891691004815f00145edef087","PrivacyPolicy_1":"ab0dbf8891691004817500145edef087","NewModelsPage_5":"ab0a930891691004816900145edef087","AboutSection":"aaf0b5f091691004815a00145edef087","ContactUsForm_1":"ab092ba891691004816100145edef087","MeetOurDepartments_1":"ab092ba891691004816000145edef087","PaymentCalculator_1":"ab0c0df091691004816e00145edef087","custom.nav829056d0871c1004826b0003ba77890f":"ab0a930891691004816400145edef087","CorporateIncentives_1":"ab0a930891691004816500145edef087","NewVehicleSearch_1":"ab0a930891691004816a00145edef087","ServiceApptForm_1":"ab0cf85091691004817200145edef087","FinanceSection":"aaf0b5f091691004815c00145edef087","VehiclesSection":"aaf0b5f091691004815b00145edef087","NewModelsPage_4":"ab0a930891691004816700145edef087","NewModelsPage_1":"ab0a930891691004816800145edef087","HomePage_1":"ab0dbf8891691004817600145edef087","HoursAndDirections_1":"ab092ba891691004816300145edef087","AdWizardMainMenu_1":"ab0a930891691004816e00145edef087","CustomerSupport_1":"ab092ba891691004816200145edef087","LeasevsFinance_1":"ab0c0df091691004817000145edef087","PartsOrderForm_1":"ab0cf85091691004817000145edef087","NewModelsPage_2":"ab0a930891691004816c00145edef087","CorporateCoupons_1":"ab0cf85091691004817100145edef087"};

// String: pageName for given id
pageNameToIdMap.reverseLookup = function(id) {
	for (var node in this) {
		if (this[node] == id) return node;
	}
	return "";
}
// String: pageName in pageNameToIdMap for given navigationId
getPageName = function(navigationId) {
	for (var node in pageNameToIdMap) {
		if (pageNameToIdMap[node] == navigationId) return node;
	}
	return "";
}
// String: navigationId in pageNameToIdMap for given pageName
getNavigationId = function(pageName) {
	return pageNameToIdMap[pageName];
}

