var slide =	[0,1,2,3,4,5,6,7,8,10,12,14,16,18,20,23,26,29,32,36,40,44,48,52,56,60,64,68,71,74,77,80,82,84,86,88,90,91,92,93,94,91,96,97,98,99,100];
var swift =	[0,2,4,6,8,12,16,20,26,32,40,48,56,64,71,77,82,86,90,92,94,96,98,100];
var slice = [0,0.125,0.25,0.5,0.75,1,1.33,1.67,2,2.5,3,4,6,9,12,16,20,25,30,35,40,50,60,80,100];
var slip = [0,10,20,40,100]
var tick = 0;

var ua = "xx";
var vpw = 0;
var vph = 0;

var xhrhalt = false;
var xhrstack = [[""]];
var xhractive = 0;
var vistrans = null;
var vispd = 20;
var anim_on = true;
var expand_e = null;
var shrink_e = null;

function ready() {
	if ((typeof window.innerWidth == 'number') && (!window.opera) && (!window.devicePixelRatio) ) {	
		ua="ff";
		vpw	= window.innerWidth;
		vph	= window.innerHeight;
	} else if (typeof window.innerWidth == 'number') {
		if (window.opera) { ua = "op"; } else { ua="xx"; }
		vpw	= window.innerWidth;
		vph	= window.innerHeight;
	} else if (document.all && document.documentElement && (document.documentElement.clientHeight>0)) {
		ua="ie";
		vpw	= document.documentElement.clientWidth;
		vph	= document.documentElement.clientHeight;
		if (typeof document.body.style.maxHeight != "undefined") ua="ie7";
	}
	if (vpw+vph==0) {
		ua="xx";
		vpw	= document.body.clientWidth;
		vph	= document.body.clientHeight;
	}
	var i;
	
	handleAlphaImages();
	handleRigidity();
	handleSheetPresentation();
	
	document.onmousemove= mouseMove;
	document.onmouseup	= mouseUp;
	makeDraggable("dragme");
	
	setInterval("animate()",20);
}
function animate() {
	processXHRStack();
	if (!anim_on) return;
	
	var i;
	
	// Size Transitions
	if (expand_e!=null) {
		if (expand_e.parentNode.offsetHeight+32 < expand_e.offsetHeight) {
			expand_e.parentNode.style.height = (expand_e.parentNode.offsetHeight+32)+"px";
		} else {
			expand_e.parentNode.style.height = (expand_e.offsetHeight)+"px";
			expand_e = null;
		}
	} 
	if (shrink_e!=null) {
		if (shrink_e.parentNode.offsetHeight-32 > 0) {
			shrink_e.parentNode.style.height = (shrink_e.parentNode.offsetHeight-32)+"px";
		} else {
			shrink_e.parentNode.style.height = "0px";
			shrink_e.innerHTML = "";
			shrink_e = null;
		}
	} 

	
	// Visibility Transitions
	if (vistrans!=null) {
		for (i = 0; i < vistrans.length; i++) {
			if (vistrans[i]) {
				if (vistrans[i][1]==vistrans[i][2]) {
					setOpacity( vistrans[i][0] , vistrans[i][1] );
					if (vistrans[i][2]==0) vistrans[i][0].style.display = "none";
					if (vistrans[i][3]!=null) eval(vistrans[i][3]);
					vistrans[i] = null;
				} else {
					setOpacity( vistrans[i][0] , vistrans[i][1] );
					if (vistrans[i][1] <= vistrans[i][2]) {
						vistrans[i][1] = Math.min(vistrans[i][2],vistrans[i][1]+vispd);
					} else if (vistrans[i][1] >= vistrans[i][2]) {
						vistrans[i][1] = Math.max(vistrans[i][2],vistrans[i][1]-vispd);
					}
				}
			}
		}
	}
	
	tick+=1;
}
function pushXHR(uri,container) { xhrstack[xhrstack.length] = [uri,container,null]; }
function pushXHR(uri,container,parameters) { xhrstack[xhrstack.length] = [uri,container,parameters]; }
function immediateXHR(uri,container) { immediateXHR(uri,container,null); }
function immediateXHR(uri,container,parameters) {
	xhrhalt = true;
	
	var xhr = null;
	if (window.XMLHttpRequest) {
		xhr = new XMLHttpRequest();
	} else {
		xhr = new ActiveXObject("Microsoft.XMLHTTP");
	}
	xhractive+=1;
	if (parameters==null) {
		uri = uri + (uri.indexOf("?")==-1 ?"?":"&")+"jx=1";
		xhr.open("GET",uri,true);
		xhr.onreadystatechange = function() { xhrHandler(xhr,uri,container); };
		xhr.send(null);
	} else {
		parameters = "jx=1&"+parameters;
		xhr.open("POST",uri,true);
		xhr.onreadystatechange = function() { xhrHandler(xhr,uri,container); };
		xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xhr.setRequestHeader("Content-length", parameters.length);
		xhr.setRequestHeader("Connection", "close");
		xhr.send(parameters);
	}
}
function xhrHandler(xhr,uri,container) {
	if (xhr==null) return;
	if ((xhr.readyState == 4) && (xhr.status == 200)) {
		var i = -1;
		var text = xhr.responseText;
		if (text.indexOf("<!--callback:")!=-1) {
			callback = text.substring(text.indexOf("<!--callback:")+14,text.indexOf(" -->"));
			text = text.substring(0,text.indexOf("<!--callback:"));
			if (container!=null) {
				var e = document.getElementById(container);
				if ( (e) && (typeof(e)!="undefined") ) {
					if ((e.nodeName.toLowerCase()=="textarea") | (e.nodeName.toLowerCase()=="input")) {
						e.value = text;
					} else {
						e.innerHTML = text;
					}
				}
			}
			eval(callback);
		} else {
			if (container!=null) {
				var e = document.getElementById(container);
				if ( (e) && (typeof(e)!="undefined") ) {
					if ((e.nodeName.toLowerCase()=="textarea") | (e.nodeName.toLowerCase()=="input")) {
						e.value = text;
					} else {
						e.innerHTML = text;
					}
				}
			}
		}
		xhrhalt = false;
		xhractive-=1;
	}
}
function processXHRStack() {
	if (!xhrhalt) {
		if (xhrstack.length!=0) {
			uri = xhrstack[0][0];
			container = xhrstack[0][1];
			parameters = xhrstack[0][2];
			if ((uri!=null) && (uri!="")) {
				immediateXHR(uri,container,parameters);
			}

			var s = [];
			var i = -1;
			while (++i < xhrstack.length-1) {
				s[i] = xhrstack[i+1];
			}
			xhrstack = s;
		}
	}
}
function findID(root,name) {
	if (!root) return null;
	if (root.hasChildNodes()) {
		var i = -1;
		while (++i < root.childNodes.length) {
			var find = findID(root.childNodes[i]);
			if (find) {
				return find;
			}
		}
	} else {
		if (root.id == name) {
			return root;
		} else {
			return null;
		}
	}
}
function getPageXOffset() {
	return window.pageXOffset ? window.pageXOffset : document[(document.compatMode == 'CSS1Compat') ? 'documentElement' : 'body'].scrollLeft;
}
function getPageYOffset() {
	return window.pageYOffset ? window.pageYOffset : document[(document.compatMode == 'CSS1Compat') ? 'documentElement' : 'body'].scrollTop;
}
function offX(e) {
	var x = 0;
	while (e!=null) {
		x = x + e.offsetLeft;
		e = e.offsetParent;
	}
	return x;
}
function offY(e) {
	var y = 0;
	while (e!=null) {
		y = y + e.offsetTop;
		e = e.offsetParent;
	}
	return y;
}
function show(id) { addVisibilityTransition(id,0,100,null); }
function showLimit(id,limit) { addVisibilityTransition(id,0,limit,null); }
function hide(id) { addVisibilityTransition(id,100,0,null); }
function hideCall(id,callback) { addVisibilityTransition(id,100,0,callback); }
function hideFrom(id,limit) { addVisibilityTransition(id,limit,0,null); }
function delayHide(id) { addVisibilityTransition(id,1000,0,null); }
function addVisibilityTransition(id,start,end,callback) {
	var row = [document.getElementById(id),start,end,callback];
	if (end==100) {
		setOpacity(row[0],0);
	}	
	if (vistrans==null) {
		vistrans = [row];
	} else {
		vistrans[vistrans.length] = row;
	}
}
function setOpacity(e,o) {
	if ((typeof(e)!="undefined") && (e)) {
		if (o==0) {
			e.style.display="none";
		} else {
			e.style.display="block";
		}
		if ( ua=="ie" | ua=="ie7" ) {
			if ( e.msalpha=="true" ) {
				e.filters.item("DXImageTransform.Microsoft.Alpha").opacity=o;
			} else {
				if (typeof(e.pngsrc)!="undefined") {
					e.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+e.pngsrc+"') progid:DXImageTransform.Microsoft.Alpha(enabled=true,opacity="+o+");";
					e.msalpha="true";
				} else {
					e.style.filter="progid:DXImageTransform.Microsoft.Alpha(enabled=true,opacity="+o+");";
					e.msalpha="true";
				}
			}
		} else {
			e.style.opacity=(o/101);
		}
	}
}
function findFirstParentOfType(e,type) {
	type = type.toLowerCase();
	while ((e.parentNode.nodeName.toLowerCase()!="body") && (e.parentNode.nodeName.toLowerCase()!=type)) e = e.parentNode;
	if (e.parentNode.nodeName.toLowerCase()=="body") {
		return null;
	} else {
		return e.parentNode;
	}
}
function IsNumeric(sText) {
	if (sText==null) return false;
	if (sText=="") return false;
	var ValidChars = "0123456789.";
	var IsNumber=true;
	var Char;
	for (i = 0; i < sText.length && IsNumber == true; i++) { 
		Char = sText.charAt(i); 
		if (ValidChars.indexOf(Char) == -1) IsNumber = false;
	}
	return IsNumber;
}
function handleRigidity() {
	var ranges = document.getElementsByTagName("span");
	var i = -1;
	while (++i < ranges.length) {
		if (ranges[i].getAttribute("name")=="rigid") {
			ranges[i].style.display = "block";
			ranges[i].style.height = ranges[i].offsetHeight+"px";
			ranges[i].style.width = ranges[i].offsetWidth+"px";
		}
	}
}
function handleAlphaImages() {
	if ((ua!="ie") && (ua!="ie7")) return;
	handleAlphaImagesRecurse(document.getElementsByTagName("body").item(0));
}
function handleAlphaImagesRecurse(node) {
	if ( (node.currentStyle) && (typeof(node.currentStyle.backgroundImage)=="string") && (node.currentStyle.backgroundImage.indexOf(".png")!=-1) ) {
		var url = node.currentStyle.backgroundImage;
		url = url.substring(5);
		url = url.substring(0,url.length-2);
		node.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+url+"',width='"+node.offsetWidth+"',height='"+node.offsetHeight+"',sizingMethod='scale');";
		node.style.backgroundImage = "none";
	} else if ( (node.nodeName=="IMG") && (node.src.indexOf(".png")!=-1) && (img.name=="alpha") ) {
		node.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+node.src+"');";
		node.pngsrc = node.src;
		node.style.width = node.offsetWidth+"px";
		node.style.height = node.offsetHeight+"px";
		node.src = "/cogimages/dot.gif";
	}
	var i = -1;
	while (++i < node.childNodes.length) {
		handleAlphaImagesRecurse(node.childNodes[i]);
	}
}
function insertClass(id,c) {
	removeClass(id,c);
	var e = document.getElementById(id);
	if (e.className=="") {
		e.className = c;
	} else {
		e.className = c+" "+e.className;
	}
}
function removeClass(id,c) {
	var e = document.getElementById(id);
	if (e.className==c) {
		e.className = "";
	} else if (e.className.substring(0,c.length)==c) {
		e.className = e.className.substring(c.length+1);
	}
}
function setPageTitle(n) {
	document.title = n;
}
function siteDialog(t,b) {
	if ( (document.getElementById("dialog")) && (document.getElementById("dialog").nodeName=="DIV") ) closeDialog();
	var div = document.createElement("div");
	div.id = "dialog";
	div.style.position	= "absolute";
	div.style.left		= ""+((vpw-320)/2)+"px";
	div.style.top		= ""+(getPageYOffset()+((vph-96)/2))+"px";
	div.style.width		= "320px";
	div.style.height	= "128px";
	div.style.border	= "1px solid black";
	div.style.backgroundColor = "#eeeecc";
	div.style.color		= "#333300";
	div.style.zIndex	= "255";

	var s = "<table cellspacing=\"0\" cellpadding=\"0\" width=\"320\" height=\"128\" class=\"null\">";
	s = s + "<tr><th style=\"height:2.5em;text-align:center; vertical-align:middle;background-color:black;color:white;\">"+t+"</th></tr>";
	s = s + "<tr><th style=\"vertical-align:middle;padding-left:2em;padding-right:2em\">"+b+"</th></tr>";
	s = s + "<tr height=\"1.5em\" style=\"vertical-align:middle\"><th><center><a href=\"javascript:closeDialog()\" class=\"button center block margin\">Close</a></center></th></tr>";
	s = s + "</table>";
	div.innerHTML = s;
	
	document.getElementsByTagName("body").item(0).appendChild( div );
}
function closeDialog() {
	var div = document.getElementById("dialog");
	div.parentNode.removeChild( div );
}
function jinkForm(uri,parms) {
	var form = document.createElement("form");
	form.action = uri;
	form.method = "post";
	var i = -1;
	while (++i < parms.length) {
		var name = parms[i][0];
		var value= parms[i][1];
		var field= document.createElement("input");
		field.type = "hidden";
		field.name = name;
		field.value= value;
		form.appendChild( field );
	}
	document.getElementsByTagName("body")[0].appendChild( form );
	form.submit();
}
function endsWith(str,sub) {
   return ( ( str.substring( str.length ) - sub.length ) == sub );
}
function makeExpand(id) {
	expand_e = document.getElementById(id);
	if (expand_e==shrink_e) shrink_e = null;
}
function makeShrink(id) {
	shrink_e = document.getElementById(id);
	if (expand_e==shrink_e) expand_e = null;
}
function rezebra(id) {
	var table = document.getElementById(id);
	if ((typeof(table)=="undefined") || (table==null)) return;
	var zeb = 1;
	if (table.nodeName!="TBODY") table = table.firstChild;
	var row = table.firstChild;
	while (row) {
		row.className="row"+zeb;
		if (zeb==1) zeb=2; else zeb=1;
		row = row.nextSibling;
	}
}
function fakeCheck(id,callback) {
	var check = document.getElementById(id);
	var state = null;
	if (check.className=="checkon") {
		check.className = "checkoff";
		state = "false";
	} else {
		check.className = "checkon";
		state = "true";
	}
	if (callback!=null) {
		callback = callback+"('"+id+"','"+state+"')";
		eval(callback);
	}
}
function handleSheetPresentation() {
	var input = document.getElementsByTagName("input");
	var i = -1;
	while (++i < input.length) {
		if (input[i].offsetWidth < 40) {
			input[i].style.width = "40px";
		}
	}
}
function login() {
	pushXHR('/inc/login.php','ifcore','u='+encodeURIComponent(document.getElementById("userkey").value)+'&p='+encodeURIComponent(document.getElementById("userpass").value));
}
function createCharacter() {
	var newname = prompt("Enter new character's name:");
	if (newname.length<2) return;
	pushXHR("/inc/createchar.php","ifcore","name="+encodeURIComponent(newname));
}
function selectCharacter(id) {
	pushXHR("/inc/chartool.php","ifcore","id="+encodeURIComponent(id));
}
function loadChar() {
	pushXHR("/inc/loadchar.php",null);
}
function loadSheet() {
	pushXHR("/loadsheet.php","sheet");
}
function saveChar() {
	var form = document.getElementById("sheet");
	var parms= "";
	parms = "data="+encodeURIComponent(gatherValues(parms,form));

	pushXHR("/inc/savechar.php",null,parms);
}
function exitChar() {
	if (confirm("Save first?")) {
		saveChar();
	}
	document.getElementById("sheet").innerHTML = "";
	pushXHR("/inc/charlist.php","ifcore");
}
function generateChar() {
	var form = document.getElementById("sheet");
	var parms= "";
	parms = "data="+encodeURIComponent(gatherValues(parms,form));

	pushXHR("/inc/generatechar.php",null,parms);
}
function deleteChar() {
	if (confirm("You're really sure about that?")) pushXHR("/inc/deletechar.php",null);
}
function rerollChar() {
	setter("STR",roll("3d6"));
	setter("CON",roll("3d6"));
	setter("DEX",roll("3d6"));
	setter("SIZ",roll("2d6+6"));
	setter("INT",roll("2d6+6"));
	setter("POW",roll("3d6"));
	setter("APP",roll("3d6"));
	setter("EDU",roll("3d6+3"));
	formFlush("allskills");
	formFlush("allmelee");
	formFlush("allfirearms");
	updateSTR();
	updateCON();
	updateDEX();
	updateSIZ();
	updateINT();
	updatePOW();
	updateEDU();
	updateCMS();
}
function formFlush(e) {
	if (typeof(e)=="string") e = document.getElementById(e);
	if (e.nodeName=="INPUT") {
		if (e.getAttribute("type")!="hidden") e.value = "";
		if (e.getAttribute("value")!="") e.value = e.getAttribute("value");
	} else if (e.childNodes.length>0) {
		var i = -1;
		while (++i < e.childNodes.length) {
			parms = formFlush(e.childNodes[i]);
		}
	}
}
function roll(n) {
	if (n=="3d6") {
		return d6()+d6()+d6();
	} else if (n=="3d6+3") {
		return d6()+d6()+d6()+3;
	} else if (n=="2d6+6") {
		return d6()+d6()+6;
	}
}
function d6() {
	return Math.floor( Math.random()*6 )+1;
}
function blankSheet() {
	pushXHR("/sheet.php","sheet");
}
function gatherValues(parms, e) {
	if (e.nodeName=="INPUT") {
		if (e.id.substring(0,1)!="_") parms = parms + (parms==""?"":"|")+(e.id)+"="+(e.value);
	} else if (e.childNodes.length>0) {
		var i = -1;
		while (++i < e.childNodes.length) {
			parms = gatherValues(parms, e.childNodes[i]);
		}
	}
	return parms;
}
function setter(id,val) {
	if (document.getElementById(id)) {
		document.getElementById(id).value = val;
	} else {
		alert("Could not set: "+id+"="+val);
	}
}
function updateDEX() {
	if (IsNumeric(document.getElementById("DEX").value)) {
		document.getElementById("DODGE").value = (2 * document.getElementById("DEX").value);
	} else {
		document.getElementById("DODGE").value = "";
	}
}
function updateSTR() { calcDamageBonus(); }
function updateSIZ() { calcDamageBonus(); calcHitPoints(); }
function updateCON() { calcHitPoints(); }
function calcDamageBonus() {
	var ret = "";
	var str = document.getElementById("STR").value;
	var siz = document.getElementById("SIZ").value;
	if ((IsNumeric(str)) && (IsNumeric(siz))) {
		var val = eval(str+"+"+siz);
		if (val<=12) {
			ret="-1d6"; 
		} else if (val<=16) {
			ret="-1d4";
		} else if (val<=24) {
			ret="0";
		} else if (val<=32) {
			ret="+1d4";
		} else if (val<=40) {
			ret="+1d6";
		} else {
			ret="massive ("+val+")";
		}
	} else {
		ret = "";
	}
	document.getElementById("_DamageBonus").value = ret;
}
function calcHitPoints() {
	var i = -1;
	while (++i <= 37) document.getElementById("hv"+i).style.backgroundColor="white";
	var ret = "";
	var con = document.getElementById("CON").value;
	var siz = document.getElementById("SIZ").value;
	if ((IsNumeric(con)) && (IsNumeric(siz))) {
		var val = Math.ceil( (eval(con+"+"+siz))/2 );
		document.getElementById("hv"+val).style.backgroundColor="#cccccc";
		document.getElementById("HP").value = val;
	}
	
}
function updateINT() {
	if (IsNumeric(document.getElementById("INT").value)) {
		document.getElementById("_Idea").value = Math.min(99,(5 * document.getElementById("INT").value));
	} else {
		document.getElementById("_Idea").value = "";
	}
}
function updateEDU() {
	if (IsNumeric(document.getElementById("EDU").value)) {
		document.getElementById("OWNLANGVAL").value = Math.min(99,(5 * document.getElementById("EDU").value));
		document.getElementById("_Know").value = Math.min(99,(5 * document.getElementById("EDU").value));
	} else {
		document.getElementById("OWNLANGVAL").value = "";
		document.getElementById("_Know").value = "";
	}
}
function updatePOW() {
	if (IsNumeric(document.getElementById("POW").value)) {
		document.getElementById("_Luck").value = Math.min(99,(5 * document.getElementById("POW").value));
		document.getElementById("SAN").value = Math.min(99,(5 * document.getElementById("POW").value));
		updateSAN();
	} else {
		document.getElementById("_Luck").value = "";
		document.getElementById("SAN").value = "";
	}
}
function updateSAN() {
	var i = -1;
	while (++i <= 99) document.getElementById("sv"+i).style.backgroundColor="white";
	var i = -1;
	while (++i <= 37) document.getElementById("mv"+i).style.backgroundColor="white";
	if (IsNumeric(document.getElementById("SAN").value)) {
		document.getElementById("sv"+document.getElementById("SAN").value).style.backgroundColor="#cccccc";
	}
	if (IsNumeric(document.getElementById("POW").value)) {
		document.getElementById("mv"+document.getElementById("POW").value).style.backgroundColor="#cccccc";
		document.getElementById("MAGIC").value = document.getElementById("POW").value;
	}
}
function updateCMS() {
	if (IsNumeric(document.getElementById("CTHULHUMYTHOS").value)) {
		document.getElementById("_99Minus").value = ""+(99-eval(document.getElementById("CTHULHUMYTHOS").value));
	} else {
		document.getElementById("_99Minus").value = "";
	}
}
