/*
This Script is Copyright by Tub (spam@authmann.de).

see index.html for full copyright information.
*/

var classnames = new Array("", "amazon", "assassin", "barbarian", "druid", "necromancer", "paladin", "sorceress");
var classnames_readable = new Array("", "Amazon", "Assassin", "Barbarian", "Druid", "Necromancer", "Paladin", "Sorceress");
var skillnames;
var func_constraints;

var CURRENT_PATCH = "1F9";
var CURRENT_PATCH_READABLE;

var IS_1E9_OR_NEWER = true;

var cname = "";
var slvl = new Array();
var max = new Array();
var classnr;
var clvl;
var slvlmax;
var slvlskillbonus;
var slvlitembonus;
var ennead;
var blackroad;
var energy;

function changeVersion()
{
	var v = getFormElement("version");
	CURRENT_PATCH = v.value;
	CURRENT_PATCH_READABLE = v.options[v.selectedIndex].text;

	IS_1E9_OR_NEWER = (CURRENT_PATCH != "199d" && CURRENT_PATCH != "1A9" && CURRENT_PATCH != "1D9");

	switch(CURRENT_PATCH)
	{
		case "199d":
			show("ac500_row");
			hide("minigamerow");
			hide("signetofskillrow");
			set("toraja_bonus", "5");
			getFormElement("q7").value = 5;
			skillnames = skillnames_199d;
			func_constraints = check_constraints_199d;
			break;
		case "1A9":
			hide("ac500_row");
			uncheck("ac500");
			hide("minigamerow");
			hide("signetofskillrow");
			set("toraja_bonus", "1");
			getFormElement("q7").value = 1;
			skillnames = skillnames_1A9;
			func_constraints = check_constraints_1A9;
			break;
		case "1D9":
			hide("ac500_row");
			uncheck("ac500");
			hide("minigamerow");
			hide("signetofskillrow");
			set("toraja_bonus", "1");
			getFormElement("q7").value = 1;
			skillnames = skillnames_1D9;
			func_constraints = check_constraints_1D9;
			break;
		case "1E9":
			hide("ac500_row");
			uncheck("ac500");
			show("minigamerow");
			show("signetofskillrow");
			set("toraja_bonus", "1");
			getFormElement("q7").value = 1;
			skillnames = skillnames_1E9;
			func_constraints = check_constraints_1E9;
			break;
		case "1F9":
			hide("ac500_row");
			uncheck("ac500");
			show("minigamerow");
			show("signetofskillrow");
			set("toraja_bonus", "1");
			getFormElement("q7").value = 1;
			skillnames = skillnames_1F9;
			func_constraints = check_constraints_1F9;
			break;
	}
	changeClass();
}

function changeClass()
{
	classnr = get("class");

	// sorceress
	if (classnr == 7)
		show("venefica");
	else
		hide("venefica");

	// amazon
	if (classnr == 1 && (CURRENT_PATCH == "199d" || CURRENT_PATCH == "1A9"))
		show("energy_row");
	else
		hide("energy_row");

	for (var i=1;i<=30;i++)
	{
		var img = document.getElementById("skill"+i+"_img");
		if (img)
		{
			// replace with a blank image, so missing skillicons can be found
			img.setAttribute("src", "skillicons/blank.gif");

			var newimg = new Image();
			var skillname = skillnames[classnr][i].replace(/ /g, "");

			if (i >= 29)
				newimg.src = "skillicons/specials/"+skillname+".gif";
			else
				newimg.src = "skillicons/"+classnames[classnr]+"/"+skillname+".gif";
			img.setAttribute("src", newimg.src);
		}
		set("skill"+i+"_name", skillnames[classnr][i]);
	}

	recalculate();
}

function recalculate()
{
	classnr = get("class");
	clvl = parse("clvl", 1, 120);
	// uncheck quests that cannot have been finished
	if (clvl < 40)
	{
		for (var q=1;q<=3;q++)
			uncheck("q"+q+"_2");
		uncheck("m3");
		for (var q=0;q<3;q++)
			uncheck("sos"+q);
	}
	if (clvl < 20)
	{
		for (var q=1;q<=3;q++)
			uncheck("q"+q+"_1");
		for (var q=0;q<3;q++)
			uncheck("m"+q);
	}
	if (clvl < 100)
		for (var q=4;q<=9;q++)
			uncheck("q"+q);
	if (clvl < 120)
		uncheck("q7");

	if (clvl < 90)
	{
		uncheck("ennead");
		uncheck("blackroad");
	}
	if (clvl < 100)
		uncheck("ac500");

	var pavail = (clvl-1);
	for (var q=1;q<=3;q++)
		for (var d=0;d<3;d++)
			pavail += get("q"+q+"_"+d);
	if (IS_1E9_OR_NEWER)
		for (var q=0;q<3;q++)
			pavail += get("sos"+q);

	set("pavail", pavail);


	energy = 0;
	if (classnr == 1 && (CURRENT_PATCH == "199d" || CURRENT_PATCH == "1A9"))
		energy = parse("energy", 15, 1125);

	slvlmax = Math.floor(clvl / 6)+2; // for lvl 1 skills
	slvlitembonus = 0;
	for (var q=4;q<=8;q++)
		slvlitembonus += get("q"+q);
	if (classnr == 7)
		slvlitembonus += get("q9");
	if (CURRENT_PATCH == "199d")
		slvlitembonus += get("ac500");
	if (IS_1E9_OR_NEWER)
		for (var q=0;q<4;q++)
			slvlitembonus += get("m"+q);

	slvlskillbonus = 0;

	ennead = get("ennead");
	blackroad = get("blackroad");

	for (var i=1;i<=30;i++)
	{
		slvl[i] = get("skill"+i+"_points");
		if (slvl[i] < 0)
			slvl[i] = 0;
	}

	var all_ok = false;
	while (!all_ok)
		all_ok = checkConstraints();

	set("slvlbonus", slvlskillbonus+slvlitembonus);

	for (var i=1;i<=30;i++)
	{
		set("skill"+i+"_max", max[i]);
		var disabled = true;
		var fi;
		fi = getFormElement("skill"+i+"_points");
		fi.disabled = (max[i] == 0);
		if (slvl[i] > 0 && max[i] == slvl[i])
			fi.style.backgroundColor="#C97F7F";
		else
			fi.style.backgroundColor="";
		fi = getFormElement("skill"+i+"_plus");
		fi.style.visibility = (slvl[i] < max[i]) ? "visible" : "hidden";
		fi = getFormElement("skill"+i+"_minus");
		fi.style.visibility = (slvl[i] > 0) ? "visible" : "hidden";
	}

	var pspent = 0;
	for (var i=1;i<=30;i++)
	{
		set("skill"+i+"_max", max[i] > 0 ? ("max: "+max[i]) : "");
		var fi = getFormElement("skill"+i+"_points");
		fi.value = slvl[i];
		pspent += slvl[i];
	}
	set("pspent", pspent, pspent > pavail);
}

function raiseMax(i, amount)
{
	if (max[i] > 0)
		max[i] += amount;
}
function lockout(from, to)
{
	if (to == null)
		to = from;
	for (var i=from;i<=to;i++)
		max[i] = 0;
}
function checkConstraints()
{
	// set slvl[i] and all the other globals before calling
	// max[i] is filled by this function, then slvl[i] is checked

	slvlskillbonus = 0;

	for (var i=1;i<=30;i++)
	{
		var base = (i-1) % 5;
		if (i > 25)
			base = 15;
		max[i] = slvlmax + slvlitembonus - base;
		if (max[i] < 0)
			max[i] = 0;
		// high enough to learn this skill?
		if (slvl[i] < 0)
			slvl[i] = 0;
		if (clvl < base*6)
			slvl[i] = max[i] = 0;
	}

	// only one uber skill each
	if (slvl[26] > 0)
		max[27] = max[28] = 0;
	if (slvl[27] > 0)
		max[26] = max[28] = 0;
	if (slvl[28] > 0)
		max[26] = max[27] = 0;

	if (!ennead)
		lockout(29);
	if (!blackroad)
		lockout(30);

	func_constraints();

	// lockouts based on prereqs
	for (var i=0;i<5;i++)
	{
		var base = i*5+1;
		for (var s=base;s<base+4;s++)
		{
			if (max[s] == 0 || slvl[s] == 0)
				max[s+1] = 0;
		}
	}

	for (var i=1;i<=30;i++)
		raiseMax(i, slvlskillbonus);

	var all_ok = true;
	for (var i=1;i<=30;i++)
		if (slvl[i] > max[i])
		{
			all_ok = false;
			slvl[i] = max[i];
		}

	return all_ok;
}


function checkAll(state)
{
	for (var q=1;q<=3;q++)
		for (var d=0;d<3;d++)
			check("q"+q+"_"+d, state);
	var max = 8;
	if (classnr == 7)
		max = 9;
	for (var q=4;q<=max;q++)
		check("q"+q, state);
	check("ennead", state);
	check("blackroad", state);
	check("ac500", state && (CURRENT_PATCH == "199d"));

	for (var q=0;q<4;q++)
		check("m"+q, state && IS_1E9_OR_NEWER);
	for (var q=0;q<3;q++)
		check("sos"+q, state && IS_1E9_OR_NEWER);

	recalculate();
}

function changeSkill(nr, amount)
{
	var fi = getFormElement("skill"+nr+"_points");
	var slvl = parseInt(fi.value);
	var slvl_new = 0;
	var slvl_target = slvl + amount;
	if (slvl_target < 0)
		slvl_target = 0;
	do {
		fi.value = slvl_target;
		recalculate();
		slvl_new = parseInt(fi.value);
	} while (slvl_new < slvl_target && slvl_new < max[nr]);
}

function clickRaise(event, skill)
{
	if (event.shiftKey)
		changeSkill(skill, 50);
	else
		changeSkill(skill, 1);
}

function clickLower(event, skill)
{
	if (event.shiftKey)
		changeSkill(skill, -100);
	else
		changeSkill(skill, -1);
}

function resetSkills()
{
	for (var i=1;i<=30;i++)
	{
		var fi = getFormElement("skill"+i+"_points");
		fi.value = "0";
	}
	recalculate();
}

function changeName()
{
	var title = "Skillpoint-Planner for MedianXL";
	var fi = getFormElement("cname");
	cname = fi.value;
	if (cname == "")
	{
		document.title = title;
	}
	else
	{
		document.title = cname + " (" + classnames_readable[classnr] + ") - " + title;
	}
}

function do_load()
{
	var url = window.location.href.split("?")[1];
	if (!url)
		return;

	var s_class = url.match(/class=[1-7]/)[0];
	if (!s_class)
		return;
	classnr = parseInt(s_class.slice(6));
	var class_select = getFormElement("class");
	class_select.options.selectedIndex = classnr-1;

	var patch = url.match(/v=[1-9A-Fd]+/);
	if (!patch)
		patch = "199d";
	else
		patch = patch[0].slice(2);
	CURRENT_PATCH = patch;
	IS_1E9_OR_NEWER = (CURRENT_PATCH != "199d" && CURRENT_PATCH != "1A9" && CURRENT_PATCH != "1D9");
	var version_select = getFormElement("version");
	for (var i=0; i<version_select.options.length; i++)
	{
		if (version_select.options[i].value == CURRENT_PATCH)
		{
			version_select.options.selectedIndex = i;
			break;
		}
	}
	var s_bonus = url.match(/bonus=[01]+/)[0];
	if (!s_bonus || s_bonus.length < 23)
		return;
	if (CURRENT_PATCH == "199d")
	{
		check("ac500", s_bonus.charAt(17) == "1");
		s_bonus = s_bonus.substr(0, 17) + s_bonus.substr(18);
	}

	for (var q=1;q<=3;q++)
		for (var d=0;d<3;d++)
			check("q"+q+"_"+d, (s_bonus.charAt(3+3*q+d) == "1"));
	check("ennead", (s_bonus.charAt(15) == "1"));
	check("blackroad", (s_bonus.charAt(16) == "1"));
	for (var q=4;q<=9;q++)
		check("q"+q, (s_bonus.charAt(q+13) == "1"));

	energy = 15;
	if (classnr == 1 && (CURRENT_PATCH == "199d" || CURRENT_PATCH == "1A9"))
	{
		var s_energy = url.match(/energy=[0-9]+/)[0];
		if (s_energy)
			energy = parseInt(s_energy.slice(7));
	}
	var fi = getFormElement("energy");
	fi.value = energy;

	var s_skills = url.match(/skills=[0-9_]+/)[0];
	if (!s_skills || s_skills.length < 67)
		return;
	var a_skills = s_skills.slice(7).split("_");
	for (var i=1;i<=30;i++)
	{
		slvl[i] = parseInt(a_skills[i-1]);
		var fi = getFormElement("skill"+i+"_points");
		fi.value = slvl[i];
	}

	if (IS_1E9_OR_NEWER)
	{
		var mg_bonus = url.match(/mg=[01]+/)[0];
		if (!mg_bonus || mg_bonus.length < 7)
			return;
		for (var q=0;q<4;q++)
			check("m"+q, (mg_bonus.charAt(q+3) == "1"));

		var sos_bonus = url.match(/sos=[0123]/)[0];
		if (!sos_bonus || sos_bonus.length != 5)
			return;
		var sos_num = parseInt(sos_bonus.charAt(4));
		for (var q=0;q<sos_num;q++)
			check("sos"+q, true);
		for (var q=sos_num;q<3;q++)
			check("sos"+q, false);
	}

	var s_name = url.match(/name=.*/)[0];
	if (!s_name)
		return;
	cname = decodeURI(s_name.slice(5));
	var fi = getFormElement("cname");
	fi.value = cname; //.replace(/%20/g, " ");
	changeName();
}

function load()
{
	if (do_load() == -1)
		return;
	changeVersion(CURRENT_PATCH);
	//changeClass();
}

function save()
{
	var url = "v="+CURRENT_PATCH;
	url += "&class=" + classnr + "&bonus=";

	for (var q=1;q<=3;q++)
		for (var d=0;d<3;d++)
			url += get("q"+q+"_"+d) > 0 ? "1" : "0";
	url += get("ennead") > 0 ? "1" : "0";
	url += get("blackroad") > 0 ? "1" : "0";
	if (CURRENT_PATCH == "199d")
		url += get("ac500") > 0 ? "1" : "0";
	for (var q=4;q<=9;q++)
		url += get("q"+q) > 0 ? "1" : "0";

	if (classnr == 1 && (CURRENT_PATCH == "199d" || CURRENT_PATCH == "1A9"))
		url += "&energy="+energy;

	url += "&skills=";

	for (var i=1;i<=30;i++)
		url += slvl[i]+"_";

	if (IS_1E9_OR_NEWER)
	{
		url += "&mg=";
		for (var q=0;q<4;q++)
			url += get("m"+q) > 0 ? '1' : '0';

		var sos_bonus = 0;
		for (var q=0;q<3;q++)
			sos_bonus += get("sos"+q);
		url += "&sos=" + sos_bonus;
	}

	url += "&name=" + encodeURIComponent(cname);

	//var base_url = window.location.href.split("?")[0];
	var base_url = "http://www.authmann.de/d2/mxl/skillpointplanner/";

	var absolute_url = base_url + "?" + url;

	if (window.location.href.match(/authmann.de/))
		hide("save_locally");
	else
		show("save_locally");

	var descr = "Skillplan "+cname + " (" +classnames_readable[classnr] + ", " + CURRENT_PATCH_READABLE + ")";

	set("save_url", descr);
	document.getElementById("save_url").href = absolute_url;

	var bb = document.getElementById("save_bbcode");
	bb.value = "[url="+absolute_url+"]"+descr+"[/url]";

	hideSave(false);

	bb.focus();
	bb.select();
/*
	alert("This Script will now reload itself.\nJust bookmark the new URL to save your character.");
	window.location.href = absolute_url;
*/
}

function hideSave(h)
{
	if (h == false)
	{
		show("blackout");
		show("overlay_save");
		show("overlay");
	}
	else
	{
		hide("blackout");
		hide("overlay_save");
		hide("overlay");
	}
}

function showFaq(h)
{
	if (h == false)
	{
		hide("blackout");
		hide("overlay_faq");
		hide("overlay");
	}
	else
	{
		show("blackout");
		show("overlay_faq");
		show("overlay");
	}
}