






// 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({"ec2edc009a69100481c000145efa6b30":{},"ebd3b0289a691004819a00145efa6b30":{"ec2c8e289a69100481a000145efa6b30":{},"ec2c8e289a69100481a400145efa6b30":{},"ec2c8e289a69100481a100145efa6b30":{},"ec2c8e289a69100481a200145efa6b30":{},"ec2c8e289a69100481a300145efa6b30":{},"ec2c8e289a69100481a600145efa6b30":{}},"ebd3b0289a691004819b00145efa6b30":{"ec2d9bb09a69100481a800145efa6b30":{},"ec2d9bb09a69100481aa00145efa6b30":{},"ec2d9bb09a69100481a900145efa6b30":{}},"ebd3b0289a691004819c00145efa6b30":{"ec2de2009a69100481b000145efa6b30":{},"ec2de2009a69100481aa00145efa6b30":{},"ec2de2009a69100481ae00145efa6b30":{},"ec2de2009a69100481ab00145efa6b30":{},"ec2de2009a69100481ac00145efa6b30":{}},"ebd3b0289a691004819d00145efa6b30":{"ec2e20809a69100481b000145efa6b30":{},"ec2e20809a69100481b300145efa6b30":{},"ec2e20809a69100481b400145efa6b30":{},"ec2e20809a69100481b200145efa6b30":{}},"ebd3b0289a691004819e00145efa6b30":{"ec2e53489a69100481b800145efa6b30":{},"ec2e53489a69100481ba00145efa6b30":{},"ec2e53489a69100481b400145efa6b30":{},"ec2e53489a69100481b600145efa6b30":{},"ec2e53489a69100481b500145efa6b30":{},"ec2e53489a69100481b900145efa6b30":{}},"ebd3b0289a691004819f00145efa6b30":{"ec2e99989a69100481bc00145efa6b30":{},"ec2e99989a69100481bb00145efa6b30":{},"ec2e99989a69100481bd00145efa6b30":{}},"ebd3b0289a69100481a000145efa6b30":{}});

pageNameToIdMap = {"PreOwnedVehicleSearch_1":"ec2c8e289a69100481a400145efa6b30","custom.navbfb660306990100485520003ba77f966":"ec2e99989a69100481bc00145efa6b30","custom.nav516832d89a0610048b9e10145efa6b30":"ec2e20809a69100481b200145efa6b30","FinancePreQualForm_1":"ec2de2009a69100481ae00145efa6b30","custom.nav1450bd808ef2100485fa00145edefa37":"ebd3b0289a691004819b00145efa6b30","custom.navaa02edf88ef210048fb500145edef087":"ec2d9bb09a69100481a900145efa6b30","ServiceSection":"ebd3b0289a691004819d00145efa6b30","custom.nav1450bd808ef2100485f900145edefa37":"ec2d9bb09a69100481a800145efa6b30","Welcome_1":"ec2e53489a69100481b800145efa6b30","KelleyBlueBook_1":"ec2c8e289a69100481a200145efa6b30","AboutSection":"ebd3b0289a691004819e00145efa6b30","custom.navbdd17b606990100485210003ba77f966":"ec2e20809a69100481b400145efa6b30","ContactUsForm_1":"ec2e53489a69100481b500145efa6b30","MeetOurDepartments_1":"ec2e53489a69100481b600145efa6b30","PaymentCalculator_1":"ec2de2009a69100481b000145efa6b30","custom.nav64458e38699f1004843e0003ba77890f":"ec2de2009a69100481aa00145efa6b30","custom.nav0c46cd08768510048aff0003ba77890f":"ec2e99989a69100481bd00145efa6b30","custom.nav099f53b8768510048aff0003ba77890f":"ec2e53489a69100481b900145efa6b30","NewVehicleSearch_1":"ec2c8e289a69100481a000145efa6b30","ServiceApptForm_1":"ec2e20809a69100481b000145efa6b30","custom.nav18a5c7908ef21004865600145edefa37":"ec2d9bb09a69100481aa00145efa6b30","FinanceSection":"ebd3b0289a691004819c00145efa6b30","VehiclesSection":"ebd3b0289a691004819a00145efa6b30","custom.nav6cda39108239100489370003ba703341":"ec2de2009a69100481ac00145efa6b30","custom.navc50293b06990100485750003ba77f966":"ec2e99989a69100481bb00145efa6b30","NewModelsPage_1":"ec2c8e289a69100481a100145efa6b30","HoursAndDirections_1":"ec2e53489a69100481b400145efa6b30","HomePage_1":"ec2edc009a69100481c000145efa6b30","custom.nav21f2de288ef21004865600145edefa37":"ec2c8e289a69100481a300145efa6b30","CustomerSupport_1":"ec2e53489a69100481ba00145efa6b30","PartsOrderForm_1":"ec2e20809a69100481b300145efa6b30","LeasevsFinance_1":"ec2de2009a69100481ab00145efa6b30","custom.nav238745808ef21004865600145edefa37":"ec2c8e289a69100481a600145efa6b30","custom.navbfb660306990100485530003ba77f966":"ebd3b0289a691004819f00145efa6b30"};

// 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];
}

