var isDOM;
if(document.createElement && document.createTextNode && document.getElementsByTagName && document.getElementById) {
	isDOM=true;
}

// onLoad

window.onload = bodyOnLoad;

function bodyOnLoad( ) {
	if(isDOM===true) {
		document.body.appendChild(rightDIV);
		siteNavObj.makeMenu( );
		pageNavObj.makeMenu( );
		otherNavObj.makeMenu( );
		if(document.getElementById("homer")) {
			document.getElementById("content").removeChild(document.getElementById("homer"));
		}
		dateModAdder( );
		ieFixed( );
	}
}

rightDIV=builder("div","id*rightnavigation","className*navigationcontainer");

// Browser Sniffer

agt=navigator.userAgent.toLowerCase( );
var gecko;
var ie5;
var ie6;
if(agt.indexOf("opera")==-1 && agt.indexOf("amiga")==-1) {
	if(agt.indexOf("msie 5.")!=-1) {
		ie5=true;
	}
	if(agt.indexOf("msie 6.")!=-1) {
		ie6=true;
	}
	if(agt.indexOf("gecko")!=-1) {
		gecko=true;
	}
}

// CSS Hack to Allow IE6 position:fixed Emulation 

function ieFixed( ){
	if(ie6===true) {
		document.styleSheets[0].addRule("html","overflow: hidden;");
		document.body.style.overflow="auto";
		document.body.style.height=100+"%";
		document.body.style.margin=0;
		document.body.style.padding=0;
	}	
}

// Builder Functions

// Build Elements

function builder(element) {
		var el=document.createElement(element);
		if(typeof el!="undefined") {
			var argLength=arguments.length;
			for(var i=1;i<argLength;i++) {
				var splitter=arguments[i].split("*");
				if(splitter[0]=="txt") {
					el.appendChild(document.createTextNode(splitter[1]));
				} else {
					if(splitter[0].substr(0,2)==="on") {
						el[splitter[0]]=eval(splitter[1]);
					} else {
						el[splitter[0]]=splitter[1].toString( );
					}
				}
			}
			return el;
		}
}

// Append Elements

/* function appender( ) {
	var argLength=arguments.length;
	for(var i=0;i<argLength;i++) {
		var splitter=arguments[i].split("*");
		eval(splitter[0]+".appendChild("+splitter[1]+")");
	}
} */

function objAppender( ) {
	var argLength=arguments.length-1;
	for(var i=0;i<argLength;i=i+2) {
		arguments[i].appendChild(arguments[i+1]);
	}
}

// Extracts page filename

var pageName=location.pathname.substr(Math.max(location.pathname.lastIndexOf("\\"), location.pathname.lastIndexOf("/"))+1);

// Creates functions changing the status line on mouseover and -out

function textToStatus( ) {
	window.status=this.firstChild.nodeValue;
	return true;
}

function statusToText( ) {
// deals with MZ1's refusal to return status bar to default
	window.status=window.defaultStatus;
	return true;
}

window.defaultStatus = "The Thirty Years War";

// Creates Link Objects

function linkObject( ) {
}

linkList = new linkObject;

if(document.getElementsByTagName) {
	for(i=0; i<document.getElementsByTagName("link").length; i++) {
		currentLink = document.getElementsByTagName("link")[i];
// excludes DC.schema
		if(currentLink.rel.indexOf(".")==-1){
			linkList[document.getElementsByTagName("link")[i].rel.toLowerCase( )]=document.getElementsByTagName("link")[i]; 
		}
	}
}

// Creates Navigation Menus


// Create Navigation Menu Objects

function menuData(classArgument,headerArgument,arrayArgument,appendeeArgument) {
	this.nature = classArgument;
	this.header = headerArgument;
	this.menuArray = arrayArgument;
	this.headerClass = (classArgument=="navigationmenu")?"h2":"h1";
	this.appendee = appendeeArgument;
	if(classArgument=="navigationmenu") {
		this.m_over=textToStatus;
		this.m_out=statusToText;
	}
}

menuData.prototype.makeMenu = fmakeMenu;

function fmakeMenu( ) {
	if(this.menuArray.length>0) {
		var currentDIV=builder("div","className*"+this.nature);
		var currentHeader=builder(this.headerClass,"txt*"+this.header);
		var currentUL=builder("ul");
		for(var i=0;i<this.menuArray.length;i++) {
			if(typeof this.menuArray[i]!="undefined") {
				var currentLI=this.menuArray[i].LI( );
				if(typeof this.m_over!="undefined") {
					currentLI.firstChild.onmouseover=this.m_over;
					currentLI.firstChild.onmouseout=this.m_out;
				}
			objAppender(currentUL,currentLI);
			}
		objAppender(currentDIV,currentHeader,currentDIV,currentUL);
		}
		(this.nature==="navigationmenu") ? this.appendee.appendChild(currentDIV) : changeContent(currentDIV);
	}
}

// Creates Navigation Data Objects

function navData(uri,clickFunc,caption) {
	this.uri = uri;
	this.clickFunc = clickFunc;
	this.caption = caption;
}

navData.prototype.LI = fLI;

function fLI( ) {
	var newLI = builder("li");
	var newA = builder("a","href*"+this.uri,"txt*"+this.caption);
	newA.onclick=this.clickFunc;
	newLI.appendChild(newA);
	return newLI;
}

// Creates Site Navigation Array

siteNav = new Array( );
if(linkList.home && linkList.home.href!=="" && linkList.home.title!=="" && pageName!=linkList.home.href) {
	siteNav[0] = new navData(linkList.home.href,"",linkList.home.title);
}
if(linkList.next && linkList.next.href!=="" && linkList.next.title!=="") {
	siteNav[1] = new navData(linkList.next.href,"","Next Page: "+linkList.next.title);
}
if(linkList.prev && linkList.prev.href!=="" && linkList.prev.title!=="") {
	siteNav[2] = new navData(linkList.prev.href,"","Prior Page: "+linkList.prev.title);
}
if(document.URL.indexOf("atomz")==-1 && document.URL.indexOf("BU_Search")==-1) {
	siteNav[3] = new navData("BU_TOC.htm", insertSearchDiv, "Search Site");
}
siteNav[4] = new navData("BU_TOC.htm", insertSiteDiv, "Site Map");

siteNavObj = new menuData("navigationmenu","Site Navigation",siteNav,rightDIV);

// Creates Page Navigation Array

pageNav = new Array( );
if(document.URL.indexOf("BU_TOC")==-1 && document.URL.indexOf('Chronology')==-1) {
	pageNav[0] = new navData("BU_TOC.htm", insertPageDiv, "Page Contents");
}
pageNav[1] = new navData("BU_TOC.htm", insertDCMetasDiv, "About This Page");

pageNavObj = new menuData("navigationmenu","Page Navigation",pageNav,rightDIV);

// Creates Other Navigation Array

otherNav = new Array( );
otherNav[0] = new navData("Map/TYW_Map.htm", "", "Large Europe Map (400K)");
if(document.URL.indexOf("Chronology")==-1) {otherNav[2] = new navData("Chronology.htm","","Timeline");}

otherNavObj = new menuData("navigationmenu","Other Information",otherNav,rightDIV);

// Creates Menus

	var pageContent;
	var rightMenuContent;
	var leftMenuContent;
	function changeContent(newContent) {
	if(document.getElementById("content")) {
		pageContent=document.body.removeChild(document.getElementById("content"));
	}
	rightMenuContent=document.body.removeChild(document.getElementById("rightnavigation"));
	if(document.getElementById("leftnavigation")) {
		leftMenuContent=document.body.removeChild(document.getElementById("leftnavigation"));
	}
	document.body.appendChild(newContent);
	var newNav=builder("div","className*navigationcontainer","id*rightnavigation");
	document.body.appendChild(newNav);
	var closeArray = new Array;
	closeArray[0] = new navData("BU_TOC.htm", restoreContent, "Close Menu");
	newNav = new menuData("navigationmenu","Close Menu",closeArray,document.getElementById("rightnavigation"));
	newNav.makeMenu( );
}

// Removes Menus

function restoreContent( ) {
	if(document.getElementById("content")) {
		document.body.removeChild(document.getElementById("content"));
	}
	if(document.getElementById("rightnavigation")) {
		document.body.removeChild(document.getElementById("rightnavigation"));
	}
// used for the map under Map.js
	if(document.getElementById("arrow")) {
		document.body.removeChild(document.getElementById("arrow"));
	}
	if(pageContent) {
		document.body.appendChild(pageContent);
	}
	if(rightMenuContent) {
		document.body.appendChild(rightMenuContent);
	}
	if(leftMenuContent) {
		document.body.appendChild(leftMenuContent);
	}
	if(typeof fixPos!="undefined") {
		fixPos( );
	}	
// class pageitems are links in the page or site navigation menus. If so, must return true to navigate there
	if(this.className!="pageitem") {
		return false;
	}
}

/* Creates Search Menu */

function insertSearchDiv( ) {
	var searchContent = builder("div","id*content","className*content");
	var header = builder("h1","txt*Site Search");
	var introSearchP = builder("p","txt*Through the good offices of ");
	var atomzLink = builder("a","className*inlinelink","href*http://www.atomz.com/","txt*Atomz.com");
	var introSearchPEndText = document.createTextNode(", you can use the form below to search this site.");
	var formElement=builder("form","method*get","action*http://search.atomz.com/search/");
	var formInput=builder("input","size*45","name*sp-q");
	var formButton =builder("input","type*submit","value*Search");
	var formHidden = builder("input","type*hidden","name*sp-a","value*00041740-sp00000000");
//	appender("searchContent*header","introSearchP*atomzLink","introSearchP*introSearchPEndText","searchContent*introSearchP","formElement*formInput","formElement*formButton","formElement*formHidden","searchContent*formElement");
	objAppender(searchContent,header,introSearchP,atomzLink,introSearchP,introSearchPEndText,searchContent,introSearchP,formElement,formInput,formElement,formButton,formElement,formHidden,searchContent,formElement);
	changeContent(searchContent);
	return false;
}

/* Creates Information for Site Map */

siteMap = new Array( );
siteMap[0] = new navData("TYWHome.htm", "", "Home Page");
siteMap[1] = new navData("Bohemian_Phase.htm", "", "The Bohemian Rebellion (1618-19)");
siteMap[2] = new navData("White_Mountain_Phase.htm", "", "The Bohemian Rebellion Crushed (1619-21)");
siteMap[3] = new navData("Palatine_Phase.htm", "", "The Palatinate and Westphalia (1621-23)");
siteMap[4] = new navData("Danish_Phase.htm", "", "The Danish War (1624-27)");
siteMap[5] = new navData("Stralsund_Phase.htm", "", "The Siege of Stralsund, the Peace of Lubeck and the Edict of Restitution (1627-29)");
siteMap[6] = new navData("Regensburg_Phase.htm", "", "The Diet of Regensburg and the Swedish Invasion (1630-31)");
siteMap[7] = new navData("Breitenfeld_Phase.htm", "", "The Sack of Magdeburg and the Battle of Breitenfeld (1631-32)");
siteMap[8] = new navData("Lutzen_Phase.htm", "", "The Swedish Triumph and the Battle of Lutzen (1632)");
siteMap[9] = new navData("Nordlingen_Phase.htm", "", "The Heilbronn League, the Fall of Wallenstein and the Battle of Nordlingen (1632-34)");
siteMap[10] = new navData("Prague_Phase.htm", "", "The Fall of the Heilbronn League and the Peace of Prague (1634-35)");
siteMap[11] = new navData("Wittstock_Phase.htm", "", "France and Sweden Alone (1635-38)");
siteMap[12] = new navData("Breisach_Phase.htm", "", "The Siege of Briesach and the Franco-Swedish Recovery (1638-40)");
siteMap[13] = new navData("Olmutz_Phase.htm", "", "Setting the Stage for the Congress of Westphalia (1640-42)");
siteMap[14] = new navData("Jankau_Phase.htm", "", "The Opening of the Congress of Westphalia (1643-45)");
siteMap[15] = new navData("Ulm_Phase.htm", "", "The Westphalian Negotiations Continue (1645-47)");
siteMap[16] = new navData("Westphalia_Phase.htm", "", "The Peace of Westphalia (1647-48)");
siteMap[17] = new navData("Web_Resources.htm", "", "Thirty Years War Resources on the Web");
siteMap[18] = new navData("Bibliography.htm", "", "Bibliography");

function insertSiteDiv( ) {
	var siteContent = builder("div","id*content","className*content");
	var header = builder("h1","txt*Site Map");
	siteContent.appendChild(header);
	var siteListUL = document.createElement("ul");
	siteContent.appendChild(siteListUL);
	var siteMapLength = siteMap.length;
		for (var i = 0; i < siteMapLength; i++) {
		if(siteMap[i].uri!=pageName){
				var newSiteLI=siteMap[i].LI( );
			}
			else {
				newSiteLI=builder("li","className*currentsiteitem","txt*You Are Here: "+siteMap[i].caption);
			}
			objAppender(siteListUL,newSiteLI);
		}
	changeContent(siteContent);
	return false;
}


/* Inserts Page Map */

function insertPageDiv( ) {
	var pageContent=builder("div","id*content", "className*content");
	var header = builder("h1","txt*Page Contents");
	pageContent.appendChild(header);
	var hnArray=new Array( );
	var j=0;
	var k;
	var appendee;
	var currentUL;
	var currentLI;
	var currentPage = location.pathname.substring(0,location.pathname.indexOf('/'))
	var contentLength = document.getElementById("content").childNodes.length;
	for(var i = 0; i < contentLength; i++) {
		var currEl = document.getElementById("content").childNodes[i];
		if(typeof currEl.tagName!=="undefined" && !isNaN(currEl.tagName.charAt(1)) && currEl.tagName.charAt(1)!=="" && currEl.tagName.charAt(1)!=1) {
			hnArray[j]=new navData(currentPage+"#"+currEl.firstChild.id, restoreContent, currEl.firstChild.firstChild.nodeValue);
			hnArray[j].hLevel=document.getElementById("content").childNodes[i].tagName.charAt(1);
			if(j===0) {
				appendee=pageContent;
				currentUL;
			}				
			if(j>0 && hnArray[j-1].hLevel>hnArray[j].hLevel) {
				appendee=currentUL.parentNode;
				for(k=0;k<(hnArray[j-1].hLevel-hnArray[j].hLevel);k++) {
					appendee=appendee.parentNode.parentNode;
				}
			}
			if(j>0 && hnArray[j-1].hLevel<hnArray[j].hLevel) {
				appendee=currentUL.lastChild;
			}
			if(j===0 || hnArray[j-1].hLevel!=hnArray[j].hLevel) {
				currentUL=builder("ul");
				appendee.appendChild(currentUL);
			}
			currentLI=hnArray[j].LI( );
			currentLI.firstChild.className = "pageitem"
			currentUL.appendChild(currentLI);
			j++;
		}
	}
	changeContent(pageContent);
	return false;
}

// Displays Dublin Core Metadata

function insertDCMetasDiv( ) {
		var metasContent = builder("div","id*content","className*content");
		var header = builder("h1", "txt*About This Page");
		var metasTable = builder("table","id*metastable");
		var metaTBody = builder("tbody","id*metatbody");
		objAppender(metasContent,header,metasContent,metasTable,metasTable,metaTBody);
		if(document.getElementsByTagName) {
			var currMeta;
			var dcMetasTHText;
			var dcMetasScheme;
			var dcMetasTDText;
		for (var j = 0; j<document.getElementsByTagName("meta").length; j++) {	
			if(document.getElementsByTagName("meta")[j].name.substr(0,2)=="DC"){
				currMeta = document.getElementsByTagName("meta")[j];
				dcMetasTHText = currMeta.name.slice(currMeta.name.indexOf(".")+1);
				dcMetasTHText = dcMetasTHText.charAt(0).toUpperCase( )+dcMetasTHText.slice(1);
				dcMetasScheme = (currMeta.scheme!=null) ? currMeta.scheme.slice(currMeta.scheme.indexOf(".")+1) : "None";
				switch(dcMetasTHText) {
					case "None":
						break;
					case "Subject":
						switch(dcMetasScheme) {
							case "LCSH":
								dcMetasTHText+=" (Library of Congress Subject Headings)";
								break;
							case "DDC":
								dcMetasTHText+=" (Dewey Decimal Classification)";
								break;
							case "LCC":
								dcMetasTHText+=" (Library of Congress Classification)";
								break;
							case "UDC":
								dcMetasTHText+=" (Universal Decimal Classification)";
								break;
						}
					break;	
					case "Format":
						switch(dcMetasScheme){
							case "IMT":
								dcMetasTHText+=" (MIME Type)";
								break;
							case "extent":
								dcMetasTHText+=" (Extent)";
								break;
							case "medium":
								dcMetasTHText+=" (Medium)";
								break;
						}
					break;
					case "Identifier":
						switch(dcMetasScheme) {
							case "URI":
							break;
						}
					break;
				}
				dcMetasTDText = document.getElementsByTagName("meta")[j].content;
				if(dcMetasTHText=="Temporal"){
					dcMetasTHText="Time Coverage";
					if(dcMetasScheme=="Period") {
						var currCont = document.getElementsByTagName("meta")[j].content; 
						var firstEqual=currCont.indexOf("=");
						var firstSemi=currCont.indexOf(";");
						var lastEqual=currCont.lastIndexOf("=");
						dcMetasTDText = currCont.slice(firstEqual+1,firstSemi)+"-"+currCont.slice(lastEqual+1);
					}
				}
				dcMetasTHText+=":";
				var dcMetasTR = document.createElement("tr");
				var dcMetasTH = builder("th","className*dcmetaheader","txt*"+dcMetasTHText);
				var dcMetasTD = builder("td","className*dcmetacontent","txt*"+dcMetasTDText);	
				objAppender(metaTBody,dcMetasTR,dcMetasTR,dcMetasTH,dcMetasTR,dcMetasTD);
			}
		}
	}
	changeContent(metasContent);
	return false;
}

/* converts date of page change to Early Modern Latin date */
romanArray = new Array( );
romanArray[0] = [1000, "m"];
romanArray[1] = [900, "cm"];
romanArray[2] = [500, "d"];
romanArray[3] = [400, "cd"];
romanArray[4] = [100, "c"];
romanArray[5] = [90, "xc"];
romanArray[6] = [50, "l"];
romanArray[7] = [40, "xl"];
romanArray[8] = [10, "x"];
romanArray[9] = [9, "ix"];
romanArray[10] = [5, "v"];
romanArray[11] = [4, "iv"];
romanArray[12] = [1, "i"];
romanMonths=new Array(11);
romanMonths[0]="IAN.";
romanMonths[1]="FEB.";
romanMonths[2]="MART.";
romanMonths[3]="APR.";
romanMonths[4]="MAI.";
romanMonths[5]="IVN.";
romanMonths[6]="IVL.";
romanMonths[7]="AVG.";
romanMonths[8]="SEPT.";
romanMonths[9]="OCT.";
romanMonths[10]="NOV.";
romanMonths[11]="DEC.";
lastMod=new Date(Date.parse(document.lastModified));
romanDay="";
romanMonth="";
romanYear="";
function convertToRoman(arabic) {
	var romanNumeral="";
	for(i=0; i<romanArray.length; i++) {
		if(Math.floor(arabic/romanArray[i][0])>0) {
			for(j=0;j<Math.floor(arabic/romanArray[i][0]);j++){
				romanNumeral+=romanArray[i][1];
			}
			arabic=arabic % romanArray[i][0];
		}
	}
	return romanNumeral;
}

function dateModAdder( ) {
	var romanDate=convertToRoman(lastMod.getDate( ))+" "+romanMonths[lastMod.getMonth( )]+" "+convertToRoman(lastMod.getFullYear( )).toUpperCase( );
	var lastModDIV=builder("div","id*dater","txt*"+romanDate);
	document.getElementById("content").appendChild(lastModDIV);
}

