var mode = 0;
var cycle;
var seed;
var result;

tD = new Date();
var d = new Date(tD.getFullYear(),tD.getMonth(),1);

var months = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var maxYear = 2012;
var thisYear = d.getFullYear();


function changeMode(num) {
	document.getElementById('fractal').innerHTML = "&nbsp;";
	document.getElementById('output').innerHTML = "";
	mode = num;
	if(num < 3) {
		cycle = 5125;
		document.getElementById("cycle").innerHTML = "5,125 years";
		document.getElementById("cycle").style.display = "";
		document.getElementById("cycleLabel").style.display = "";

		if(num == 1) {
			document.getElementById("seedLabel").innerHTML = "Seed Date";
			dValue = displayMonths() + displayYears();
			document.getElementById("seed").innerHTML = dValue;
		} else {
			document.getElementById("seedLabel").innerHTML = "Target Date";
			dValue = displayMonths() + displayYears();
			document.getElementById("seed").innerHTML = dValue;
		}
	} else {
		cycle = 0;
		document.getElementById("cycle").style.display = "none";
		document.getElementById("cycleLabel").style.display = "none";
		dValue = displayAges();
		document.getElementById("seed").innerHTML = dValue;
		document.getElementById("seedLabel").innerHTML = "Seed Age";
	}
}

function checkNum(data) {
	var valid = ".0123456789ABCDEabcde- ";
	var ok = 1; var checktemp;
	for (var i=0; i<data.length; i++) {
	checktemp = "" + data.substring(i, i+1);
	if (valid.indexOf(checktemp) == "-1") return 0; }
	return 1;
}

function run() {
	if(mode == 0) {
		document.getElementById('output').innerHTML = "You must choose a mode.";
		return false;
	}
	document.getElementById('output').innerHTML = "";
	document.getElementById('fractal').innerHTML = "&nbsp;";
	
	if(mode == 1) {
		if(document.getElementById("years").value == "") {
			document.getElementById('output').innerHTML = "You must specify a Seed Date.";
		} else if(checkNum(document.getElementById("years").value) == 0) {
			document.getElementById('output').innerHTML = "You must provide an actual date.";
			return false;
		}
		
		sM = document.getElementById("months").value;
		if(sM == "") {
			sM = 1;
		}
		
		sY = document.getElementById("years").value;
		sY = sY.replace(/\s/g,"").replace(/\./g,"").replace(/ad/gi,"").replace(/ce/gi,"");

		if(sY.indexOf("B") > -1 || sY.indexOf("b") > -1) {
			sY = sY.replace(/b/gi,"");
			sY = Number(sY) * -1;
		}
		
		sD = new Date(sY,(sM - 1),1);
		if(sD > d) {
			document.getElementById('output').innerHTML = "The Seed Date must be earlier than today.";
			return false;
		}
		
		monthRatio = Math.round((Number(sM)/13)*100)/100;
		
		seed = Number(sY) + monthRatio;
		
		seedAbs = seed + 3113;
		
		seedLapse = seedAbs/cycle;
		
		seedAbsPhi = seedLapse * 0.618;
		
		seedBalance = cycle - seedAbs;
		
		seedInterval = seedAbsPhi * seedBalance;
		
		seedAbs2 = seedAbs + seedInterval;
		
		subtotal = seedAbs2 - 3113;
		
		total = Math.round(subtotal*100)/100;
		
		totalPieces = String(total).split(".");
		
		if(Number(totalPieces[0]) < 0) {
			resultYear = String(Number(totalPieces[0]) * -1) + " BC";
		} else {
			resultYear = totalPieces[0];
		}
			
		resultMonthNum = Math.round((Number(totalPieces[1])/100) * 13);

		if(resultMonthNum == 0) {
			resultMonth = "January";
		} else if(resultMonthNum == 13) {
			resultMonth = "December";
		} else {
			resultMonth = months[resultMonthNum-1];
		}
		
		result = resultMonth + " " + resultYear;
		
	} else if(mode == 2) {
		if(document.getElementById("years").value == "") {
			document.getElementById('output').innerHTML = "You must specify a Target Date.";
			return false;
		} else if(checkNum(document.getElementById("years").value) == 0) {
			document.getElementById('output').innerHTML = "You must provide an actual date.";
			return false;
		}
		
		sM = document.getElementById("months").value;
		if(sM == "") {
			sM = tD.getMonth() + 1;
		}
		
		sY = document.getElementById("years").value;
		sY = sY.replace(/\s/g,"").replace(/\./g,"").replace(/AD/gi,"").replace(/C/gi,"").replace(/E/gi,"");

		if(sY.indexOf("B") > -1 || sY.indexOf("b") > -1) {
			sY = sY.replace(/B/gi,"");
			sY = Number(sY) * -1;
		}

		sD = new Date(sY,(sM - 1),1);
		if(sD < d) {
			document.getElementById('output').innerHTML = "The Seed Date must be later than today.";
			return false;
		}
		
		monthRatio = Math.round((Number(sM)/13)*100)/100;
		
		seed = Number(sY) + monthRatio;
		
		seedAbs = seed + 3113;
		
		seedAbsPhi = seedAbs * 0.618;
		
		seedAbs2 = seedAbs - seedAbsPhi;
		
		subtotal = seedAbs2 - 3113;
		
		total = Math.round(subtotal*100)/100;
		
		totalPieces = String(total).split(".");
		
		if(Number(totalPieces[0]) < 0) {
			resultYear = String(Number(totalPieces[0]) * -1) + " BC";
		} else {
			resultYear = totalPieces[0];
		}
			
		resultMonthNum = Math.round((Number(totalPieces[1])/100) * 13);

		if(resultMonthNum == 0) {
			resultMonth = "January";
		} else if(resultMonthNum == 13) {
			resultMonth = "December";
		} else {
			resultMonth = months[resultMonthNum-1];
		}
		
		result = resultMonth + " " + resultYear;
	
	} else if(mode == 3) {
		if(document.getElementById("ages").value == "") {
			document.getElementById('output').innerHTML = "You must specify a Seed Age.";
			return false;
		} else if(checkNum(document.getElementById("ages").value) == 0) {
			document.getElementById('output').innerHTML = "You must provide an actual age.";
			return false;
		}
		
		seed = document.getElementById("ages").value;
		
		seed = seed.replace(/\s/g,"").replace(/A/gi,"").replace(/B/gi,"").replace(/C/gi,"").replace(/D/gi,"").replace(/E/gi,"").replace(/\-/gi,"");
		
		add = Number(seed) * 0.618;
		total = Number(seed) + Number(add)
		result = Math.round(total*100)/100;
		
	}
	
	document.getElementById('fractal').innerHTML = result;
}

function reset() {
	document.getElementById("cycle").style.display = "";
	document.getElementById("cycleLabel").style.display = "";
	document.getElementById("seedLabel").innerHTML = "Seed Date";
	document.getElementById("modeNone").checked = "checked";
	document.getElementById("cycle").innerHTML = "?";
	document.getElementById("seed").innerHTML = "?";
	document.getElementById("fractal").innerHTML = "&nbsp;";
	document.getElementById("output").innerHTML = "";
}

function displayMonths() {
	mValue = "<select id='months'>";
	mValue += "<option value=''>Month</option>";
	
	for(m in months) {
		mValue += "<option value='" + (Number(m)+1) + "'>" + months[m] + "</option>";
	}
	
	mValue += "</select>";
	
	return mValue;
}

function displayYears() {
	yValue = "<input type='text' id='years' style='width:70px;' />";
	/*yValue += "<option value=''>Year</option>";
	
	if(mode == 1) {
		for(i=thisYear;i>=1800;i--) {
			yValue += "<option value='" + i + "'>" + i + "</option>";
		}
	} else {
		for(i=thisYear;i<=maxYear;i++) {
			yValue += "<option value='" + i + "'>" + i + "</option>";
		}
	}
	
	yValue += "</select>";*/
	
	return yValue;
}

function displayAges() {
	aValue = "<input type='text' id='ages' style='width:70px;' />";
	/*aValue += "<option value=''>Age</option>";
	
	for(i=1;i<106;i++) {
		aValue += "<option value='" + i + "'>" + i + "</option>";
	}
	
	aValue += "</select>";*/
	
	return aValue;
}