/*
Automated Navigation Script
Version: 0.9.5.2 BETA
*/

/*function init()
{
	document.getElementById('navCell').innerHTML = createNavBar();
		
	if(document.title == 'Visual Rivet Studios™') {
		document.getElementById('banner').innerHTML = "Visual Rivet Studios™&nbsp;";
	} else {
		document.getElementById('banner').innerHTML = document.title + "&nbsp;";
	}
}*/

//Functions to create a nav bar
function createNavBar(filePath, id) {
	var navBar = getPagesFromFileWithOptions(filePath, id);
	return createNavBarCode(navBar);
}

function createNavBarWithOptions(filePath, id, cssClass, type, separator, inline, mode, levels) {
	//Need to redesign this method
	var navBar = getPagesFromFileWithOptions(filePath, id);
	if(cssClass != null) navBar.cssClass = cssClass;
	if(separator != null) navBar.separator = separator;
	if(inline != null) navBar.inline = inline;
	if(type != null) navBar.type = type;
	if(mode != null) navBar.mode = mode;
	if(levels != null) navBar.levels = levels;
	
	return createNavBarCode(navBar);
}

function createButton(title, url) {	
	return "<ul>" + createButtonWithOptions(title, url, null, null, null, null, null, 0) + "</ul>";
}

function createNavBarFromFolderWithOptions(folder, id, cssClass, levels, includeExt, excludeExt, inline) {
	alert("This method has not been implemented");
	/*var url = "pageNav.php?url=" + folder + "&id=" + id + "&class=" + cssClass + "&type=" + "folder";
	levels != null ? url += "&levels=" + levels;
	if(includeExt != null) {
		url += "&includeExt=" + includeExt;
	}
	if(excludeExt != null) {
		url += "&excludeExt=" + excludeExt;
	}
	if(inline != null) {
		url += "&inline=" + inline;
	}
	xmlHttp = getXmlHttpObject();
	xmlHttp.open("GET", url, false);
	xmlHttp.send(null);
	return xmlHttp.responseText;*/
}


//Class Definitions
function Website(siteMap, navBars) {
	this.siteMap = siteMap;
	this.navBars = navBars;
}

function SiteMap(pages) {
	this.pages = pages;
}

function NavBar(id, cssClass, separator, inline, type) {
	this.pages = null;
	this.id = id;
	this.cssClass = cssClass;
	this.type = type
	this.separator = separator;
	this.inline = inline;
}

function Page(title,url,subMenu,before,after,liStyle,aStyle) {
	this.title = title;
	this.url = url;
	this.subMenu = subMenu;
	this.before = before;
	this.after = after;
	this.liStyle = liStyle
	this.aStyle = aStyle;
}



//File Access Functions
function getPagesFromFileWithOptions(filePath, navBarId) {
	//Open the xml file
	var xmlDoc = getXmlFile(filePath);
  	if(xmlDoc == null) {
  		return;
  	}
  	
	var navBarNodes = xmlDoc.getElementsByTagName("NavigationBar");
	if(navBarNodes == null) {
		navBarNodes = xmlDoc.getElementsByTagName("*");
	}
	if(navBarNodes == null) {
		return;
	}
	
	//Find the correct nav bar node
	var navBarNode = null;
	for(var i = 0; i < navBarNodes.length; i++) {
		if(navBarNodes[i].getAttribute("id") == navBarId) {
			navBarNode = navBarNodes[i];
			break;
		}
	}
	if(navBarNode == null) {
		return;
	}
	
	return createNavBarObjectFromNode(xmlDoc, navBarNode);
}

function createNavBarObjectFromNode(xmlDoc, navBarNode) {	
	//Default Values
	var levels = 0;
	
	//Create nav bar object
	var navBar = new NavBar(navBarNode.getAttribute("id"), navBarNode.getAttribute("class"), navBarNode.getAttribute("separator"), navBarNode.getAttribute("inline"), navBarNode.getAttribute("type"));
	navBarNode.getAttribute("levels") != null ? levels = navBarNode.getAttribute("levels") : levels = 0;
	if(navBar.type == "siteMap") {
		navBarNode = xmlDoc.getElementsByTagName("SiteMap")[0];
	}
	
	var pages;
	if(navBar.type == "auto") {
		//Pull attributes from that nav bar element
		var mode = navBarNode.getAttribute("mode");
		
		//Find the page element in the site map matching the current page
		var siteMapNode = xmlDoc.getElementsByTagName("SiteMap")[0];
		var currentPage;
		if(document.location.pathname.lastIndexOf("/") < document.location.pathname.length - 1) {
			currentPage = document.location.pathname.substring(document.location.pathname.lastIndexOf("/") + 1);
		} else {
			currentPage = "";
		}
		
		var currentPageNode;
		var nodes = siteMapNode.getElementsByTagName("Page");
		for(var i = 0; i < nodes.length; i++) {
			var pageNode = nodes[i];
			if(pageNode.getAttribute("url") == currentPage || pageNode.getAttribute("url").match(/(index\.(htm1?|aspx?|php)|default\.(html?|aspx?|php))/)) {
				currentPageNode = pageNode;
			}
		}
		if(currentPageNode == null) {
			return;
		}
		
		//Get a node list of pages to include in the nav bar
		var navBarPages;
		if(mode.match("parent")) {
			if(currentPageNode.parentNode.nodeName != "SiteMap") {
				navBarPages = currentPageNode.parentNode.parentNode;
			}
		} else if(mode.match("sibling")) {
			navBarPages = currentPageNode.parentNode;
		} else if(mode.match("children")) {
			if(currentPageNode.childNodes != null && currentPageNode.childNodes.length > 0) {
				navBarPages = currentPageNode;
			}
		} else if(mode.match("topLevel")) {
			navBarPages = siteMapNode;
		} else if(mode.match("firstLevel")) {
			if(siteMapNode.childNodes != null && siteMapNode.childNodes.length > 0) {
				navBarPages = siteMapNode.childNodes[0];
			}
		} else {
			navBarPages = siteMapNode;
		}
		if(navBarPages == null) {
			return;
		}
		
		//Create pages array
		pages = createMenuArray(navBarPages.childNodes, levels, 1);
	} else if(navBar.type == "folder") {
		//alert(getFolderNavBarXml(navBarNode.getAttribute('folder')).getElementsByTagName('Page'));
		pages = createMenuArray(getFolderNavBarXml(navBarNode.getAttribute('folder'), levels, navBarNode.getAttribute('includeExt'), navBarNode.getAttribute('excludeExt')).getElementsByTagName('NavigationBar')[0].childNodes, levels, 1);
	} else {
		//Create pages array
		pages = createMenuArray(navBarNode.childNodes, levels, 1);
	}
	
	navBar.pages = pages;
	//alert(debugArray(pages));
	return navBar;
}


function getXmlFile(filePath) {
	var xmlDoc = null;
	if (window.XMLHttpRequest) {
  		var xmlDocu=new window.XMLHttpRequest();
  		xmlDocu.open("GET", filePath, false);
  		xmlDocu.send("");
  		xmlDoc = xmlDocu.responseXML;
  	} else if(window.ActiveXObject) {
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async=false;
		xmlDoc.load(filePath);
	} else if(document.implementation && document.implementation.createDocument) {
		xmlDoc=document.implementation.createDocument("","",null);
		xmlDoc.async=false;
		try {
			xmlDoc.load(filePath);
		} catch(e) {
			alert(e.message);
		}
	} else {
  		alert("Error running scripts");
  	}
	return xmlDoc;
}

function getXmlHttpObject()
{
if (window.XMLHttpRequest)
  {
  // code for IE7+, Firefox, Chrome, Opera, Safari
  return new XMLHttpRequest();
  }
if (window.ActiveXObject)
  {
  // code for IE6, IE5
  return new ActiveXObject("Microsoft.XMLHTTP");
  }
return null;
}

function getFolderNavBarXml(folder, levels, includeExt, excludeExt) {
	var url = "folder.php?folder=" + folder;
	if(levels != null) url += "&levels=" + levels;
	url += "&includeExt=" + (includeExt != null ?  includeExt : "*");
	url += "&excludeExt=" + (excludeExt != null ?  excludeExt : "*");
	if(excludeExt != null) {
		//url += "&excludeExt=" + excludeExt;
	}
	
	//alert(url);
	
	xmlHttp = getXmlHttpObject();
	xmlHttp.open("GET", url, false);
	xmlHttp.send(null);
	return xmlHttp.responseXML;
}


//Convert the xml node list to an array of page objects
function createMenuArray(nodeList, levels, depth) {
	var pagesArray = new Array();
	for(var i = 0; i < nodeList.length; i++) {
		var page = nodeList[i];
		if(page.nodeType != 3) {
			var subMenu;
			//alert("depth: " + depth + " levels: " + levels);
			if((levels == 0 || (depth < levels)) && page.hasChildNodes()) {
				var subMenuNodes = page.childNodes;
				subMenu = createMenuArray(subMenuNodes, levels, (depth + 1));
			}
			pagesArray.push(new Page(page.getAttribute("title"), page.getAttribute("url"), subMenu, page.getAttribute("before"), page.getAttribute("after"), page.getAttribute("liStyle"), page.getAttribute("aStyle")));
			subMenu = null;
		}
	}
	return pagesArray;
}

function debugArray(array) {
	//alert("test");
	var debugString = "";
	for(var i = 0; i < array.length; i++) {
		var page = array[i];
		debugString += 'Page: title="' + page.title + '" url="' + page.url + '" subMenu="' + page.subMenu + '" before="' + page.before + '" after="' + page.after + '" liStyle="' + page.liStyle + '" aStyle="' + page.aStyle + '"\n';
		if(page.subMenu != null) {
			debugString += debugArray(page.subMenu);
		}
	}
	return debugString;
}

//Helper Functions
function createNavBarCode(navBar) {
	var navCode = "";
	
	if(navBar == null || navBar.pages == null || navBar.cssClass == null || (navBar.type != "siteMap" && navBar.id == null)) {
		return "";
	}
	var pages = navBar.pages;
	var separator = navBar.separator;
	var inline = navBar.inline;
	
	navCode += '<div id="' + navBar.id + '" class="' + navBar.cssClass + '"><ul>';
	for(var i = 0; i < pages.length; i++) {
		var depth = 0;
		//Create a button
		navCode += createButtonWithOptions(pages[i].title, pages[i].url, pages[i].subMenu, pages[i].before, pages[i].after, pages[i].liStyle, pages[i].aStyle, inline, depth);
		
		//Create a separator if needed
		if(separator != null && (i != (pages.length - 1))) {
			navCode += '<li>' + separator + "</li>";
		}
	}
	navCode += '</ul></div>';
	//alert(navCode);
	return navCode;
}

function createSubMenu(subMenu, inline, depth) {
	var subMenuCode = "";
	depth++;
	subMenuCode += '<ul>';

	for(var i = 0; i < subMenu.length; i++) {
		subMenuCode += createButtonWithOptions(subMenu[i].title, subMenu[i].url, subMenu[i].subMenu, subMenu[i].before, subMenu[i].after, subMenu[i].liStyle, subMenu[i].aStyle, inline, depth);
	}
	subMenuCode += '</ul>';
	return subMenuCode;
}

function createButtonWithOptions(title, url, subMenu, before, after, liStyle, aStyle, inline, depth) {
	var buttonCode = '';
	var currentPage;
	if(document.location.pathname.lastIndexOf("/") < document.location.pathname.length - 1) {
		currentPage = document.location.pathname.substring(document.location.pathname.lastIndexOf("/") + 1);
	} else {
		currentPage = "";
	}
	var selectedButton = false;
	if(url != null && ((currentPage == url) || (currentPage.length == 0 && url.match(/(index\.(htm1?|aspx?|php)|default\.(html?|aspx?|php))/)))) {
		selectedButton = true;
	}
	
	//Insert Content Before Button
	if(before != null) {
		buttonCode += before;
	}
	
	//Create the button holder
	buttonCode += '<li';
	//Add a custom style to the a tag
	if(liStyle != null) {
		buttonCode += ' style="' + liStyle + '"';
	}

	if(selectedButton == true) {
		buttonCode += ' class="selected"';
	}
	if (inline == "true") {
		//buttonCode += ' onclick="toggleSubMenu(this)"';
		buttonCode += ' onclick="$(this).toggleClass(\'hoverClass\');"';
		if(depth >= 1) {
			buttonCode += ' onmouseover="$(this).addClass(\'hoverClass\');" onmouseout="$(this).removeClass(\'hoverClass\');"';
		}
	}
	
	if(inline != "true" && (navigator.userAgent.match("MSIE 6.0") || navigator.userAgent.match("MSIE 7.0"))) {
		//buttonCode += ' onmouseover="$(this).addClass(\'hoverClass\');" onmouseout="$(this).removeClass(\'hoverClass\');"';
		buttonCode += ' onmouseover="$(\'>ul\', this).css(\'left\', \'auto\');$(\'>ul\', this).css(\'z-index\', 500);"';
		//buttonCode += ' onmouseout="$(\'>ul\', this).css(\'left\', \'-1999px\');$(\'>ul\', this).css(\'z-index\', \'auto\');"';
	} 
	buttonCode += '>';
	
	//buttonCode += '<span onclick="$(this).parent().toggleClass(\'hoverClass\');">+</span>';
	
	//Create the button link
	if(selectedButton == true) {
		buttonCode += '<a class="activeButton"';
	} else {
		buttonCode += '<a';
	}
	
	//Add a link
	if(url != null) {
		buttonCode += ' href="' + url + '"';
	}
	//Add a custom style to the a tag
	if(aStyle != null) {
		buttonCode += ' style="' + aStyle + '"';
	}
	buttonCode += '>' + title + '</a>';
	//Create a submenu if needed
	if(subMenu != null) {
		buttonCode += createSubMenu(subMenu, inline, depth);
	}
	buttonCode += '</li>';
	
	//Insert Content After Button
	if(after != null) {
		buttonCode += after;
	}
	
	return buttonCode;
}


//Runtime Submenu Functions
function showSubMenu(id)
{
	$(id).addClass('hoverClass');
	//alert(id.nodeName + ' in ' + id.getElementsByTagName('a')[0].innerText);
	//id.style.display = "block";
	
	//id.className += " hoverClass";
}

function hideSubMenu(id)
{
	$(id).removeClass('hoverClass');
	//alert(id.nodeName + ' out ' + id.getElementsByTagName('a')[0].innerText);
	//id.style.display = "none";
	
	//id.className += id.className.replace(new RegExp(" hoverClass\\b"), "");
}

function toggleSubMenu(id) {
	/*var debug = "Tag Name: " + id.nodeName + "\n";
	for( var i = 0; i < id.childNodes.length; i++) {
		debug += "\tNum: " + i + " Tag Name" + id.childNodes[i].nodeName + " Object: " + id.childNodes[i] + "\n";
	}
	alert(debug);*/
	
	$(id).toggleClass('hoverClass');
	
	/*var subMenuUl = id.getElementsByTagName('ul')[0];
	//alert(subMenuUl);
	if(typeof(subMenuUl) != 'undefined' && typeof(subMenuUl.style) != 'undefined' && typeof(subMenuUl.style.display) != 'undefined') {
		if(subMenuUl.style.display == "block") {
			subMenuUl.style.display = "none";
		} else {
			subMenuUl.style.display = "block";
		}
	}*/
}

function addJavascriptMenuToggle(container) {
	if(container) {
		$("li", container).hover(
			function() {
				//showSubMenu(this);
				//$(this).addClass('hoverClass');
				$('> ul', this).css('left', 'auto');
				$('> ul', this).css('z-index', 500);
			},
			function() {
				//hideSubMenu(this);
				//$(this).removeClass('hoverClass');
				$('> ul', this).css('left', '-1999px');
				$('> ul', this).css('z-index', 'auto');
			}
		);
	} else {
		//alert("Error adding javascript to navigation menu");
	}
}

/*function addJavascriptMenuToggle(container) {
	//var list = document.getElementById(container).getElementsByTagName('li');
	if(container) {
		var list = container.getElementsByTagName('li');
		
		for(var i=0; i<list.length; i++) {
			list[i].onmouseover = function() {
				//showSubMenu(this);
				//$(this).addClass('hoverClass');
				$("> ul", this).css('left', 'auto');
				$("> ul", this).css('z-index', 500);
			}
			list[i].onmouseout = function() {
				//hideSubMenu(this);
				//$(this).removeClass('hoverClass');
				$("> ul", this).css('left', '-1999px');
				$("> ul", this).css('z-index', 'auto');
			}
		} 
	} else {
		//alert("Error adding javascript to navigation menu");
	}
}*/

function addJqueryMenuToggle(container) {
	if(container) {
		$("li", container).hover(
			function() {				
				$("ul:first", this).animate({width: 'show'}, '400');
				//$("ul:first", this).show('slow');
			},
			function() {
				//$("ul:first", this).animate({width: 'hide'}, '400');
				$("ul:first", this).hide();
			}
		);				
	} else {
		//alert("Error adding javascript to navigation menu");
	}
}

