baseattack = 0;
weaponattack = 0;
minweaponattack = 0;
totalattack = 0;
mintotalattack = 0;
maxsp = 0;
dangerousupgrade = 0;
overupgrade = 0;
slots = 0;
casttime = 0;
cardeffect = new Array (0, 0, 0, 0, 0);

weapons = new Array();
weapons[1] = new Array('None', 0, 0, 0);
weapons[2] = new Array('Club', 23, 4, 1);
weapons[3] = new Array('Mace', 37, 4, 1);
weapons[4] = new Array('Chain', 84, 3, 2);
weapons[5] = new Array('Smasher', 54, 3, 2);
weapons[6] = new Array('Flail', 69, 2, 3);
weapons[7] = new Array('Spike', 85, 0, 4);
weapons[8] = new Array('Golden_Mace', 110, 1, 3);
weapons[9] = new Array('Morning_Star', 110, 2, 3);
weapons[10] = new Array('Wrench', 115, 0, 3);
weapons[11] = new Array('Swordmace', 130, 1, 3);
weapons[12] = new Array('Long_Mace', 135, 0, 4);
weapons[13] = new Array('Grand_Cross', 140, 0, 4);
weapons[14] = new Array('Stunner', 140, 0, 3);
weapons[15] = new Array('Slash', 145, 0, 4);
weapons[16] = new Array('Iron_Driver', 155, 0, 4);
weapons[17] = new Array('Quadrille', 165, 0, 4);
weapons[18] = new Array('Rod', 15, 4, 1);
weapons[19] = new Array('Wand', 25, 4, 1);
weapons[20] = new Array('Bone_Wand', 40, 0, 2);
weapons[21] = new Array('Staff', 40, 3, 2);
weapons[22] = new Array('Arc_Wand', 60, 2, 3);
weapons[23] = new Array('Wand_of_Occult', 75, 0, 3);
weapons[24] = new Array('Mighty_Staff', 130, 0, 3);
weapons[25] = new Array('Waghnak', 30, 4, 1);
weapons[26] = new Array('Knuckle_Duster', 50, 3, 2);
weapons[27] = new Array('Studded_Knuckle', 65, 3, 2);
weapons[28] = new Array('Claw', 86, 2, 3);
weapons[29] = new Array('Finger', 97, 3, 2);
weapons[30] = new Array('Kaiser_Knuckle', 110, 0, 4);
weapons[31] = new Array('Fist', 115, 1, 3);
weapons[32] = new Array('Berserk', 120, 0, 4);

function asura_changeweapon()
{
	for (i = 1; i <= 4; i++)
		document.getElementsByName("card_" +i)[0].disabled = true;
		
	slots = weapons[ival("weapon")][2];
	
	for (i = 1; i <= slots; i++)
		document.getElementsByName("card_" +i)[0].disabled = false;
}

function asura_save()
{
	calc_damage("damage_2");
	document.getElementById("maxsp_2").innerHTML = "Max SP: " +maxsp;	
	document.getElementById("casttime_2").innerHTML = "Casttime: " +casttime;
	document.getElementById("s_base").innerHTML = "Base Level: " +val("baselevel");
	document.getElementById("s_job").innerHTML = "Job Level: " +val("joblevel");	
	document.getElementById("s_str").innerHTML = "Str: " +val("str");
	document.getElementById("s_dex").innerHTML = "Dex: " +val("dex");	
	document.getElementById("s_int").innerHTML = "Int: " +val("int");	
	document.getElementById("s_luk").innerHTML = "Luk: " +val("luk");

	document.getElementById("s_head_top").innerHTML = "Head: " + document.getElementsByName("eq_top")[0].options[document.getElementsByName("eq_top")[0].selectedIndex].text.split(",")[0];
	document.getElementById("s_head_mid").innerHTML = "Head: " + document.getElementsByName("eq_mid")[0].options[document.getElementsByName("eq_mid")[0].selectedIndex].text.split(",")[0];
	document.getElementById("s_armor").innerHTML = "Armor: " + document.getElementsByName("eq_armor")[0].options[document.getElementsByName("eq_armor")[0].selectedIndex].text.split(",")[0];
	document.getElementById("s_shoes").innerHTML = "Shoes: " + document.getElementsByName("eq_shoes")[0].options[document.getElementsByName("eq_shoes")[0].selectedIndex].text.split(",")[0];
	document.getElementById("s_acc_1").innerHTML = "Acc 1: " + document.getElementsByName("eq_acc_1")[0].options[document.getElementsByName("eq_acc_1")[0].selectedIndex].text.split(",")[0];
	document.getElementById("s_acc_2").innerHTML = "Acc 2: " + document.getElementsByName("eq_acc_2")[0].options[document.getElementsByName("eq_acc_2")[0].selectedIndex].text.split(",")[0];

	document.getElementById("s_weapon").innerHTML = "Weapon: +" + document.getElementsByName("weaponupgrade")[0].value + " " + document.getElementsByName("weapon")[0].options[document.getElementsByName("weapon")[0].selectedIndex].text.split(",")[0];;

	for (i = 1; i <= 4; i++)
	{
		if (i <= slots)
			document.getElementById("s_card_" +i).innerHTML = "Card " +i+ ": " + document.getElementsByName("card_" +i)[0].options[document.getElementsByName("card_" +i)[0].selectedIndex].text.replace(/damage vs./, "");
		else
			document.getElementById("s_card_" +i).innerHTML = "";
	}
}
	
function asura_update()
{
	cardeffect = new Array (0, 0, 0, 0, 0);
	baseattack = 0;
	weaponattack = 0;
	minweaponattack = 0;
	totalattack = 0;
	mintotalattack = 0;
	maxsp = 0;
	dangerousupgrade = 0;
	overupgrade = 0;
	casttime = 0;
		
	var checkArray = new Array("baselevel", "joblevel", "str", "dex", "luk", "int", "c_sp");
	
	for (i = 0; i < 7; i++)
	{
		if (document.getElementById(checkArray[i]) != null)
		{	
			if (ival(checkArray[i]) < 1)
			{
				document.getElementById(checkArray[i]).value = 1;
			}
		}
	}
	
	calc_maxsp();	
	calc_equipment();
	calc_baseattack();
	calc_weaponattack();
	calc_upgrade();
	calc_casttime();
	
	calc_damage();
	document.getElementById("maxsp").innerHTML = "Max SP: " +maxsp;	
	document.getElementById("casttime").innerHTML = "Casttime: " +casttime;
}

function calc_maxsp()
{
	var level = ival("baselevel");
	var inte = ival("int");
	var jobclass = rval("class");
	
	if (jobclass == "monk")
		maxsp = Math.floor((10 + Math.floor((level * 4.7))) * (1 + (inte / 100)));
	else
		maxsp = Math.floor((10 + Math.floor((level * 4.7)) * 125 / 100) * (100 + inte) / 100);
	
	
}
	
function calc_baseattack()
{
	var str = ival("str");
	var dex = ival("dex");
	var luk = ival("luk");
	
	// Standard base attack from stats + card effects
	baseattack += str + Math.floor(str / 10) * Math.floor(str / 10) + Math.floor(dex / 5) + Math.floor(luk / 5) + cardeffect[4];

	// Impositio
	baseattack += ival("impositio") * 5;
}

function calc_weaponattack()
{
	weaponattack = weapons[ival("weapon")][1];

	minweaponattack = Math.floor(Math.min(ival("dex") * (0.8 + 0.2 * weapons[ival("weapon")][3]), weaponattack));
	
	if (val("enemysize") == "small")
	{	
		weaponattack = Math.floor(weaponattack * 0.75);
		minweaponattack = Math.floor(minweaponattack * 0.75);	
	}
	
	totalattack = baseattack + weaponattack;
	mintotalattack = baseattack + minweaponattack;
	
	if (document.getElementsByName("powerthrust")[0].checked == true)
	{
		totalattack = Math.floor(totalattack * 1.05);
		mintotalattack = Math.floor(mintotalattack * 1.05);
	}	
	
	var provoke = ival("provoke");
	if (provoke > 0)
	{
		totalattack *= ((2 + provoke * 3) / 100 + 1 );
		mintotalattack *= ((2 + provoke * 3) / 100 + 1); 
	}

}

function calc_casttime()
{
	var basecasttime = 4.5 - (ival("asuralevel") / 2);
	
	if (document.getElementsByName("phen")[0].checked == true)
		basecasttime *= 1.25;
		
	// !! Bragi
	
	var suffreduction = new Array(1, 0.85, 0.7, 0.55);

	casttime = Math.floor(basecasttime * 50 * (150 - ival("dex")) / 150) / 50;	
	casttime *= suffreduction[ival("suffragium")];
}
	

function calc_upgrade()
{
	var weaponlevel = weapons[ival("weapon")][3];
	var weaponupgrade = ival("weaponupgrade");
	var factors = new Array (3, 5, 8, 14);
	
	if (weaponupgrade > 8 - weaponlevel)
	{
		overupgrade = weaponupgrade - 8 + weaponlevel;
		dangerousupgrade = overupgrade * factors[(weaponlevel - 1)];
		
	}	
}	

function calc_equipment()
{
	var maxspplus = 0;
	var maxsptimes = 1;
	
	for (i = 1; i <= slots; i++)
	{
		switch (ival("card_" +i))
		{
			case 0:
				break;
			case 1:
				cardeffect[2] += 25;
				break;
			case 2:
				cardeffect[1] += 20;
				break;
			case 3:
				cardeffect[0] += 20;
				break;
			case 4:
				cardeffect[3] += 15;
				cardeffect[4] += 5;
				break;
			case 5:
				cardeffect[4] += 20;
				break;	
		}
	}
	
	switch (ival("eq_top"))
	{
		case 0:
			break;
		case 1:
			maxspplus += 102;
			break;
		case 2:
			maxspplus += 80;
			break;
		case 3:
			maxspplus += 50;
			break;
		case 4:
			maxspplus += 20;
			break;
		case 5:
			maxspplus += 150;
			break;
		case 6:
			maxspplus += ival("joblevel") * 3;
			break;
	}
	
	switch (ival("eq_mid"))
	{
		case 0:
			break;
		case 1:
			cardeffect[0] += 3;
			break;
		case 2:
			maxspplus += 80;
			break;
		case 3:
			alert ("NOT ALLOWED. Your IP has been forwarded to euRO GM team for further investigation. Just kidding. :p");
			document.getElementsByName("eq_mid")[0].value = 0;
			break;
		case 4:
			maxspplus += ival("joblevel") * 3;
			break;
	}
	
	switch (ival("eq_armor"))
	{
		case 0:
			break;

			case 1:
			maxspplus += 50;
			break;
		case 2:
			baseattack += 10;
			break;
	}
	
	switch (ival("eq_shoes"))
	{
		case 0:
			break;
		case 1:
			maxsptimes *= 1.15;
			break;
		case 2:
			maxsptimes *= 1.08;
			break;
		case 3:
			maxsptimes *= 1.10;
			break;
		case 4:
			maxsptimes *= 1.20;
			break;
	}
	
	switch (ival("eq_acc_2"))
	{
		case 0:
			break;
		case 1:
			maxspplus += 10;
			break;
		case 2:
			maxspplus += 2;
			maxsptimes *= 1.05;
		case 3:
			baseattack += 10;
			break
	}

	switch (ival("eq_acc_1"))
	{
		case 0:
			break;
		case 1:
			maxspplus += 10;
			break;
		case 2:
			maxspplus += 2;
			maxsptimes *= 1.05;
		case 3:
			baseattack += 10;
			break
		case 4:
			baseattack *= 1.05;
			break;
	}	
	
	maxsp = Math.floor((maxsp + maxspplus) * maxsptimes);
		
}

function calc_damage(destination)
{
	if (destination == null)
		destination = "damage";
		
	var asuralevel = ival("asuralevel");
	var sp = new Array();
	var asuradamage = new Array(
		new Array(),
		new Array(),
		new Array(),
		new Array()
	);
	
	var damagereduction = (1 - (cset('immune') ? 0.2 : 0)) // Element
						* (1 - (cset('ghostring') ? 0.75 : 0)) // Ghost
						* (1 - (cset('energycoat') ? 0.3 : 0)) // EnergyCoat
						* (1 - ((cset('cranial') ? 0.3 : 0) + (cset('poopoo') ? 0.1 : 0))) // Race
						* (1 - (cset('assumptio') ? 0.33 : 0));
						
	var table = "<table class=\"tbl_result\">\n"
			  + "<tr>"
			  + "<th>SP left</th><th>Min</th><th>Average</th><th>Max</th><th>PvP</th><th>WoE</th>"
			  + "</tr>";
			  
	for (i = 0; i < 12; i++)
	{
		table += "<tr>";
		
		// SP value
		if (i == 11)
		{
			if (document.getElementById("c_sp") != null)
				sp[i] = (ival("c_sp"));
			else
				sp[i] = 0;
		}
		else
			sp[i] = Math.floor(maxsp * ((i*10) / 100));
		
		// min damage
		asuradamage[1][i] = (mintotalattack + overupgrade) * (8 + (sp[i] - 1) / 10) + 250 + 150 * asuralevel;
		
		// max damage
		asuradamage[3][i] = (totalattack + dangerousupgrade) * (8 + (sp[i] - 1) / 10) + 250 + 150 * asuralevel;

		// addin card effects
		for (k = 0; k < 4; k++)
		{
			asuradamage[1][i] *= ((cardeffect[k] / 100) + 1);
			asuradamage[3][i] *= ((cardeffect[k] / 100) + 1);
		}
		
		asuradamage[1][i] = Math.floor(asuradamage[1][i]);
		asuradamage[3][i] = Math.floor(asuradamage[3][i]);
		asuradamage[2][i] = Math.floor((asuradamage[1][i] + asuradamage[3][i]) / 2);
		
		// building table
		table += "<td class=\"spleft\">"
			   + (i == 11 && destination == "damage"
			     ? "<button onclick=\"document.getElementById('c_sp').value--; asura_update();\" />-</button>"
			   + "<input type=\"text\" name=\"c_sp\" id=\"c_sp\" size=\"4\" maxlength=\"4\" value=\"" +sp[i]+ "\" onchange=\"asura_update();\" />"
			   + "<button onclick=\"document.getElementById('c_sp').value++; asura_update();\" />+</button>"
			     : sp[i])
			   + "</td>"
			   + "<td class=\"mindmg\">" +asuradamage[1][i]+ "</td>"
			   + "<td class=\"avgdmg\">" +asuradamage[2][i] + "</td>"
			   + "<td class=\"maxdmg\">" +asuradamage[3][i]+ "</td>"
			   + "<td class=\"pvpdmg\">" +Math.floor(asuradamage[2][i] * damagereduction)+ "</td>"
			   + "<td class=\"woedmg\">" +Math.floor(asuradamage[2][i] * damagereduction * 0.6)+ "</td>"
			   + "</tr>";
	}
	
	table += "</table>"
	
	// display table
	document.getElementById(destination).innerHTML = table
}

function val(name)
{
	return document.getElementsByName(name)[0].value;
}

function ival(name)
{
	return parseInt(val(name));	
}

function rval(name)
{
	i = 0;
	while (document.getElementsByName(name)[i] != null)
	{
		if (document.getElementsByName(name)[i].checked == true)
			return document.getElementsByName(name)[i].value;
		i++;
	}
	
	return false;
}

function cset(name)
{
	if (document.getElementsByName(name)[0].checked == true)
		return true;
	return false;
}
