// Tinwatchman Initiative Tracker v0.2
// developed by Jon Stout
// all code (c) Jon Stout, 2009, unless otherwise stated.

function Monster(monName, monInit, monLabel, monAbil) {
	this.name = monName;
	this.label = monLabel;
	this.init = monInit;
	this.abil = monAbil;
}

// Set Options & Option Flags (note: actual Options menu script at bottom of file)
var lowestFirst;
var noConfirmDelete;
var noConfirmClear;
var otherDie;
var myInitDie;
var noSuggest;

function setOptions() {
	// set options from the variables held in local memory
	if (lowestFirst) {
		document.getElementById("options-rank-order").selectedIndex = 1;
	} else {
		document.getElementById("options-rank-order").selectedIndex = 0;
	}
	if (noConfirmDelete) {
		document.getElementById("options-confirm-delete").checked = false;
	} else {
		document.getElementById("options-confirm-delete").checked = true;
	}
	if (noConfirmClear) {
		document.getElementById("options-confirm-clear").checked = false;
	} else {
		document.getElementById("options-confirm-clear").checked = true;
	}
	if (noSuggest) {
		document.getElementById("options-autosuggest-switch").checked = false;
	} else {
		document.getElementById("options-autosuggest-switch").checked = true;
	}
	if (otherDie) {
		switch (myInitDie) {
			case "1d10":
				document.getElementById("initroll-txt").selectedIndex = 1;
				document.getElementById("monroll").selectedIndex = 1;
				document.getElementById("options-default-roll").selectedIndex = 1;
				break;				
			case "1d6":
				document.getElementById("initroll-txt").selectedIndex = 2;
				document.getElementById("monroll").selectedIndex = 2;
				document.getElementById("options-default-roll").selectedIndex = 2;
				break;
			case "2d6":
				document.getElementById("initroll-txt").selectedIndex = 3;
				document.getElementById("monroll").selectedIndex = 3;
				document.getElementById("options-default-roll").selectedIndex = 3;
				break;
			case "3d6":
				document.getElementById("initroll-txt").selectedIndex = 4;
				document.getElementById("monroll").selectedIndex = 4;
				document.getElementById("options-default-roll").selectedIndex = 4;
				break;
			default:
				document.getElementById("initroll-txt").selectedIndex = 0;
				document.getElementById("monroll").selectedIndex = 0;
				document.getElementById("options-default-roll").selectedIndex = 0;
				break;
		}
	} else {
		document.getElementById("initroll-txt").selectedIndex = 0;
		document.getElementById("monroll").selectedIndex = 0;
		document.getElementById("options-default-roll").selectedIndex = 0;
	}
	// regardless
	document.getElementById("options-autosuggest-clear").checked = false;
	return;
}

function getSeed() {
	// returns an integer seed to make dice rolls more random-ish
	var myDate = new Date();
	var mySeed = Math.round(myDate.getTime() / myDate.getMilliseconds() * (1 + Math.random(myDate.getMilliseconds())));
	return mySeed;
}

// AJAX Functions

var xmlReq = new XMLHttpRequest();
var baseUrl = "ipod_inithandler.php";
var initArea = document.getElementById("initlist");
var url;
var xsl;
var xslUrl = "ipod_inittracker.xsl";
var xslReq = new XMLHttpRequest();

if (sessionId) {
	url = baseUrl + "?" + sessionId;
} else {
	url = baseUrl;
}

function loadingMode() {
	initArea = document.getElementById("initlist");
	initArea.innerHTML = "Please wait. Loading...";
}

function setOptionsFromXml(xmlDoc) {
	var myRoot = xmlDoc.getElementsByTagName("initorder")[0];
	var myLowest = myRoot.getAttribute("lowestfirst");
	var myConfirmDel = myRoot.getAttribute("confirmdelete");
	var myConfirmClear = myRoot.getAttribute("confirmclear");
	var myAutoSuggest = myRoot.getAttribute("autosuggest");
	var myAutoSuggestClear = myRoot.getAttribute("autosuggestclear");
	var theInitDie = myRoot.getAttribute("initdie");
	
	if (myLowest && myLowest == 'yes') {
		lowestFirst = true;
	} else if (!myLowest || myLowest == '' || myLowest == null | myLowest == 'no') {
		lowestFirst = false;
	}
	
	if (myConfirmDel && myConfirmDel == 'no') {
		noConfirmDelete = true;
	} else if (!myConfirmDel || myConfirmDel == '' || myConfirmDel == null || myConfirmDel == 'yes') {
		noConfirmDelete = false;
	}
	
	if (myConfirmClear && myConfirmClear == 'no') {
		noConfirmClear = true;
	} else if (!myConfirmClear || myConfirmClear == '' || myConfirmClear == null | myConfirmClear == 'yes') {
		noConfirmClear = false;
	}
	
	if (myAutoSuggest && myAutoSuggest == 'no') {
		noSuggest = true;
	} else if (!myAutoSuggest || myAutoSuggest == '' || myAutoSuggest == null || myAutoSuggest == 'yes') {
		noSuggest = false;
	}
	
	if (myAutoSuggestClear && myAutoSuggestClear == 'yes') {
		alert("All character and monster data cleared from the server.");
	}
	
	if (theInitDie && theInitDie != '1d20') {
		otherDie = true;
		myInitDie = theInitDie;
	} else if (!theInitDie && otherDie==true) {
		otherDie = false;
		myInitDie = '1d20';
	} else if (theInitDie && theInitDie=='1d20' && otherDie==true) {
		otherDie = false;
		myInitDie = '1d20';
	}
	
	setOptions();
	return;
}

function xmlLoader() {
	if (xmlReq.readyState == 4 && xslReq.readyState==4 && xmlReq.responseXML && xslReq.responseXML) {
		initArea = document.getElementById("initlist");
		initArea.innerHTML = "";
		while (initArea.hasChildNodes()) {
			initArea.removeChild(initArea.firstChild);
		}
		xsl = xslReq.responseXML;
		xml = xmlReq.responseXML;
		setOptionsFromXml(xml);
		var resultXml;
		try {
			xsltProcessor = new XSLTProcessor();
			xsltProcessor.importStylesheet(xsl);
			resultXml = xsltProcessor.transformToFragment(xml,document);
			initArea.appendChild(resultXml);
		} catch(e) {
			// if IE
			resultXml = xml.transformNode(xsl);
			initArea.innerHTML = resultXml;
		}
	}
}

function sendInfo(params) {
	loadingMode();
	xmlReq.open("POST", url, true);
	xslReq.open("GET", xslUrl, true);
	xmlReq.onreadystatechange = xmlLoader;
	xslReq.onreadystatechange = xmlLoader;
	xmlReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xmlReq.send(params);
	xslReq.send(null);
}

function refreshOrder() {
	if (sessionId) {
		loadingMode();
		xmlReq.open("GET", url, true);
		xslReq.open("GET", xslUrl, true);
		xmlReq.onreadystatechange = xmlLoader;
		xslReq.onreadystatechange = xmlLoader;
		xmlReq.send(null);
		xslReq.send(null);
	}
}

// Autosuggest Functions
var suggestReq = new XMLHttpRequest();
var suggestName;
var suggestBonus;
var suggestAbil;
var suggestMonName;
var suggestMonBonus;
var suggestMonAbil;

function txtBoxSuggest(myBox, myName) {
	var myVal = myBox.value;
	var myLen = myVal.length;
	var mySug = myName.substr(myLen);
	var mySugLen = myLen + mySug.length;
	myBox.value = myVal + mySug;
	try {
		myBox.setSelectionRange(myLen,mySugLen);
	} catch(e) {
		// then IE
		var myRange = myBox.createTextRange();
		myRange.moveStart("character",myLen);
		myRange.moveEnd("character",mySugLen);
		myRange.select();
	}
	return;
}

function getSuggest() {
	if (suggestReq.readyState == 4 && suggestReq.responseXML) {
		var suggestXml = suggestReq.responseXML;
		var mySuggest = suggestXml.getElementsByTagName("suggest")[0];
		if (mySuggest.getAttribute("nomatch") == "yes") {
			// no match
			return;
		} else if (mySuggest.getAttribute("mode") == "suggestchar") {
			// Suggest Character Mode
			suggestName = mySuggest.getAttribute("name");
			if (mySuggest.getAttribute("bonus")) {
				suggestBonus = mySuggest.getAttribute("bonus");
			}
			if (mySuggest.getAttribute("abil")) {
				suggestAbil = mySuggest.getAttribute("abil");
			}
			var myTextBox = document.getElementById("charname-txt");
			txtBoxSuggest(myTextBox, suggestName);
		} else if (mySuggest.getAttribute("mode") == "suggestmon") {
			// Suggest Monster Mode
			suggestMonName = mySuggest.getAttribute("name");
			if (mySuggest.getAttribute("bonus")) {
				suggestMonBonus = mySuggest.getAttribute("bonus");
			}
			if (mySuggest.getAttribute("abil")) {
				suggestMonAbil = mySuggest.getAttribute("abil");
			}
			var myTextBox = document.getElementById("monlabel-txt");
			txtBoxSuggest(myTextBox, suggestMonName);
		}
	}
	return;
}

function reqSuggest(suggestMode, myStr) {
	var totalUrl = new String();
	if (suggestMode == 0) { // Suggest Character Mode
		totalUrl = url + "&suggestchar=" + myStr;
	} else if (suggestMode == 1) { // Suggest Monster Mode
		totalUrl = url + "&suggestmon=" + myStr;
	} else {
		return false;
	}
	suggestReq.open("GET", totalUrl, true);
	suggestReq.onreadystatechange = getSuggest;
	suggestReq.send(null);
	return;
}

// Navigation functions
function clearFrames() {
	document.getElementById("top").style.display = "none";
	document.getElementById("add").style.display = "none";
	document.getElementById("mon").style.display = "none";
	document.getElementById("clearwarn").style.display = "none";
	document.getElementById("deletewarn").style.display = "none";
	document.getElementById("options").style.display = "none";
	document.getElementById("credits").style.display = "none";
	document.getElementById("adbox").style.display = "block";
	return;
}

function switchTo(myFrame) {
	clearFrames();
	switch (myFrame) {
		case "top":
			document.getElementById("top").style.display = "block";
			break;
		case "add":
			document.getElementById("add").style.display = "block";
			break;
		case "mon":
			document.getElementById("mon").style.display = "block";
			break;
		case "clearOrder":
			document.getElementById("top").style.display = "block";
			document.getElementById("clearwarn").style.display = "block";
			break;
		case "deleteChar":
			document.getElementById("top").style.display = "block";
			document.getElementById("deletewarn").style.display = "block";
			break;
		case "options":
			document.getElementById("options").style.display = "block";
			break;
		case "credits":
			document.getElementById("credits").style.display = "block";
			break;
		default:
			document.getElementById("top").style.display = "block";
			break;
	}
	document.getElementById("adbox").style.display = "block";
}

function numTest(myStr) {
	// tests to make sure string only contains digits
	var numPatt = /\D/g;
	if (numPatt.test(myStr)) {
		return false;
	} else {
		return true;
	}
}

/* Initiative List Browser */

function getCurrentInitIndex(initList) {
	// gets the index of tr#initlist-current in the given list, and returns it as a number
	// returns false if #initlist-current hasn't been named
	var tempRow = new Object();
	var tempId = new String();
	var myIndex = new Number(-1);
	for (i=0; i<initList.length; i++) {
		tempRow = initList[i];
		if (tempRow.id == "initlist-current") {
			myIndex = i;
		}
	}
	return myIndex;
}

function backAtTheTop() {
	var initArea = document.getElementById("initlist");
	var initTable = document.getElementById("initlist-table");
	if (!initTable) {
		// then there's no data yet, so we...
		return;
	}
	var initBody = document.getElementById("initlist-table-body");
	var initRows = initBody.getElementsByTagName("tr");
	var currentInit = document.getElementById("initlist-current");
	if (!currentInit) {
		// then the round hasn't been started
		var myInit = initRows[0];
		myInit.id = "initlist-current";
	} else {
		// clear #initlist-current
		currentInit.id = "";
		var myInit = initRows[0];
		myInit.id = "initlist-current";
	}
	initArea.scrollTop = 0;
	return;
}

function nextInList() {
	var initArea = document.getElementById("initlist");
	var initTable = document.getElementById("initlist-table");
	if (!initTable) {
		// then there's no data yet, so we...
		return;
	}
	var initBody = document.getElementById("initlist-table-body");
	var initRows = initBody.getElementsByTagName("tr");
	var currentInit = document.getElementById("initlist-current");
	if (!currentInit) {
		// then the round hasn't been started
		backAtTheTop();
		return;
	}
	var currentIndex = getCurrentInitIndex(initRows);
	if (currentIndex == -1) {
		alert("currentIndex returned false - nextInList");
		return;
	}
	var myIndex = currentIndex + 1;
	var newCurrent = initRows[myIndex];
	if (!newCurrent) {
		// then assume we've reached the end of the list
		backAtTheTop();
	} else {
		currentInit.id = "";
		newCurrent.id = "initlist-current";
		// scroll down to new item
		// myScroll = initArea.scrollTop + newCurrent.offsetHeight;
		myScroll = newCurrent.offsetHeight * myIndex;
		initArea.scrollTop = myScroll;
	}
	return;
}

function prevInList() {
	var initArea = document.getElementById("initlist");
	var initTable = document.getElementById("initlist-table");
	if (!initTable) {
		// then there's no data yet, so we...
		return;
	}
	var initBody = document.getElementById("initlist-table-body");
	var initRows = initBody.getElementsByTagName("tr");
	var currentInit = document.getElementById("initlist-current");
	if (!currentInit) {
		// then the round hasn't been started
		backAtTheTop();
		return;
	}
	var currentIndex = getCurrentInitIndex(initRows);
	if (currentIndex == -1) {
		alert("currentIndex returned false - nextInList");
		return;
	}
	var myIndex = currentIndex - 1;
	var newCurrent;
	if (myIndex < 0) {
		// then assume that we've reached the top of the list
		myIndex = initRows.length - 1;
		newCurrent = initRows[myIndex];
		currentInit.id = "";
		newCurrent.id = "initlist-current";
		myScroll = initTable.offsetHeight;
		initArea.scrollTop = myScroll;
	} else {
		newCurrent = initRows[myIndex];
		currentInit.id = "";
		newCurrent.id = "initlist-current";
		// myScroll = initArea.scrollTop - currentInit.offsetHeight;
		myScroll = currentInit.offsetHeight * myIndex;
		initArea.scrollTop = myScroll;
	}
	return;
}

/* Delete Character Functionality */

var deleteChar;

function deleteThisChar(charPlace) {
	deleteChar = charPlace;
	if (noConfirmDelete && noConfirmDelete == true) {
		deleteAlready();
	} else {
		switchTo("deleteChar");
	}
}

function deleteCancel() {
	switchTo("top");
}

function deleteAlready() {
	var delParams = "mode=deletecreature&placeNum=" + deleteChar;
	sendInfo(delParams);
	switchTo("top");
}

/* Add Character Frame */

var charName = document.getElementById("charname-txt");
var abilityField = document.getElementById("ability-txt");
var initRoll = document.getElementById("initroll-txt");
var initAdd = document.getElementById("init-add-txt");
var init = document.getElementById("init-result-txt");

function rollInit() {
	initRoll = document.getElementById("initroll-txt");
	initAdd = document.getElementById("init-add-txt");
	init = document.getElementById("init-result-txt");
	var myAdd = new Number();
	var myRoll = new Number();
	var myResult = new Number();
	
	// get added value
	myAdd = parseInt(initAdd.value);
	if (!myAdd) {
		myAdd = 0;
	}
	
	// get roll
	switch (initRoll.value) {
		case "1d20":
			myRoll = Math.round(Math.random(getSeed()) * 20) % 20 + 1;
			break;
		case "1d10":
			myRoll = Math.round(Math.random(getSeed()) * 10) % 10 + 1;
			break;
		case "1d6":
			myRoll = Math.round(Math.random(getSeed()) * 6) % 6 + 1;
			break;
		case "2d6":
			rollOne = Math.round(Math.random(getSeed()) * 6) % 6 + 1; 
			rollTwo = Math.round(Math.random(getSeed()) * 6) % 6 + 1;
			myRoll = rollOne + rollTwo;
			break;
		case "3d6":
			rollOne = Math.round(Math.random(getSeed()) * 6) % 6 + 1; 
			rollTwo = Math.round(Math.random(getSeed()) * 6) % 6 + 1;
			rollThree = Math.round(Math.random(getSeed()) * 6) % 6 + 1;
			myRoll = rollOne + rollTwo + rollThree;
			break;
		default:
			myRoll = Math.round(Math.random(getSeed()) * 20) % 20 + 1;
			break;
	}
	myResult = myRoll + myAdd;
	if (myResult < 0) {
		myResult = 0;
	}
	init.value = myResult;
}

function getCharnameSuggestion(e) {
	// triggered onkeypress for #charname-txt
	if (noSuggest) {
		return;
	}
	var keynum;
	if (window.event) { // IE 
		keynum = e.keyCode;
	} else {
		keynum = e.which;
	}
	if (keynum==8) { // backspace
		return;
	}
	charName = document.getElementById("charname-txt");
	var nameStr = charName.value;
	if (!nameStr || nameStr.length == 0) {
		return;
	} else {
		reqSuggest(0,nameStr);
	}
}

function checkCharnameSuggestion() {
	// triggered onblur for #charname-txt
	if (noSuggest) {
		return;
	}
	charName = document.getElementById("charname-txt");
	if (charName.value == suggestName) {
		// then we assume the suggestion was taken, and we load the rest of the data
		if (suggestBonus && suggestBonus != 0) {
			initAdd = document.getElementById("init-add-txt");
			initAdd.value = suggestBonus;
		}
		if (suggestAbil && suggestAbil != 0) {
			abilityField = document.getElementById("ability-txt");
			abilityField.value = suggestAbil;
		}
	} else {
		// then just forget the whole thing
		suggestName = "";
		suggestBonus = 0;
		suggestAbil = 0;
	}
	return;
}

function cancelAdd() {
	charName = document.getElementById("charname-txt");
	abilityField = document.getElementById("ability-txt");
	initAdd = document.getElementById("init-add-txt");
	init = document.getElementById("init-result-txt");
	// clear fields
	charName.value = "";
	abilityField.value = "";
	initAdd.value = "";
	init.value = "";
	// return to the top frame
	switchTo("top");
}

function validateAddChar() {
	charName = document.getElementById("charname-txt");
	abilityField = document.getElementById("ability-txt");
	init = document.getElementById("init-result-txt");
	var bonusField = document.getElementById("init-add-txt");
	
	var myName = escape(charName.value);
	var initNum = parseInt(init.value);
	var abilityValue = parseInt(abilityField.value);
	var bonusValue = parseInt(bonusField.value);
	
	if (!myName) {
		alert("Please enter a character name before you click \"Add.\"");
		return;
	} else if (!numTest(init.value)) {
		alert("Please enter a valid initiative value.");
		return;
	} else if (!initNum) {
		alert("Please either roll an initiative for this character or enter in an initiative value before you click \"Add.\"");
		return;
	} 
	
	if (!abilityValue && abilityField.value != "" && !numTest(abilityField.value)) {
		alert("Please enter in a valid number for the ability value.");
		return;
	}
	
	// if we've made it through all that, presume that everything is golden
	if (!abilityValue || abilityValue == null || isNaN(abilityValue)) {
		abilityValue = false;
	}
	if (!bonusValue || bonusValue == null || isNaN(bonusValue)) {
		bonusValue = false;
	}
	addCharSubmit(myName, initNum, abilityValue, bonusValue);
}

function addCharSubmit(myName, myInit, myAbil, myBonus) {
	var myParams = new String();
	myParams = "session=" + sessionId + "&mode=addchar";
	myParams += "&charname=" + myName;
	myParams += "&init=" + myInit;
	if (myAbil && myAbil != null && myAbil != false) {
		myParams += "&abil=" + myAbil;
	}
	if (myBonus && myBonus != null && myBonus != false) {
		myParams += "&bonus=" + myBonus;
	}
	sendInfo(myParams);
	cancelAdd();
}

/* Roll Monster Initiative Frame */

var monlist = new Array();
var monLabel = document.getElementById("monlabel-txt");
var monNumSelect = document.getElementById("monnum");
var monAbil = document.getElementById("monabil-txt");
var monRoll = document.getElementById("monroll");
var monRollAdd = document.getElementById("mon-add-txt");
var monResult = document.getElementById("monresult");
var monBonus;
var monStr;
var monAbility;

function monValidate() {
	monLabel = document.getElementById("monlabel-txt");
	monAbil = document.getElementById("monabil-txt");
	monRollAdd = document.getElementById("mon-add-txt");
	
	var myLabel = monLabel.value;
	var myAdd = parseInt(monRollAdd.value);
	var abilVal = parseInt(monAbil.value);
	
	if (!myLabel) {
		alert("Please enter a label for this monster set.");
		return false;
	}
	
	if (!myAdd && monRollAdd.value != "" && !numTest(monRollAdd.value)) {
		alert("Please enter a valid number for the monster's initiative bonus.");
		return false;
	}
	
	if (!abilVal && monAbil.value != "" && !numTest(monAbil.value)) {
		alert("Please enter a valid number for the monster ability value.");
		return false;
	}
	
	// if we made it through all that, presume we're good to go
	return true;
}

function rollOneMon(dieRoll) {
	var myRoll = 0;
	switch (dieRoll) {
		case "1d20":
			myRoll = Math.round(Math.random(getSeed()) * 20) % 20 + 1;
			break;
		case "1d10":
			myRoll = Math.round(Math.random(getSeed()) * 10) % 10 + 1;
			break;
		case "1d6":
			myRoll = Math.round(Math.random(getSeed()) * 6) % 6 + 1;
			break;
		case "2d6":
			rollOne = Math.round(Math.random(getSeed()) * 6) % 6 + 1; 
			rollTwo = Math.round(Math.random(getSeed()) * 6) % 6 + 1;
			myRoll = rollOne + rollTwo;
			break;
		case "3d6":
			rollOne = Math.round(Math.random(getSeed()) * 6) % 6 + 1; 
			rollTwo = Math.round(Math.random(getSeed()) * 6) % 6 + 1;
			rollThree = Math.round(Math.random(getSeed()) * 6) % 6 + 1;
			myRoll = rollOne + rollTwo + rollThree;
			break;
		default:
			myRoll = Math.round(Math.random(getSeed()) * 20) % 20 + 1;
			break;
	}
	return myRoll;
}

function rollMonsters() {
	monlist = new Array();
	monLabel = document.getElementById("monlabel-txt");
	monNumSelect = document.getElementById("monnum");
	monAbil = document.getElementById("monabil-txt");
	monRoll = document.getElementById("monroll");
	monRollAdd = document.getElementById("mon-add-txt");
	monResult = document.getElementById("monresult");

	var monValidation = monValidate();
	if (!monValidation) {
		return;
	}
	
	monNum = parseInt(monNumSelect.value);
	monDie = monRoll.value;
	monBonus = parseInt(monRollAdd.value);
	monAbility = parseInt(monAbil.value);
	monStr = monLabel.value;
	results = new String();
	
	if (!monNum) {
		alert("Critical failure! What did you do. WHAT DID YOU DO.");
		return;
	}
	if (!monBonus) {
		monBonus = 0;
	}
	if (!monAbility) {
		monAbility = 0;
	}
	
	var tempMon;
	for (i=1; i<=monNum; i++) {
		myName = monStr + i;
		myInit = rollOneMon(monDie) + monBonus;
		if (myInit < 0) {
			myInit = 1;
		}
		results += "<li>" + myName + ", Initiative: " + myInit + "</li>";
		tempMon = new Monster(myName, myInit, monStr, monAbility);
		monlist.push(tempMon);
	}
	
	monResult.innerHTML = results;
}

function clearMonsters() {
	monlist = new Array();
	monLabel = document.getElementById("monlabel-txt");
	monNumSelect = document.getElementById("monnum");
	monAbil = document.getElementById("monabil-txt");
	monRollAdd = document.getElementById("mon-add-txt");
	monResult = document.getElementById("monresult");
	monLabel.value = "";
	monNumSelect.selectedIndex = 0;
	monRollAdd.value = "";
	monAbil.value = "";
	monResult.innerHTML = "<li>Click &ldquo;Roll&rdquo; to generate monsters</li>";
	monStr = "";
	monBonus = 0;
	monAbility = 0;
	return;
}

function cancelMonsters() {
	clearMonsters();
	switchTo("top");
}

function addMonsters() {
	if (!monlist) {
		alert("You must generate a list of monsters before you can add them to the initiative order!");
		return;
	}
	var validMons = monValidate();
	if (!validMons) {
		return;
	}
	
	var monParams = "mode=addmon&totalmon=" + monlist.length + "&monlabel=" + monStr;
	if (monBonus && monBonus != 0) {
		monParams += "&monbonus=" + monBonus;
	}
	if (monAbility && monAbility != 0) {
		monParams += "&monability=" + monAbility;
	}
	var tempMon = new String();
	var monpass = new String();
	for (m in monlist) {
		tempMon = monlist[m];
		monpass = "mon" + m;
		monParams += "&" + monpass + "name=" + tempMon.name;
		monParams += "&" + monpass + "init=" + tempMon.init;
		monParams += "&" + monpass + "abil=" + tempMon.abil;
	}

	sendInfo(monParams);
	clearMonsters();
	switchTo("top");
}

function getMonNameSuggestion(e) {
	// triggered onkeypress for #monlabel-txt
	if (noSuggest) {
		return;
	}
	var keynum;
	if (window.event) { // IE 
		keynum = e.keyCode;
	} else {
		keynum = e.which;
	}
	if (keynum==8) { // backspace
		return;
	}
	monLabel = document.getElementById("monlabel-txt");
	var lblStr = monLabel.value;
	if (!lblStr || lblStr.length == 0) {
		return;
	} else {
		reqSuggest(1,lblStr);
	}
}

function checkMonNameSuggestion() {
	// triggered onblur for #monlabel-txt
	if (noSuggest) {
		return;
	}
	monLabel = document.getElementById("monlabel-txt");
	if (monLabel.value == suggestMonName) {
		// then we assume the suggestion was taken, and we load the rest of the data
		if (suggestMonBonus && suggestMonBonus != 0) {
			monRollAdd = document.getElementById("mon-add-txt");
			monRollAdd.value = suggestMonBonus;
		}
		if (suggestMonAbil && suggestMonAbil != 0) {
			monAbil = document.getElementById("monabil-txt");
			monAbil.value = suggestMonAbil;
		}
	} else {
		// then just forget the whole thing
		suggestMonName = "";
		suggestMonBonus = 0;
		suggestMonAbil = 0;
	}
	return;
}

/* Clear Order Frame */

function clearCalled() {
	if (noConfirmClear && noConfirmClear == true) {
		clearAlready();
	} else {
		switchTo('clearOrder');
	}
}

function clearCancel() {
	switchTo("top");
}

function clearAlready() {
	var clearParams = "mode=clearorder";
	sendInfo(clearParams);
	switchTo("top");
}

/* Options Menu */

function cancelOptions() {
	setOptions();
	switchTo('top');
}

function optionsReset() {
	optParams = "mode=options&reset=true";
	sendInfo(optParams);
	alert("All options reset to default.");
	switchTo('top');
}

function optionsSubmit() {
	var myOptions = new String();
	var myRank = document.getElementById("options-rank-order").value;
	var conDel = document.getElementById("options-confirm-delete").checked;
	var conClear = document.getElementById("options-confirm-clear").checked;
	var autoSuggest = document.getElementById("options-autosuggest-switch").checked;
	var autoSuggestClear = document.getElementById("options-autosuggest-clear").checked;
	var initDie = document.getElementById("options-default-roll").value;
	
	// Ranking Order
	if (myRank == "lowest") {
		lowestFirst = true;
		myOptions += "&lowestfirst=true";
	} else if (myRank == "highest" && lowestFirst == true) {
		lowestFirst = false;
		myOptions += "&lowestfirst=false";
	}
	// Confirm Delete Character
	if (conDel == false) {
		noConfirmDelete = true;
		myOptions += "&confirmdelete=false";
	} else if (conDel == true && noConfirmDelete == true) {
		noConfirmDelete = false;
		myOptions += "&confirmdelete=true";
	}
	// Confirm Clear Order
	if (conClear == false) {
		noConfirmClear = true;
		myOptions += "&confirmclear=false";
	} else if (conClear == true && noConfirmClear == true) {
		noConfirmClear = false;
		myOptions += "&confirmclear=true";
	}
	// AutoSuggest
	if (autoSuggest == false) {
		noSuggest = true;
		myOptions += "&autosuggest=false";
	} else if (autoSuggest == true && noSuggest == true) {
		noSuggest = false;
		myOptions += "&autosuggest=true";
	}
	// AutoSuggest Clear
	if (autoSuggestClear == true) {
		myOptions += "&autosuggestclear=true";
	}
	// Default Initiative Die
	if (initDie != "1d20") {
		otherDie = true;
		myInitDie = initDie;
		myOptions += "&initdie=" + myInitDie;
	} else if (initDie == "1d20" && otherDie == true) {
		otherDie = false;
		myInitDie = "1d20";
		myOptions += "&initdie=" + myInitDie;
	}
	// if myOptions haven't been changed, then assume nothing's changed and go back to top
	if (!myOptions || myOptions == "") {
		switchTo("top");
		return;
	}
	// otherwise, though...
	
	optParams = "mode=options" + myOptions;
	sendInfo(optParams);
	switchTo("top");
}

/* Credits - Social Networking Links */

function Tinwatchman_Social_Click(myIcon) {
	var myloc = encodeURIComponent(window.location);
	switch (myIcon) {
		case 'facebook':
			var gotoloc = "http://www.facebook.com/share.php?u=" + myloc;
			break;
		case 'twitter':
			var gotoloc = "http://twitter.com/home?status=" + myloc;
			break;
		case 'reddit':
			var mytitle = encodeURIComponent(document.title);
			var gotoloc = "http://reddit.com/submit?url=" + myloc + "&title=" + mytitle;
			break;
		case 'stumbleupon':
			var mytitle = encodeURIComponent(document.title);
			var gotoloc = "http://www.stumbleupon.com/submit?url=" + myloc + "&title=" + mytitle;
			break;
		case 'delicious':
			var mytitle = encodeURIComponent(document.title);
			var gotoloc = "http://delicious.com/save";
			var deliciousUrl = "http://delicious.com/save?v=5&noui&jump=close&url=" + myloc + "&title=" + mytitle;
			window.open(deliciousUrl,'delicious','toolbar=no,width=550,height=550');
			return;
			break;
		default:
			return;
			break;
	}
	window.open(gotoloc,"_blank");
}

/*
CSS Browser Selector v0.3.2
Rafael Lima (http://rafael.adm.br)
http://rafael.adm.br/css_browser_selector
License: http://creativecommons.org/licenses/by/2.5/
Contributors: http://rafael.adm.br/css_browser_selector#contributors

This code is NOT (c) Jon Stout, but rather has been released under a Creative Commons license by Rafael Lima.
*/
function css_browser_selector(u){var ua = u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1;},g='gecko',w='webkit',s='safari',h=document.getElementsByTagName('html')[0],b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3')?g+' ff3':is('gecko/')?g:/opera(\s|\/)(\d+)/.test(ua)?'opera opera'+RegExp.$2:is('konqueror')?'konqueror':is('chrome')?w+' chrome':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?'mobile':is('iphone')?'iphone':is('ipod')?'ipod':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win':is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;}; css_browser_selector(navigator.userAgent);