SevenTides.NaySys = function(aData, optionalParent) {
	var INDEX_REGEXP = new RegExp('/(index.html|index.htm|index.php|index.asp)$');
	var NAV_TYPES = {
		MAIN_NAV: 'main-nav',
		FOOT_NAV: 'foot-nav'
	}
	var ROOT_NODE = aData[0];
	var PAGE_PATH = optionalParent || location.pathname.replace(new RegExp('^' + ROOT_NODE.path), '').replace(INDEX_REGEXP, '/');
	if (getNode(ROOT_NODE, PAGE_PATH + location.search)) PAGE_PATH = PAGE_PATH + location.search;
	var PAGE_NODE = getNode(ROOT_NODE, PAGE_PATH);
	var PAGE_ROUTE = getRoute(ROOT_NODE, PAGE_PATH);
/*
				<li id='nav-4' class="nav-item">
					<a href='#' class="last">News Center</a>
					<ul class="subnav">
						<li class="subnav-item"><a href='#'>sub nav 9</a></li>
						<li class="subnav-item"><a href='#'>sub nav 8</a></li>
						<li class="subnav-item"><a href='#'>sub nav 7</a></li>
						<li class="subnav-item"><a href='#'>sub nav 6</a></li>
					</ul>
				</li>

				<li class='sidenav-item opened'>
					<a href='#'>sub section 03</a>
					<ul class='subnav'>
						<li class='subnav-item'><a href='#'>tertiary section 01</a></li>
						<li class='subnav-item selected'><a href='#'>tertiary section 02</a></li>
						<li class='subnav-item'><a href='#' class='last'>tertiary section 03</a></li>
					</ul>
				</li>
*/
	var HTML = {
		MainNavItem: "<li id='{id}' class='nav-item {on}'><a href='{url}' class='{position}'>{label}</a>{subnavHTML}</li>",
		SubNav: "<ul class='subnav'>{subnavItemsHTML}</ul>",
		SubNavItems: "<li class='subnav-item {selected}'><a href='{url}' class='{position}'>{label}</a></li>",
		
		FootNavItem: "<li class='footnav-item'><a href='{url}' class='{position}'>{label}</a></li>",
		
		SideNavItem: "<li class='sidenav-item {opened} {selected}'><a href='{url}'>{label}</a>{subnavHTML}</li>"
	}
	
	function getNode(startNode, findPath) {
		if (startNode.children) {
			for (var i=0, len=startNode.children.length; i<len; i++) {
				var currentNode = startNode.children[i];
				var foundNode = getNode(currentNode, findPath);
				if (foundNode) return foundNode;
			}
		}
		if (startNode.path.toLowerCase() == findPath.toLowerCase()) return startNode;
	}
	
	function getRoute(startNode, findPath) {
		if (startNode.children) {
			for (var i=0, len=startNode.children.length; i<len; i++) {
				var currentNode = startNode.children[i];
				var foundRoute = getRoute(currentNode, findPath);
				if (foundRoute) return [currentNode].merge(foundRoute);
			}
		}
		if (startNode.path.toLowerCase() == findPath.toLowerCase()) return [startNode];
	}
	
	function getMainNavHTML() {
		var aMainNavNodes = ROOT_NODE.children.find(function() { return this.type && this.type == NAV_TYPES.MAIN_NAV; });
		var sHTML = '';
		aMainNavNodes.each(function(ar, index) {
			if (!this.type || this.type != NAV_TYPES.MAIN_NAV) return;
			var MAINNAV_NODE = this;
			var subnavHTML = '';
			if (this.children) {
				var subnavItemsHTML = '';
				this.children.each(function() {
					var SUBNAV_NODE = this;
					if (MAINNAV_NODE.path == SUBNAV_NODE.path) return;
					subnavItemsHTML += HTML.SubNavItems.supplant({ selected: '', url: ROOT_NODE.path + SUBNAV_NODE.path, position: '', label: SUBNAV_NODE.label });
				});
				subnavHTML = (subnavItemsHTML == '')? '' : HTML.SubNav.supplant({subnavItemsHTML: subnavItemsHTML});
			}
			var position = (index == ar.length - 1)? 'last' : '';
			sHTML += HTML.MainNavItem.supplant({id: 'nav-' + (index+1), on: (PAGE_ROUTE && PAGE_ROUTE[0] == MAINNAV_NODE)? 'on': '', url: ROOT_NODE.path + this.path, position: position, label: this.label, subnavHTML: subnavHTML});
		});
		return sHTML;
	}
	
	function getFootNavHTML() {
		var aFootNavNodes = ROOT_NODE.children.find(function() { return this.type && this.type == NAV_TYPES.FOOT_NAV; });
		var sHTML = '';
		aFootNavNodes.each(function(ar, index) {
			var position = (index == 0)? 'first' : '';
			position += (index == ar.length - 1)? ' last': '';
			sHTML += HTML.FootNavItem.supplant({url: ROOT_NODE.path + this.path, position: position, label: this.label});
		});
		return sHTML;
	}
	
	function getSideNavHTML() {
		var aSideNavNodes = PAGE_ROUTE[0].children;
		var sHTML = '';
		aSideNavNodes.each(function() {
			var SIDENAV_NODE = this;
			var subnavHTML = '';
			if (this.children) {
				var subnavItemsHTML = '';
				this.children.each(function(ar, index) {
					var SUBNAV_NODE = this;
					var position = ( index == ar.length - 1)? 'last' : '';
					var selected = (PAGE_NODE == SUBNAV_NODE)? 'selected' : '';
					subnavItemsHTML += HTML.SubNavItems.supplant({selected: selected, url: ROOT_NODE.path + SUBNAV_NODE.path, position: position, label: SUBNAV_NODE.label});
				});
				subnavHTML = (subnavItemsHTML == '')? '' : HTML.SubNav.supplant({subnavItemsHTML: subnavItemsHTML});
			}
			var opened = (PAGE_ROUTE.indexOf(SIDENAV_NODE) > -1 && SIDENAV_NODE != PAGE_NODE)? 'opened' : '';
			var selected = (SIDENAV_NODE == PAGE_NODE)? 'selected' : '';
			sHTML += HTML.SideNavItem.supplant({opened: opened, selected: selected, url: ROOT_NODE.path + this.path, label: this.label, subnavHTML: subnavHTML});
		});
		return sHTML;
	}
	
	this.init = function(containers) {
		if (containers.mainnav) {
			$(containers.mainnav).innerHTML += getMainNavHTML();
		}
		if (containers.footnav) {
			$(containers.footnav).setHTML(getFootNavHTML());
		}
		if (containers.sidenav) {
			$(containers.sidenav).setHTML(getSideNavHTML());
		}
	}
}