var w_slot = 1;
var fakedef = 0;
var job = 0;
var cookieName = 'calc';

var oldTop, oldMid, oldBot;
var sorta, sortb, sortc;

var restrict = [];
var name_aspd = new Array("None","Concentration","Awakening","Berserk");
var skill_o = ["o_ble","e_ble","o_agiu","o_cur","e_agiu","e_cur","o_pro","e_pro","o_qua","e_qua","o_bli","e_bli","o_poi","e_poi","o_glo","o_ang","o_adr","o_imp","o_reg","o_rs","o_mag","o_da","o_suf","o_bss","e_sig","e_sta","food_str","food_agi","food_vit","food_int","food_dex","food_luk","food_hit","food_flee","food_atk"];

function init() {
	if (update_js == xupdate_js && update_share == xupdate_share) {
		document.getElementById("table_update").innerHTML = 'Yes';
	} else {
		if (confirm('You are using what seems to be outdated files. This is likely to cause bugs or outright break the calc. Choose okay to refresh the page, cancel if you want to proceed anyway.')) location.reload(true);
		document.getElementById("table_update").innerHTML = 'No';
	}
	verifyCookies("20040926");

	var a, b;

	sortmonster();

	a = '';
	b = '';
	for (var i in item_arrow) {
		b += '<option value="' + i + '">' + item_arrow[i][0] + '</option>';
	}
	for (var i = 1; i < 4; i++) {
		a += '<select id="e_a' + i + '" onchange="calc();">';
		a += b;
		a += '</select>';
	}
	b = '';
	for (var i in item_bullet) {
		b += '<option value="' + i + '">' + item_bullet[i][0] + '</option>';
	}
	for (var i = 1; i < 4; i++) {
		a += '<select id="e_b' + i + '" onchange="calc();">';
		a += b;
		a += '</select>';
	}
	b = '';
	for (var i in item_grenade) {
		b += '<option value="' + i + '">' + item_grenade[i][0] + '</option>';
	}
	for (var i = 1; i < 4; i++) {
		a += '<select id="e_g' + i + '" onchange="calc();">';
		a += b;
		a += '</select>';
	}
	b = '';
	for (var i in item_shuriken) {
		b += '<option value="' + i + '">' + item_shuriken[i][0] + '</option>';
	}
	for (var i = 1; i < 4; i++) {
		a += '<select id="e_sh' + i + '" onchange="calc();">';
		a += b;
		a += '</select>';
	}
	document.getElementById('i_arrow').innerHTML = a;

	b = [];
	for (var i = 0; i < 7; i++) {
		b[i] = '<option value="0" selected>Card slot</option>';
	}
	for (var i in item_card) {
		b[item_card[i][2]] += '<option value="' + i + '">' + item_card[i][0] + '</option>';
	}
	for (var j = 0; j < 4; j++) {
		a = '';
		for (var i = 1; i < 4; i++) {
			a += '<select id="e_c0' + j + i + '" onchange="calc();">';
			a += b[0];
			a += '</select>';
		}
		document.getElementById('i_card0' + j).innerHTML = a;
	}
	a = '';
	for (var i = 1; i < 4; i++) {
		a += '<select id="e_c1' + i + '" onchange="calc();">';
		a += b[1];
		a += '</select>';
	}
	document.getElementById('i_card1').innerHTML = a;
	for (var j = 2; j < 10; j++) {
		a = '';
		a += '<select id="e_c' + j + '" onchange="calc();">';
		a += b[mod_equip[j][1]];
		a += '</select>';
		document.getElementById('i_card' + j).innerHTML = a;
	}

	oldTop = item_data[0];
	oldMid = item_data[0];
	oldBot = item_data[0];

	setJob();
	setWeapons(2,'none');
	setWeapons(3,'none');

	document.getElementById('loading').style.display = 'none';
	calc();
}

//var madcheck = false;

function calc() {
	var start = new Date();

// **** Base level, stats ****

	var blv = + document.getElementById("blv_sel").value;
	var jlv = + document.getElementById("jlv_sel" + mod_misc['jobsel'][job]).value;
	var fixlv = document.getElementById("fixlv").checked;

	var reqpts = 0;
	var req_pts = [], sta = [];

	for (var i = 0; i < 6; i++){
		sta[i] = + document.getElementById("sta" + i).value;
		var lvpts = Math.floor((sta[i] - 1) / 10) + 2;
		req_pts[i] = lvpts;
		reqpts += lvpts * (lvpts - 1) * 5 - 10 + lvpts * ((sta[i] - 1) % 10);
	}
	var pts = 48 - reqpts;
	if (fixlv) {
		lvpts = Math.floor((blv - 1) / 5) + 3;
		pts += lvpts * (lvpts - 1) * 5 / 2 - 18 + lvpts * (1 + ((blv - 1) % 5));
	} else {
		pts -= 3;
		var newpts = 10;
		while (true) {
			newpts += 5;
			if (pts + newpts >= 0 || newpts == 110) break;
			pts += newpts;
		}
		blv = newpts - 15;
		newpts /= 5;
		while (true) {
			pts += newpts;
			blv++;
			if (pts >= 0 || blv == 99) break;
		}
		document.getElementById("blv_sel").value = blv;
	}
	document.getElementById("lbl_reqpts").innerHTML = pts;
	document.getElementById("lbl_reqpts").className = (pts < 0) ? "attention" : "";

// **** Skills and effects ****

	var o_ble = + document.getElementById("o_ble").value;
	var o_agiu = + document.getElementById("o_agiu").value;
	var o_pro = + document.getElementById("o_pro").value;
	var o_cur = document.getElementById("o_cur").checked;
	var o_poi = document.getElementById("o_poi").checked;
	var o_bli = document.getElementById("o_bli").checked;
	var o_qua = document.getElementById("o_qua").checked;
	var o_glo = document.getElementById("o_glo").checked;
	var o_adr = document.getElementById("o_adr").checked;
	var o_mag = document.getElementById("o_mag").checked;
	var o_reg = + document.getElementById("o_reg").value;
	var o_bss = document.getElementById("o_bss").checked;
	var o_ang = + document.getElementById("o_ang").value;
	var o_imp = + document.getElementById("o_imp").value;
	var o_rs = + document.getElementById("o_rs").value;
	var o_suf = + document.getElementById("o_suf").value;
	var o_ele = + document.getElementById("o_ele" + w_slot).value;
	var o_da = + document.getElementById("o_da").value;
	var food_str = + document.getElementById("food_str").value;
	var food_agi = + document.getElementById("food_agi").value;
	var food_vit = + document.getElementById("food_vit").value;
	var food_int = + document.getElementById("food_int").value;
	var food_dex = + document.getElementById("food_dex").value;
	var food_luk = + document.getElementById("food_luk").value;
	var food_hit = document.getElementById("food_hit").checked;
	var food_flee = document.getElementById("food_flee").checked;
	var food_atk = document.getElementById("food_atk").checked;
	


	switch (job) {
		case 1 :
			var p_peac = + document.getElementById("p_peac").value;
			var p_enj = + document.getElementById("p_enj").value;
			var p_kihop = + document.getElementById("p_kihop").value;
			var p_spurt = document.getElementById("p_spurt").checked;
			var p_breakfall = document.getElementById("p_breakfall").checked;
			var p_ranker = document.getElementById("p_ranker").checked;
			break;
		case 2 :
			var p_peac = + document.getElementById("p_peac").value;
			var p_enj = + document.getElementById("p_enj").value;
			var p_kihop = + document.getElementById("p_kihop").value;
			var p_spurt = document.getElementById("p_spurt").checked;
			var p_breakfall = document.getElementById("p_breakfall").checked;
			var p_demon = + document.getElementById("p_demon").value;
			var p_suncomfort = document.getElementById("p_suncomfort").checked;
			var p_mooncomfort = document.getElementById("p_mooncomfort").checked;
			var p_starcomfort = document.getElementById("p_starcomfort").checked;
			break;
		case 3 :
			var p_peac = + document.getElementById("p_peac").value;
			var p_enj = + document.getElementById("p_enj").value;
			var p_kihop = + document.getElementById("p_kihop").value;
			var p_spurt = document.getElementById("p_spurt").checked;
			var p_breakfall = document.getElementById("p_breakfall").checked;
			var p_kaina = + document.getElementById("p_kaina").value;
			break;
		case 4 :
			var p_madness = document.getElementById("p_madness").checked;
			var p_adjust = document.getElementById("p_adjust").checked;
			var p_accuracy = document.getElementById("p_accuracy").checked;
			var p_singleaction = + document.getElementById("p_singleaction").value;
			var p_snake = + document.getElementById("p_snake").value;
			var p_chain = + document.getElementById("p_chain").value;
			var p_gatling = + document.getElementById("p_gatling").value;
			var p_coins = + document.getElementById("p_coins").value;
		/*	if (p_madness && p_adjust && madcheck) {
				document.getElementById("p_adjust").checked = false;
			}else if (p_madness && p_adjust) {
				madcheck = true;
				document.getElementById("p_madness").checked = false;
				}*/		
		//	madcheck = p_madness;
/*			if ((oldcheck == 2) && document.getElementById("p_madness").checked && document.getElementById("p_adjust").checked){
				oldcheck = 1;
				document.getElementById("p_adjust").checked = false;
			} else if ((oldcheck == 1) && document.getElementById("p_madness").checked && document.getElementById("p_adjust").checked){
				oldcheck = 2;
				document.getElementById("p_madness").checked = false;
			} else if (document.getElementById("p_madness").checked) {oldcheck = 1;} else if (document.getElementById("p_adjust").checked){oldcheck = 2;} 
			*/		
//			if (p_adjust) document.getElementById("p_madness").checked = false
//			p_adjold = document.getElementById("p_adjust").checked;
//			p_madold = document.getElementById("p_madness").checked;
//			var p_peac = + document.getElementById("p_peac").value;
			break;
		case 5 :
			var p_smast = + document.getElementById("p_smast").value;
			var p_nspr = + document.getElementById("p_nspr").value;
			var p_soul = + document.getElementById("p_soul").value;
			break;
		default :
			break;
	}


var party_size = + document.getElementById("i_party").value;

// **** Restrict ****

	var f_aspd = document.getElementById("p_aspd")
	var p_aspd = + f_aspd.value;
	var t_aspd = blv < 40 ? 1 : (blv < 85 ? 2 : 3);

	if (p_aspd > t_aspd) {
		alert('Your level is too low to use ' + name_aspd[p_aspd] + ' potions.');
		p_aspd = t_aspd;
		f_aspd.value = p_aspd;
	}



// **** Equipment, cards, elements ****

	var enemy = enemies[+ document.getElementById("enemy_sel").value];
	enemy.calcEnemy();
	var equip = [], equip_card = [], equip_ref = [], equip_ele = [];
	var wType, wName;

	equip[0] = item_data[+ document.getElementById("e_s0" + w_slot).value];
	equip[1] = item_data[+ document.getElementById("e_s1" + w_slot).value];
	for (var i = 2; i < 10; i++) equip[i] = item_data[document.getElementById("e_s" + i).value];

	var arrow = document.getElementById("e_a" + w_slot);
	var equip_arrow = item_arrow[arrow.value];

	var bullet = document.getElementById("e_b" + w_slot);
	var equip_bullet = item_bullet[bullet.value];

	var grenade = document.getElementById("e_g" + w_slot);
	var equip_grenade = item_grenade[grenade.value];

	var shuriken = document.getElementById("e_sh" + w_slot);
	var equip_shuriken = item_shuriken[shuriken.value];

	wType = (equip[0][7] < 0) ? 0 : equip[0][7];
	wName = name_weapon[wType];
	wRange = (wName == "bow" || wName == "whip" || wName == "instrument" || wName == "revolver" || wName == "rifle" || wName == "shotgun" || wName == "gatling" || wName == "launcher") ? true : false;

	var override;
	if (oldTop[1] != equip[2][1]) {
		if (equip[3][7] % 8 == 0 && (equip[2][7] % 7 == 0 || equip[2][7] % 8 == 0)) override = true;
		if (equip[2][7] % 7 == 0 || oldTop[7] % 7 == 0 || override) {
			document.getElementById("e_s3").options[0].innerHTML = (equip[2][7] % 7 == 0) ? "(used by upper)" : name_location[3];
			document.getElementById("e_s3").value = 0;
			equip[3] = item_data[0];
		}
		if (equip[2][7] % 8 == 0 || oldTop[7] % 8 == 0 || override) {
			document.getElementById("e_s4").options[0].innerHTML = (equip[2][7] % 8 == 0) ? "(used by upper)" : name_location[4];
			document.getElementById("e_s4").value = 0;
			equip[4] = item_data[0];
		}
	}
	else if (oldMid[1] != equip[3][1]) {
		if (equip[2][7] % 7 == 0) {
			if (equip[2][7] % 8 == 0) override = true;
			document.getElementById("e_s3").options[0].innerHTML = name_location[3];
			document.getElementById("e_s2").value = 0;
			equip[2] = item_data[0];
		}
		if (equip[3][7] % 8 == 0 || oldMid[7] % 8 == 0 || override) {
			document.getElementById("e_s4").options[0].innerHTML = (equip[3][7] % 8 == 0) ? "(used by middle)" : name_location[4];
			document.getElementById("e_s4").value = 0;
			equip[4] = item_data[0];
		}
	}
	else if (oldBot[1] != equip[4][1]) {
		if (equip[2][7] % 8 == 0) {
			document.getElementById("e_s4").options[0].innerHTML = name_location[4];
			if (equip[2][7] % 7 == 0) {
				document.getElementById("e_s3").options[0].innerHTML = name_location[3];
				document.getElementById("e_s3").value = 0;
				equip[3] = item_data[0];
			}
			document.getElementById("e_s2").value = 0;
			equip[2] = item_data[0];
		}
		else if (equip[3][7] % 8 == 0) {
			document.getElementById("e_s4").options[0].innerHTML = name_location[4];
			document.getElementById("e_s3").value = 0;
			equip[3] = item_data[0];
		}
	}
	for (var i = 2; i < 10; i++) {
		if (equip[i][6] > 0) {
			document.getElementById("e_c" + i).style.visibility = 'visible';
			equip_card[i+3] = item_card[+ document.getElementById("e_c" + i).value];
		} else {
			document.getElementById("e_c" + i).style.visibility = "hidden";
			equip_card[i+3] = item_card[0];
		}
		if (equip[i][10] > 0) {
			document.getElementById("e_r" + i).style.visibility = 'visible';
			equip_ref[i] = + document.getElementById("e_r" + i).value;
		} else {
			document.getElementById("e_r" + i).style.visibility = "hidden";
			equip_ref[i] = 0;
		}
	}

	if (equip[0][11] == 2) {
		equip[1] = item_data[0];
		document.getElementById("e_s1" + w_slot).style.display = "none";
		if (wName == "bow" || wName == "whip" || wName == "instrument") { 
			arrow.style.display = "";
			bullet.style.display = "none";
			grenade.style.display = "none";
			shuriken.style.display = "none";
		} else if (wName == "revolver" || wName == "rifle" || wName == "shotgun" || wName == "gatling") {
			bullet.style.display = "";
			arrow.style.display = "none";
			grenade.style.display = "none";
			shuriken.style.display = "none";
		} else if (wName == "launcher") {
			grenade.style.display = "";
			arrow.style.display = "none";
			bullet.style.display = "none";
			shuriken.style.display = "none";
		}
	} else {
		document.getElementById("e_s1" + w_slot).style.display = "inline";
		arrow.style.display = "none";
		bullet.style.display = "none";
		grenade.style.display = "none";
		shuriken.style.display = "none";
	}
	if (job == 5) shuriken.style.display = "";
	if (equip[0][10] == 0) {
		equip_ele[0] = false;
		document.getElementById("e_f" + w_slot).style.visibility = "hidden";
		document.getElementById("forge_text").style.visibility = "hidden";
	} else {
		equip_ele[0] = document.getElementById("e_f" + w_slot).checked;
		document.getElementById("e_f" + w_slot).style.visibility = "visible";
		document.getElementById("forge_text").style.visibility = "visible";
	}
	if (equip_ele[0]) {
		for (i = 0; i < 4; i++) {
			document.getElementById("e_c0" + i + w_slot).style.display = "none";
			document.getElementById("e_e" + i + w_slot).style.display = "inline";
			equip_card[i] = item_card[0];
			if (i > 0) equip_ele[i] = + document.getElementById("e_e" + i + w_slot).value;
		}
	} else {
		var card_can = equip[0][6];
		for (i = 0; i < 4; i++) {
			document.getElementById("e_e" + i + w_slot).style.display = "none";
			if (i < card_can) {
				document.getElementById("e_c0" + i + w_slot).style.display = "inline";
				equip_card[i] = item_card[+ document.getElementById("e_c0" + i + w_slot).value];
			} else {
				document.getElementById("e_c0" + i + w_slot).style.display = "none";
				equip_card[i] = item_card[0];
			}
		}
	}
	if (equip[0][9] > 0) {
		document.getElementById("e_r0" + w_slot).style.visibility = "visible";
		equip_ref[0] = + document.getElementById("e_r0" + w_slot).value;
	} else {
		document.getElementById("e_r0" + w_slot).style.visibility = "hidden";
		equip_ref[0] = 0;
	}
	if (equip[1][10] > 0) {
		document.getElementById("e_r1" + w_slot).style.visibility = "visible";
		equip_ref[1] = + document.getElementById("e_r1" + w_slot).value;
	} else {
		document.getElementById("e_r1" + w_slot).style.visibility = "hidden";
		equip_ref[1] = 0;
	}
	if (equip[1][6] > 0) {
		document.getElementById("e_c1" + w_slot).style.visibility = "visible";
		equip_card[4] = item_card[+ document.getElementById("e_c1" + w_slot).value];
	} else {
		document.getElementById("e_c1" + w_slot).style.visibility = "hidden";
		equip_card[4] = item_card[0];
	}

// **** Card and equipment effects ****

	var bonus = [zeros(8), zeros(11), zeros(11), zeros(10), zeros(10), zeros(3), zeros(3), zeros(9), zeros(4), zeros(16), []];
	var sta_bonus = zeros(6);

	getBonusCards(equip_card, bonus, enemy.id, enemy.race, equip_ref, sta);
	getBonusItems(equip, bonus, sta_bonus);
	getBonusWeapon(equip[0], bonus, sta_bonus, enemy.race);
	getBonusHat(equip[2], bonus, sta_bonus);

// **** Stat calculations ****

	var dmg_mod_p = 100;
	var dmg_mod_s = 100;
	var sta_mod = [];

	for (var i = 0; i < 6; i++) {
		sta_mod[i] = sta[i] + sta_bonus[i] + mod_bonus[job][jlv][i];
	}

//	if (p_cu) sta_mod[0] += 4;
	sta_mod[0] += o_ble;
	sta_mod[0] += bonus[9][0];
	if (p_spurt && wName == "none") sta_mod[0] += 10;
	if (food_str) sta_mod[0] += food_str;
	if (p_soul) sta_mod[0] += p_soul;
	
	sta_mod[1] += bonus[9][1];
	if (food_agi) sta_mod[1] += food_agi;
	if (p_accuracy) sta_mod[1] += 4;
	if (o_agiu) sta_mod[1] += 2 + o_agiu;
	
	sta_mod[2] += bonus[9][2];
	if (food_vit) sta_mod[2] += food_vit;

	sta_mod[3] += o_ble;
	sta_mod[3] += bonus[9][3];
	if (food_int) sta_mod[3] += food_int;
	if (p_soul) sta_mod[3] += p_soul;

	sta_mod[4] += o_ble;
	sta_mod[4] += bonus[9][4];
	if (food_dex) sta_mod[4] += food_dex;
	if (p_accuracy) sta_mod[4] += 4;

	if (o_glo) sta_mod[5] += 30;
	sta_mod[5] += bonus[9][5];
	if (food_luk) sta_mod[5] += food_luk;

	if (o_cur) {
		sta_mod[5] = 0;
		dmg_mod_p -= 25;
	}

	if (o_qua) {
		sta_mod[1] *= 0.5;
		sta_mod[4] *= 0.5;
	}

	for (var i = 0;i < 6;i ++) {
		sta_mod[i] = Math.floor(sta_mod[i]);
		document.getElementById("i_bonus" + i).innerHTML = (sta_mod[i] - sta[i] < 0) ? (sta_mod[i] - sta[i]) : "+" + (sta_mod[i] - sta[i]);
		document.getElementById("i_total" + i).innerHTML = sta_mod[i];
		document.getElementById("i_reqpts" + i).innerHTML = req_pts[i];
	}

	var def = bonus[9][6];
	if(p_suncomfort) def += (blv + sta_mod[4] + sta_mod[5]) / 10;
	var mdef = bonus[9][7];
	var charges = 0;
	for (var i = 1; i < 10; i++) {
		def += equip[i][8];
		mdef += equip[i][9];
		charges += equip_ref[i];
	}
	fakedef = charges + def;
	def += charges * 2 / 3;

	var vbase = Math.floor(0.5 * sta_mod[2]);
	var vmin = Math.floor(0.3 * sta_mod[2]);
	var vmax = Math.floor(Math.pow(sta_mod[2],2) / 150) - 1;
	var vitdef_min = vbase + vmin;
	var vitdef_max = vbase + Math.max(vmin,vmax);
	if (o_pro) {
		vitdef_min *= 0.95 - 0.05 * o_pro;
		vitdef_max *= 0.95 - 0.05 * o_pro;
	}
	if (o_poi) {
		def *= 0.75;
		vitdef_min *= 0.75;
		vitdef_max *= 0.75;
	}
	vitdef_min = Math.floor(vitdef_min * (1 + o_ang * 0.05));
	vitdef_max = Math.floor(vitdef_max * (1 + o_ang * 0.05));
//	if (p_men) {
//		def = 90;
//		mdef = 90;
//	}
	document.getElementById("lbl_def").innerHTML = (def == Math.floor(def)) ? def + "%" : decimal(def,2) + "%";
	document.getElementById("lbl_vitdef").innerHTML = (vitdef_min == vitdef_max) ? vitdef_min : vitdef_min + "~" + vitdef_max;
	document.getElementById("lbl_mdef").innerHTML = mdef + "%";
	document.getElementById("lbl_intmdef").innerHTML = sta_mod[3];

	var hit_raw = blv + sta_mod[4] + bonus[9][8];
	var perfhit_raw = bonus[9][14];
	var perfhit_not = 1 - perfhit_raw / 100;
//	if (p_wr) hit_raw += 2 * p_wr;
	if (food_hit) hit_raw += 30;
	var flee_raw = blv + sta_mod[1] + bonus[9][9];
	if (p_mooncomfort) flee_raw += (blv + sta_mod[4] + sta_mod[5]) / 10;
//	if (p_flee) flee_raw += Math.floor(p_flee * 1.5);
	if (o_bli) {
		hit_raw *= 0.75;
		flee_raw *= 0.75;
	}
	if (wName == "revolver") hit_raw -= 10;
	if (wName == "rifle") hit_raw += 10;
	if (food_flee) flee_raw += 30;
	if (p_adjust) hit_raw -= 30;
	if (p_adjust) flee_raw += 30;
	if (p_accuracy) hit_raw += 20;
	if (p_singleaction) hit_raw += p_singleaction * 2;
	if (p_snake) hit_raw += p_snake;
	if (p_gatling && wName == "gatling") flee_raw -= 5 * p_gatling;
	document.getElementById("lbl_hit").innerHTML = hit_raw;
	document.getElementById("lbl_flee").innerHTML = flee_raw;

	var crit_raw = 10 + sta_mod[5] * 3 + bonus[9][10];
//	if (p_fury) crit_raw += 75 + 25 * p_fury;
//	if (p_ang) crit_raw += 500;
	if (wName == "rifle") crit_raw += 100;
	document.getElementById("lbl_basecrit").innerHTML = decimal(crit_raw / 10, 1) + "%";
	if (wName == "katar") crit_raw *= 2;
	var crit_mod = Math.min(1000,Math.max(0,crit_raw - enemy.luk * 2));
	document.getElementById("lbl_critrate").innerHTML = decimal(crit_mod / 10,1) + "%";

	var perf_raw = 10 + sta_mod[5] + bonus[9][11];
	var perf_mod = Math.min(1000,perf_raw);
	document.getElementById("lbl_lucky").innerHTML = decimal(perf_mod / 10,1) + "%";

	var hit_enemy = enemy.hit * 10;
	var perf_not = 1 - perf_mod / 1000;
	var flee_mod = flee_raw * 10;
	for (var i = 1, dodge; i < 13; i++) {
		if (i > 2) flee_mod -= flee_raw;
		dodge = 200 + flee_mod - hit_enemy;
		dodge = perf_mod + perf_not * dodge;
			if (p_breakfall) {
				if (p_spurt) {
					dodge += perf_not * 200;
				} else if (enemy.range > 3) {
					dodge += perf_not * 200;
					}	
			}
		dodge = (dodge > 950) ? 950 : ((dodge < 0) ? 0 : dodge);
		document.getElementById("lbl_flee" + i).innerHTML = decimal(dodge / 10,1) + "%";
	}

	var hit_mod = (perfhit_raw * 10) + (800 + hit_raw * 10 - enemy.flee * 10) * perfhit_not;
	hit_mod = Math.max(0,Math.min(1000,hit_mod));
	document.getElementById("lbl_hitrate").innerHTML = decimal(hit_mod / 10,1) + "%";

	var delay_raw = mod_aspd[job][wType];

	var delay_mult = 1;
	delay_mult -= bonus[7][3] / 100;
//	if (p_2hq && wName == "2hsword") delay_mult -= 0.3;
//	if (p_sq && wName == "2hspear") delay_mult -= 0.2 + 0.01 * p_sq;
	if (o_adr && (wName == "axe" || wName == "2haxe" || wName == "mace")) delay_mult -= (job == 11) ? 0.3 : 0.25;
	if (p_aspd) delay_mult -= 0.05 + 0.05 * p_aspd;
//	if (p_men) delay_mult += 0.25;
	if (p_demon) delay_mult -= 0.03 * p_demon;
	if (p_starcomfort) delay_mult -= (blv + sta_mod[4] + sta_mod[5]) / 1000;
	if (p_madness) delay_mult -= 0.2;
	if (p_singleaction) delay_mult -= Math.ceil(p_singleaction / 2) / 100 ;
	if (p_gatling && wName == "gatling") delay_mult -= 0.02 * p_gatling;
	//if (p_peco) delay_raw *= 10 / (5 + p_cav);

	var delay_mod = delay_raw - Math.floor(delay_raw * sta_mod[1] / 250) - Math.floor(delay_raw * sta_mod[4] / 1000);
	delay_mod = delay_mult * delay_mod;
	delay_mod = Math.ceil(delay_mod);
	delay_mod = Math.max(10, delay_mod / 10);
	if (o_da) delay_mod -= 500;
	var disp_aspd = (decimal((200 - delay_mod),1)).split(".");
	document.getElementById("lbl_aspd").innerHTML = disp_aspd[0] + "(." + disp_aspd[1] + ")";
	delay_mod = Math.ceil(delay_mod);

	var matk_min = (sta_mod[3] + Math.floor(Math.pow(Math.floor(sta_mod[3] / 7), 2) * ( 1 + bonus[7][4] / 100)));
	var matk_max = (sta_mod[3] + Math.floor(Math.pow(Math.floor(sta_mod[3] / 5), 2) * ( 1 + bonus[7][4] / 100)));
	if (wName == "rod") {
		matk_min = Math.floor(matk_min * 1.15);
		matk_max = Math.floor(matk_max * 1.15);
	}
	if (food_atk) {
		matk_min += 10;
		matk_max += 10;
	}

	document.getElementById("lbl_matk").innerHTML = matk_min + "~" + matk_max;

	if (o_pro) dmg_mod_p += 2 + 3 * o_pro;
//	if (p_pt && (wName == "axe" || wName == "2haxe" || wName == "mace")) dmg_mod_s += 5 * p_pt;
//	if (p_dr) {
//		bonus[2][9] += 4 * p_dr;
//		if (enemy.racename == "dragon") dmg_mod_s += 4 * p_dr;
//	}
	var pass;
	if (p_chain) pass = "p_chain";
//	if (p_wp) bonus[0][2] = 1;
//	if (p_peco && (wName == "spear" || wName == "2hspear") && enemy.sizename == "medium") bonus[0][2] = 1;
//	if (p_tri) pass = "p_tri";
//	if (p_fai) bonus[4][6] += 5 * p_fai;
//	if (p_skin) bonus[4][3] += 5 * p_skin;
//	if (p_fai) bonus[9][12] += 200 * p_fai;
	if (o_rs && job != 13) {
		bonus[4][6] += 5 * o_rs;
		bonus[2][6] += 5 * o_rs;
	}
	bonus[7][0] += 5 * o_imp;

	var weight = 2000 + 30 * sta[0] + mod_misc['weight'][job];
//	if (p_iw) weight += 100 * p_iw;
	document.getElementById("lbl_weight").innerHTML = weight;

	var cast = ((100 - bonus[7][2] - 15 * o_suf) * (1 - sta_mod[4] / 150));
	document.getElementById("lbl_cast").innerHTML = (cast > 0) ? decimal(cast,1) + "%" : "Instant";

	var itemheal = 100 + 2 * sta_mod[2];

	
//	if (p_pr) itemheal *= 1 + 0.05 * p_pr;
	document.getElementById('lbl_heal').innerHTML = decimal(itemheal,0) + '%';

// **** HP and SP calculation, stat display ****

	var hp = 35 + blv * mod_misc['hpcon'][job] / 100;
	var hp_mod = mod_misc['hpmod'][job] / 1000;
	for (var i = 2; i <= blv; i++) hp += Math.round(hp_mod * i);
	hp = Math.floor(hp * (1 + sta_mod[2]/100));
if (p_ranker && blv >=90) {
		hp = hp * 3;
		}
	hp = Math.floor(hp + bonus[9][12]);
	hp = Math.floor(hp * (1 + bonus[8][0]/100));
	document.getElementById("lbl_hp").innerHTML = hp;

	var sp = 10 + Math.floor(mod_misc['spmod'][job] / 100 * blv);
	sp = Math.floor(sp * (1 + sta_mod[3]/100));
if (p_ranker && blv >=90) {
		sp = sp * 3;
		}
	sp = Math.floor(sp + bonus[9][13]);
	sp = Math.floor(sp * (1 + bonus[8][1]/100));

if (p_kaina) sp += p_kaina * 30;
	document.getElementById("lbl_sp").innerHTML = sp;


	var hp_regen = Math.max(1,Math.floor(hp / 200) + Math.floor(sta_mod[2] / 5));
	hp_regen = Math.floor(hp_regen * (1 + bonus[8][2]/100));
	var sp_regen = 1 + Math.floor(sta_mod[3] / 6) + Math.floor(sp / 100);
	if (sta_mod[3] > 119) sp_regen += 4 + Math.floor(sta_mod[3] / 2 - 60);
	sp_regen = Math.floor(sp_regen * (1 + bonus[8][3]/100));

	var hp_tick = 6;
	var sp_tick = 8;
	var hp_ski = 0;
	var sp_ski = 0;
	
	if (p_madness) o_reg = 1;
	switch (o_reg) {
		case 0 :
			hp_regen = 0;
			break;
		case 1 :
//			if (p_spr) sp_ski += Math.floor(p_spr * (3 + sp/500));
			if (p_nspr) sp_ski += Math.floor(p_nspr * (3 + sp/500));
			break;
		case 2 :
			hp_tick = 3;
			sp_tick = 4;
//			if (p_spr) sp_ski += Math.floor(p_spr * (3 + sp/500));
			if (p_peac) hp_ski += Math.floor(p_peac * 30);
			if (p_enj) {
				if (p_kaina) sp_ski += Math.floor(p_enj * 3 * (((p_kaina + 3) / 10) + 1))
				 else sp_ski += Math.floor(p_enj * 3)
			}
			

//if (p_cad) {
//				hp_ski += Math.floor(p_cad * (4 + hp/500));
//				sp_ski += Math.floor(p_cad * (2 + sp/500));
//			}
			break;
		default :
			alert("This wasn't supposed to happen");
			break;
	}
	if (o_mag) sp_tick /= 2;

	var hp_tot = (hp_regen) ? hp_regen * 60 / hp_tick + hp_ski * 6 : 0;
	var sp_tot = sp_regen * 60 / sp_tick + sp_ski * 6;
	
	document.getElementById("lbl_hpticklen").innerHTML = (hp_tot) ? hp_tick + "s" + (hp_ski ? ' / 10s' : '') : 'Never';
	document.getElementById("lbl_spticklen").innerHTML = sp_tick + "s" + (sp_ski ? ' / 10s' : '');

	document.getElementById("lbl_hptick").innerHTML = hp_regen + (hp_ski ? ' / ' + hp_ski : '');
	document.getElementById("lbl_sptick").innerHTML = sp_regen + (sp_ski ? ' / ' + sp_ski : '');

	document.getElementById("lbl_hpmin").innerHTML = decimal(hp_tot,1);
	document.getElementById("lbl_spmin").innerHTML = decimal(sp_tot,1);

	document.getElementById("lbl_hpfull").innerHTML = (hp_tot) ? Math.floor(hp / hp_tot) + "m " + Math.ceil(60 * (hp % hp_tot) / hp_tot) + "s " : 'Forever';
	document.getElementById("lbl_spfull").innerHTML = Math.floor(sp / sp_tot) + "m " + Math.ceil(60 * (sp % sp_tot) / sp_tot) + "s ";

// **** Active skills ****

	var a = '<select id="as_sel" onchange="setSkillLv(true);">';
	var b = false;
	var c = null;
	var as = document.getElementById("as_sel");
	as = as ? + as.value : -1;

// Atk prereq check
		
	for (var k in skill_active) {
		b = false;
		if (use_active[k][job] == 1 /*|| p_pl && skill_active[k][6] == 0 */) {
			b = true;
			switch (skill_active[k][2]) {
				case "a_me" :
					if (enemy.racename == "demon") break;
				case "a_tu" :
				case "a_res" :
					if (enemy.elemname == "undead") break;
					b = false;
					break;
//				case "a_bran" :
//					if (!p_peco) b = false;
				case "a_pier" :
				case "a_stab" :
				case "a_boom" :
					if (wName != "spear" && wName != "2hspear") b = false;
					break;
//				case "a_blitz" :
//					if (!p_bird) b = false;
//					break;
				case "a_cart" :
					if (!p_pu) b = false;
					break;
				case "a_occ" :
				case "a_rage" :
				case "a_asura" :
//				case "a_tss" :
					if (!p_ss) b = false;
					break;
				case "a_ds" :
				case "a_repel" :
				case "a_arrow" :
					if (wName != "bow") b = false;
					break;
				case "a_sonic" :
				case "a_grim" :
					if (wName != "katar") b = false;
					break;
				case "a_mel" :
					if (wName != "instrument") b = false;
					break;
				case "a_sli" :
					if (wName != "whip") b = false;
					break;
				case "a_smite" :
				case "a_sb" :
					if (equip[1][1] == "none") b = false;
					break;
				case "a_track" :
					if (wName != "revolver" && wName != "rifle") b = false; 
					break;
				case "a_pshot" :
					if (wName != "revolver" && wName != "rifle") b = false; 
					break;
				case "a_desperado" :
				case "a_rshower" :
					if (wName != "revolver") b = false; 
					break;
				case "a_fbuster" :
				case "a_spread" :
				case "a_dust" :
					if (wName != "shotgun") b = false; 
					break;
				case "a_tshur" :
					if (equip_shuriken[1] != "shuriken" && equip_shuriken[1] != "raincloudshuriken" && equip_shuriken[1] != "flashshuriken" && equip_shuriken[1] != "pointedshuriken" && equip_shuriken[1] != "piercingshuriken") b = false; 
					break;
				case "a_tkunai" :
					if (equip_shuriken[1] != "kunai_ice" && equip_shuriken[1] != "kunai_earth" && equip_shuriken[1] != "kunai_wind" && equip_shuriken[1] != "kunai_fire" && equip_shuriken[1] != "kunai_poison") b = false; 
					break;
				case "a_tfuuma" :
					if (wName != "fuuma") b = false; 
					break;
			}
		}
		if (b) {
			if (k == as) {
				a += '<option value="' + k + '" selected>' + skill_active[k][1] + '</option>';
				var c = k;
			} else {
				a += '<option value="' + k + '">' + skill_active[k][1] + '</option>';
			}
		}
	}
	for (var k in bonus[10]) {
		if (k == as) {
			a += '<option value="' + k + '" selected>' + skill_active[k][1] + '</option>';
			var c = k;
		} else {
			a += '<option value="' + k + '">' + skill_active[k][1] + '</option>';
		}
	}
	a += '</select>';
	document.getElementById("i_as").innerHTML = a;
	if (c == null) {
		document.getElementById("as_sel").value = 0;
		document.getElementById("i_aslv").innerHTML = '';
		document.getElementById("as_exinf").innerHTML = '';
		document.getElementById("as_exinp").innerHTML = '';
	}

// **** Enemy damage calculation ****

	var enemyMinAtk = enemy.atkmin * (1 - def / 100) - vitdef_max;
	var enemyMaxAtk = enemy.atkmax * (1 - def / 100) - vitdef_min;
//	if(p_dp && (enemy.racename == 'demon' || enemy.elemname == 'undead')) {
//		enemyMinAtk -= p_dp * 3;
//		enemyMaxAtk -= p_dp * 3;
//	}
	enemyMinAtk = enemyMinAtk * (1 - bonus[2][enemy.race] / 100) * (1 - bonus[4][0] / 100) * (1 - bonus[6][enemy.size] / 100);
	enemyMaxAtk = enemyMaxAtk * (1 - bonus[2][enemy.race] / 100) * (1 - bonus[4][0] / 100) * (1 - bonus[6][enemy.size] / 100);
//	if (p_ec) {
//		enemyMinAtk *= 1 - 0.06 * p_ec;
//		enemyMaxAtk *= 1 - 0.06 * p_ec;
//	}
	if (enemy.range > 3) {
		if (o_da) {
			enemyMinAtk *= 0.95 - 0.15 * o_da;
			enemyMaxAtk *= 0.95 - 0.15 * o_da;
		}
		if (bonus[0][4]) {
			enemyMinAtk *= 0.65;
			enemyMaxAtk *= 0.65;
		}
		if (bonus[7][8]) {                   
			enemyMinAtk *= (1 - bonus[7][8] / 100);
			enemyMaxAtk *= (1 - bonus[7][8] / 100);
		}
		if (p_adjust) {
			enemyMinAtk *= 0.8;
			enemyMaxAtk *= 0.8;
		}
	}
	if (bonus[7][6]){
		enemyMinAtk *= 1 + bonus[7][6] / 100;
		enemyMaxAtk *= 1 + bonus[7][6] / 100;
		}
	if (enemyMinAtk < 1) enemyMinAtk = 1;
	if (enemyMaxAtk < 1) enemyMaxAtk = 1;
	document.getElementById("enemy_dam").innerHTML = Math.floor(enemyMinAtk) + " ~ " + Math.floor(enemyMaxAtk);

// **** Damage variable calculation ****

	var card_mod = (1 + bonus[1][enemy.race]/100) * (1 + bonus[3][enemy.elem]/100) * (1 + bonus[5][enemy.size]/100);
	if (bonus[0][5] && enemy.name == "Bon Gun") card_mod *= 2.5;
	var size_mod = bonus[0][2] ? 1 : mod_size[wType][enemy.size] / 100;
	var wLevel = equip[0][9];

	var uLevel = equip_ref[0];
	var uRow = mod_upgrade[wLevel];
	var upgrade = uLevel * uRow[1];
	var up_min = (uLevel > uRow[0]) ? 1 : 0;
	var up_max = (uLevel > uRow[0]) ? (uLevel - uRow[0]) * uRow[2] : 0;

	var mastery;
	switch (wName) {
	//	case "dagger" :
	//	case "sword" :
	//		break;
		case "2hsword" :
			break;
		case "spear" :
	//	case "2hspear" :
	//		mastery = (p_spm) ? ((p_peco) ? 5 * p_spm : 4 * p_spm) : 0;
	//		break;
//		case "mace" :
//			mastery = (p_mm) ? 3 * p_mm : 0;
//			break;
//		case "katar" :
//			mastery = (p_km) ? 3 * p_km : 0;
//			break;
//		case "knuckle" :
//		case "none" :
//			mastery = (p_knm) ? 3 * p_knm : 0;
//			break;
//		case "book" :
//			mastery = (p_bm) ? 3 * p_bm : 0;
//			break;
//		case "axe" :
//		case "2haxe" :
//			mastery = (p_am) ? 3 * p_am : 0;
//			break;
//		case "instrument" :
//			mastery = (p_im) ? 3 * p_im : 0;
//			break;
//		case "whip" :
//			mastery = (p_wm) ? 3 * p_wm : 0;
//			break;
		case "fuuma":
			mastery = (p_smast) ? 3 * p_smast : 0;
			break;
		default :
			mastery = 0;
			break;
	}

	var bane = 0;
//	if (p_bb && (enemy.racename == "brute" || enemy.racename == "insect")) bane += 4 * p_bb;
//	if (p_db && (enemy.racename == "demon" || enemy.elemname == "undead")) bane += 3 * p_db;

	var reliable = 0;
//was: var reliable = (p_wr) ? 2 * p_wr : 0;
	var wpn_atk = equip[0][8];
	var mod_dex = Math.min(wpn_atk,(0.8 + 0.2 * wLevel) * sta_mod[4]);

	var base_atk, min_atk, max_atk, crit_atk;

	if (wName == "bow") {
		var arrow_atk = equip_arrow[2];
		base_atk = sta_mod[4] + Math.pow(Math.floor(sta_mod[4]/10),2) + Math.floor(sta_mod[0]/5) + Math.floor(sta_mod[5]/5) + bonus[7][0];
		min_atk = wpn_atk / 100 * mod_dex;
		max_atk = Math.max(wpn_atk,min_atk) + arrow_atk - 1;
		crit_atk = wpn_atk + arrow_atk;
		wpn_atk += " + " + arrow_atk;
	} else if (wName == "revolver" || wName == "rifle" || wName == "shotgun" || wName == "gatling") {
		var arrow_atk = equip_bullet[2];
		base_atk = sta_mod[4] + Math.pow(Math.floor(sta_mod[4]/10),2) + Math.floor(sta_mod[0]/5) + Math.floor(sta_mod[5]/5) + bonus[7][0];
		min_atk = wpn_atk / 100 * mod_dex;
		max_atk = Math.max(wpn_atk,min_atk) + arrow_atk - 1;
		crit_atk = wpn_atk + arrow_atk;
		wpn_atk += " + " + arrow_atk;
	} else if (wName == "launcher") {
		var arrow_atk = equip_grenade[2];
		base_atk = sta_mod[4] + Math.pow(Math.floor(sta_mod[4]/10),2) + Math.floor(sta_mod[0]/5) + Math.floor(sta_mod[5]/5) + bonus[7][0];
		min_atk = wpn_atk / 100 * mod_dex;
		max_atk = Math.max(wpn_atk,min_atk) + arrow_atk - 1;
		crit_atk = wpn_atk + arrow_atk;
		wpn_atk += " + " + arrow_atk;
	} else if (wRange) {
		//var arrow_atk;
		base_atk = sta_mod[4] + Math.pow(Math.floor(sta_mod[4]/10),2) + Math.floor(sta_mod[0]/5) + Math.floor(sta_mod[5]/5) + bonus[7][0];
		min_atk = mod_dex;
		max_atk = wpn_atk;
		if (min_atk < max_atk) max_atk -= 1;
		crit_atk = wpn_atk;
	} else {
		base_atk = sta_mod[0] + Math.pow(Math.floor(sta_mod[0]/10),2) + Math.floor(sta_mod[4]/5) + Math.floor(sta_mod[5]/5) + bonus[7][0];
		min_atk = mod_dex;
		max_atk = wpn_atk;
		if (min_atk < max_atk) max_atk -= 1;
		crit_atk = wpn_atk;
	}
	if (bonus[7][5]) crit_atk = crit_atk * (1 + bonus[7][5] / 100);
//	if (bonus[7][7]) base_atk *= (1 + bonus[7][7] / 100);
	max_atk = Math.floor(max_atk * size_mod);
	crit_atk = Math.floor(crit_atk * size_mod);
	min_atk = Math.floor(min_atk * size_mod);
// was: 	min_atk = (p_mp) ? max_atk : Math.floor(min_atk * size_mod);
	document.getElementById("lbl_atk").innerHTML = wpn_atk;

	var elem, elem_mod;
	var crumb = 0;

	if (equip_ele[0]) {
		for (var i = 1; i < 4; i++) if (equip_ele[i] == 10) crumb += 5;
		elem = equip_ele[1] % 10;
	} else {
		elem = equip[0][5];
	}
//	if (p_ss) crumb += 3 * p_ss;
	if (o_ele) elem = o_ele;
	if (wName == "bow" && elem == 0) elem = equip_arrow[3];
	if ((wName == "revolver" || wName == "rifle" || wName == "shotgun" || wName == "gatling") && elem == 0) elem = equip_bullet[3];
	if (wName == "launcher" && elem == 0) elem = equip_grenade[3];
	elem_mod = element[enemy.elemlvl][enemy.elem][elem] / 100;
	if (p_kihop) {
	var tmp_atk = base_atk;
	base_atk = base_atk * ( 1 + ( p_kihop * party_size / 50));
	}
	if (food_atk) base_atk += 10;
	if (p_madness) base_atk += 100;
	if (p_gatling && wName == "gatling") base_atk += 20 + (10 * p_gatling); 
	if (p_coins) crumb += 3*p_coins;

// **** Regular damage calculation ****
	var damage = calcPhysical(false, 0, elem_mod, base_atk, min_atk, max_atk, bonus[7][7], dmg_mod_p, dmg_mod_s, upgrade, up_min, up_max, bane, mastery, reliable, crumb, card_mod, enemy.def, enemy.vitmin, enemy.vitmax, 0);

// **** Critical hit calculation ****

	var crit = [], cd_base;

	var dmg_mod = Math.floor(dmg_mod_s * dmg_mod_p / 100);

	if (up_min) {
		cd_base = base_atk + crit_atk + up_min;
		cd_base = Math.floor( cd_base * dmg_mod / 100 );
		cd_base += upgrade + bane + mastery + reliable;
		cd_base = Math.floor( cd_base * elem_mod );
		cd_base += crumb;
		cd_base = Math.floor( cd_base * card_mod );

		crit[0] = cd_base;

		cd_base = base_atk + crit_atk + up_max;
		cd_base = Math.floor( cd_base * dmg_mod / 100 );
		cd_base += upgrade + bane + mastery + reliable;
		cd_base = Math.floor( cd_base * elem_mod );
		cd_base += crumb;
		cd_base = Math.floor( cd_base * card_mod );

		crit[2] = cd_base;

		crit[1] = Math.floor((crit[0] + crit[2]) / 2);
	} else {
		cd_base = base_atk + crit_atk;
		cd_base = Math.floor( cd_base * dmg_mod / 100 );
		cd_base += upgrade + bane + mastery + reliable;
		cd_base = Math.floor( cd_base * elem_mod );
		cd_base += crumb;
		cd_base = Math.floor( cd_base * card_mod );

		crit[0] = "";
		crit[1] = cd_base;
		crit[2] = "";
	}


// **** Active skill calculations ****

	if (p_kihop) {
	base_atk = tmp_atk;
	}

	var as = + document.getElementById("as_sel").value;
	var aslv = (as) ? + document.getElementById("aslv_sel").value : 0;
	as = skill_active[as];

	if (as[3] != -1) {
		elem = as[3];
		elem_mod = element[enemy.elemlvl][enemy.elem][elem]/100;
	}

	var active = [];

	switch (as[4]) {
		case -1 :
			active = ["","","","","No skill"];
			break;
		case -2 :
			active = calcMagic(as, aslv, elem_mod, matk_min, matk_max, enemy.mdef, enemy.intel, enemy.vit, blv);
			break;
		case -3 :
			active = calcTrap(as[2], aslv, elem_mod, sta_mod[3], sta_mod[4]);
			break;
		case -4 :
			switch (as[2]) {
				case "a_heal" :
					var heal = Math.floor((blv + sta_mod[3]) / 8) * (aslv * 8 + 4);
					var magic = (enemy.elemname == 'undead') ? Math.floor(heal / 2 * elem_mod) : 0;
					active = ["",magic,"","","Heals " + heal + " hp"];
					break;
				case "a_res" :
				case "a_tu" :
					var tumiss = Math.floor((blv + sta_mod[3] + aslv * 10) * elem_mod);
					var tuhit = Math.floor(enemy.hp * elem_mod);
					var turate = aslv * 20 + blv + sta_mod[3] + sta_mod[5];
					active = ["",tuhit,"",tumiss,"Base success rate: " + decimal(turate / 10,1) + "%"];
					break;
				case "a_sanc" :
					var heal = (aslv < 7) ? aslv * 100 : 777;
					var magic = (enemy.elemname == 'undead' || enemy.racename == 'demon') ? Math.floor(Math.floor(heal / 2) * elem_mod) : 0;
					active = ["",magic,"","","Heals " + heal + " hp"];
					break;
				case "a_fp" :
					var hits = aslv + 2;
					var magic = [];

					magic[0] = 50 + matk_min / 5;
					magic[2] = 50 + matk_max / 5;
					magic[1] = (magic[0] + magic[2]) / 2;

					for (var i = 0; i < 3; i++) magic[i] = Math.floor(magic[i] * elem_mod);

					var note = (magic[1] > 0) ? "Total Damage: " + magic[0] * hits + "-" + magic[2] * hits : "You're not doing any damage";
					active = [magic[0],magic[1],magic[2],"",note];
					break;
				case "a_steal" :
					var srate = 10 + 6 * aslv + sta_mod[4] * 0.5 - enemy.dex * 0.5;
					srate = (srate <= 0) ? "Steal impossible" : "Steal modifier: " + decimal(srate,1);
					active = ["","","","",srate];
					break;
				case "a_ap" :
					var itemheal = 100 + 2 * sta_mod[2];
					var ap_pr = document.getElementById('as_exsel').value;
					itemheal *= 1 + 0.05 * ap_pr + 0.1 * aslv;
					itemheal = "Heal effect: " + decimal(itemheal,0) + "%";
					active = ["","","","",itemheal];
					break;
				case "a_occ" :
					active = ["","","","","Not implemented yet."];
					break;
				case "a_asura" :
					var asusp = document.getElementById('as_exsel').value;
					if (isNaN(asusp) || asusp < 0) asusp = 0;
					if (asusp > sp) {
						alert("You can't have more SP remaining than your max SP, silly.");
						asusp = 0;
					}
					var asu_mod = 8 + Math.floor(asusp / 2) / 5;
					var asu = 250 + 150 * aslv;
					var asu_crumb; //= crumb - 3 * p_ss;

					var asu_min = base_atk + min_atk + up_min + asu_crumb;
					var asu_max = base_atk + max_atk + up_max + asu_crumb;

					asu_min *= asu_mod;
					asu_max *= asu_mod;

					asu_min += asu;
					asu_max += asu;

					asu_min *= elem_mod * card_mod;
					asu_max *= elem_mod * card_mod;

					asu_min = Math.floor(asu_min);
					asu_max = Math.floor(asu_max);
					if (up_min || max_atk > min_atk) {
						var asu_avg = Math.floor((asu_min + asu_max) / 2);
						active = [asu_min,asu_avg,asu_max,"","Buggy, buggy, buggy."];
					} else {
						active = ["",asu_min,"","","Buggy, buggy, buggy."];
					}
					break;
				case "a_cart" :
					var fill = document.getElementById('as_exsel').value;
					if (isNaN(fill) || fill < 0 || fill > 8000) {
						alert("Please enter an integer between 0 and 8000.");
						fill = 0;
					}

					var damage_base = [], damage_fill = [], damage_total = [[],[],[]];
					damage_base = calcPhysical(false, 0, elem_mod, base_atk, min_atk, max_atk, bonus[7][7], dmg_mod_p, dmg_mod_s + 50, upgrade, up_min, up_max, bane, mastery, reliable, crumb, card_mod, enemy.def, enemy.vitmin, enemy.vitmax, 0);
					for (var i = 0; i < 4; i++) {
						damage_fill[i] = (damage[i] === '') ? '' : Math.floor(damage[i] * fill / 8000);
					}
					for (var i = 0; i < 3; i++) {
						damage_total[0][i] = (damage_base[i] === '' && damage_fill[3] == 0) ? '' : damage_base[i] + damage_fill[3];
						damage_total[1][i] = (damage_fill[i] === '' && damage_base[3] == 0) ? '' : damage_base[3] + damage_fill[i];
						damage_total[2][i] = (damage_base[i] === '' && damage_fill[i] === '') ? '' : damage_base[i] + damage_fill[i];
					}
					damage_total[2][3] = damage_base[3] + damage_fill[3];

					field = '';
					field += '<html><head><title>Skill details</title><style>td { text-align: center; } body { background: #6699cc; margin-left: auto; margin-right: auto; }</style></head><body>';
					field += '<table style="width: 100%;"><caption>Cart Revolution</caption><tr>';
					field += '<th>&nbsp;</th><th>Min</th><th>Avg</th><th>Max</th><th>Miss</th>';
					field += '</tr><tr>';
					field += '<th>Base damage</th><td>' + damage_base[0] + '</td><td>' + damage_base[1] + '</td><td>' + damage_base[2] + '</td><td>' + damage_base[3] + '</td>';
					field += '</tr><tr>';
					field += '<th>Fill damage</th><td>' + damage_fill[0] + '</td><td>' + damage_fill[1] + '</td><td>' + damage_fill[2] + '</td><td>' + damage_fill[3] + '</td>';
					field += '</tr><tr>';
					field += '<td colspan="5"><hr></td>';
					field += '</tr><tr>';
					field += '<th>Base miss<br>Fill miss</th></td><td>&nbsp;</td></td><td>&nbsp;</td></td><td>&nbsp;</td><td>' + damage_total[2][3] + '</td>';
					field += '</tr><tr>';
					field += '<th>Base hit<br>Fill miss</th><td>' + damage_total[0][0] + '</td><td>' + damage_total[0][1] + '</td><td>' + damage_total[0][2] + '</td><td>&nbsp;</td>';
					field += '</tr><tr>';
					field += '<th>Base miss<br>Fill hit</th><td>' + damage_total[1][0] + '</td><td>' + damage_total[1][1] + '</td><td>' + damage_total[1][2] + '</td><td>&nbsp;</td>';
					field += '</tr><tr>';
					field += '<th>Base hit<br>Fill hit</th><td>' + damage_total[2][0] + '</td><td>' + damage_total[2][1] + '</td><td>' + damage_total[2][2] + '</td><td>&nbsp;</td>';
					field += '</tr></table>';
					field += '</body></html>';

					var winop = "var swin = document.open('','skillwin','width=400,height=300,resizable=1');";
					if (!window.cartalertdisplayed) {
						winop = "alert('Does not currently apply the overall neutral modifier. Damage against sense 1 and 2 monsters will be 1/4 of displayed. Skill will miss against sense 3 and 4 monsters.');" + winop;
						window.cartalertdisplayed = true;
					}

					var field2 = '<input type="button" value="Show details" onclick="' + winop + ' swin.document.write(field); swin.document.close(); swin.focus();">';

					active = damage_total[2].concat(field2);
					break;
				case "a_mbull" :
		//			max_atk -= arrow_atk;
		//			max_atk += max_matk;
		//			min_atk += min_matk;					
				active = ["","","","","Not implemented yet."];
		//	active = calcPhysical(as, aslv, elem_mod, base_atk, min_atk, max_atk, bonus[7][7], dmg_mod_p, dmg_mod_s, upgrade, up_min, up_max, bane, mastery, reliable, crumb, card_mod, enemy.def, enemy.vitmin, enemy.vitmax, hits);
					break;
				case "a_tshur" :
					var shur_elem = equip_shuriken[3];
					var shur_elem_mod = element[enemy.elemlvl][enemy.elem][shur_elem]/100;
					var damage_base = calcPhysical(as, aslv, shur_elem_mod, base_atk + equip_shuriken[2], min_atk, max_atk, bonus[7][7], dmg_mod_p, dmg_mod_s, upgrade, up_min, up_max, bane, mastery + aslv * 4, reliable, crumb, card_mod, enemy.def, enemy.vitmin, enemy.vitmax, 1);
					active = damage_base;
					break;
				case "a_tkunai" :
					var shur_elem = equip_shuriken[3];
					var shur_elem_mod = element[enemy.elemlvl][enemy.elem][shur_elem]/100;
					var damage_base = calcPhysical(as, aslv, shur_elem_mod, base_atk + equip_shuriken[2], min_atk, max_atk, bonus[7][7], dmg_mod_p, dmg_mod_s, upgrade, up_min, up_max, bane, mastery, reliable, crumb, card_mod, enemy.def, enemy.vitmin, enemy.vitmax, 3);
					active = damage_base;
					break;
				case "a_tmoney" :
					active = [aslv * 500,aslv * 750,aslv * 1000,"","Damage: " + aslv*500 + "-" + aslv*1000];
					break;
				default :
					active = ["","","","","This wasn't supposed to happen..."];
					break;
			}
			break;
		default:
			var hits;
			switch (as[2]) {
				case "a_ds" :
					hits = 2;
					break;
				case "a_pier" :
					hits = enemy.size + 1;
					break;
//				case "a_tss" :
//					hits = Math.min(p_ss,aslv);
//					break;
				case "a_pr" :
					if (enemy.elemname != "poison") {
						as = skill_active[10];
						aslv = 5;
						elem_mod = element[enemy.elemlvl][enemy.elem][5]/100;
						break;
					}
				case "a_tact" :
					hits = 3;
					break;
				default :
					hits = 1;
					break;
			}
			if (p_kihop) dmg_mod_s += p_kihop * party_size * 2;
			active = calcPhysical(as, aslv, elem_mod, base_atk, min_atk, max_atk, bonus[7][7], dmg_mod_p, dmg_mod_s, upgrade, up_min, up_max, bane, mastery, reliable, crumb, card_mod, enemy.def, enemy.vitmin, enemy.vitmax, hits);
			break;
	}

// **** Passive skill calculations ****

	var passive = [];

	switch (pass) {
/*		case "p_tri" :
			dmg_mod_s += 20 * p_tri;
			passive = calcPhysical(false, 0, elem_mod, base_atk, min_atk, max_atk, bonus[7][7], dmg_mod_p, dmg_mod_s, upgrade, up_min, up_max, bane, mastery, reliable, crumb, card_mod, enemy.def, enemy.vitmin, enemy.vitmax, 0);
			passive[4] = 300 - p_tri * 10;
			passive[5] = "Triple blows";
			break; */
		case "p_chain" :
			if (wName == "revolver") {
			for (var i = 0; i < 4; i++) {
			passive[i] = damage[i] * 2;
			}
			passive[4] = p_chain * 50;
			passive[5] = "Chain action";
			break;
		}
		default :
			for (var i = 0; i < 4; i++) {
				passive[i] = "";
			}
			passive[4] = 0;
			passive[5] = "None";
			break;
	}

// **** Damage display ****

	if (wName == "katar") {

		var left_rate = 0.01;

		crit[4] = crit[1] * (1 + left_rate);
		damage[4] = damage[1] * (1 + left_rate);
		damage[5] = 0;

		for (var i = 0; i < 3; i++) {
			if (damage[i]) damage[i] += "+" + Math.floor(damage[i] * left_rate);
			if (crit[i]) crit[i] += " + " + Math.floor(crit[i] * left_rate);
		}

	} else {
		damage[4] = damage[1];
		damage[5] = damage[3];
		crit[4] = crit[1];
	}
	for (var i = 0; i < 4; i++) {
		document.getElementById("lbl_basic" + i).innerHTML = damage[i];
		document.getElementById("lbl_pas" + i).innerHTML = passive[i];
		document.getElementById("lbl_skill" + i).innerHTML = active[i];
		if (i < 3) document.getElementById("lbl_crit" + i).innerHTML = crit[i];
	}
	document.getElementById("lbl_skill4").innerHTML = active[4];

// **** Combat rates display ****

	var d_skill, d_crit, d_hit, d_skill_h, d_skill_m, d_miss, d_miss_ns;

	if (passive[4]) {
		d_skill = passive[4];
		d_crit = crit_mod * (1 - d_skill / 1000);
		d_hit = hit_mod * (1 - d_skill / 1000 - d_crit / 1000);
		d_skill_h = d_skill * hit_mod / 1000;
		d_skill_m = d_skill - d_skill_h;
		d_miss = 1000 - d_skill_h - d_crit - d_hit;
		d_miss_ns = 1000 - d_skill - d_crit - d_hit;
	} else {
		d_skill = 0;
		d_crit = crit_mod;
		d_hit = hit_mod * (1 - d_crit / 1000);
		d_skill_h = 0;
		d_skill_m = 0;
		d_miss = 1000 - d_crit - d_hit;
		d_miss_ns = d_miss;
	}

	document.getElementById("lbl_skillrate").innerHTML = Math.floor(passive[4] / 10) + "%";
	document.getElementById("lbl_skilltype").innerHTML = passive[5];
	document.getElementById("lbl_skillpct").innerHTML = decimal(d_skill_h / 10,1) + "%";
	document.getElementById("lbl_critpct").innerHTML = decimal(d_crit / 10,1) + "%";
	document.getElementById("lbl_hitpct").innerHTML = decimal(d_hit / 10,1) + "%";
	document.getElementById("lbl_misspct").innerHTML = decimal(d_miss / 10,1) + "%";

	var d_attacks = 3000 / delay_mod;
	var d_min = d_attacks * ( passive[1] * d_skill_h + passive[3] * d_skill_m + crit[4] * d_crit + damage[4] * d_hit + damage[5] * d_miss_ns ) / 1000;
	document.getElementById("lbl_attacks").innerHTML = decimal(d_attacks,1);
	document.getElementById("lbl_damage").innerHTML = Math.floor(d_min);

	if (bonus[7][6]) {var bexp_pct = (exp_base[blv] > 0) ? Math.min(100,100 * (enemy.bexp * (1 + bonus[7][6]/100)) / exp_base[blv]) : "N/A";} else var bexp_pct = (exp_base[blv] > 0) ? Math.min(100,100 * enemy.bexp / exp_base[blv]) : "N/A";
	if (bonus[7][6]) {var jexp_pct = (exp_job[mod_misc['expsel'][job]][jlv] > 0) ? Math.min(100,100 * (enemy.jexp * (1 + bonus[7][6]/100))/ exp_job[mod_misc['expsel'][job]][jlv]) : "N/A";} else var jexp_pct = (exp_job[mod_misc['expsel'][job]][jlv] > 0) ? Math.min(100,100 * enemy.jexp / exp_job[mod_misc['expsel'][job]][jlv]) : "N/A";
	document.getElementById("enemy_bexppct").innerHTML = decimal(bexp_pct,3) + '%';
	document.getElementById("enemy_jexppct").innerHTML = decimal(jexp_pct,3) + '%';

	var bexp_min = bexp_pct * Math.min((d_min / enemy.hp) , d_attacks);
	var jexp_min = jexp_pct * Math.min((d_min / enemy.hp) , d_attacks);
	document.getElementById("lbl_bexp").innerHTML = decimal(bexp_min,2,true) + "%";
	document.getElementById("lbl_jexp").innerHTML = decimal(jexp_min,2) + "%";


// **** Element and modifier display ****

	var elem_armor = (o_bss) ? 6 : (bonus[7][1] ? bonus[7][1] : equip[3][5]);
	var tmp;

	for (var i = 0; i < 10; i++) {
		tmp = 100 + bonus[1][i];
		setcolorvalue("table_race_off" + i,tmp,1,2,3);
		tmp = 100 - bonus[2][i];
		setcolorvalue("table_race_def" + i,tmp,1,3,2);
		for (var j = 1; j < 5; j++) {
			tmp = element[j][i][elem] * (100 + bonus[3][i]) / 100;
			setcolorvalue("table_element_off" + j + i,tmp,1,2,3);
		}
		tmp = element[1][elem_armor][i] * (1 - bonus[4][i] / 100);
		setcolorvalue("table_element_def" + i,tmp,2,3,1);
		if (i < 3) {
			tmp = 100 + bonus[5][i];
			setcolorvalue("table_size_off" + i,tmp,1,2,3);
		}
	}
	document.getElementById("table_weapon").innerHTML = name_elem[elem];
	document.getElementById("table_armor").innerHTML = name_elem[elem_armor];

	tmp = element[enemy.elemlvl][enemy.elem][elem];
	tmp *= (100 + bonus[1][enemy.race]) / 100;
	tmp *= (100 + bonus[3][enemy.elem]) / 100;
	tmp *= (100 + bonus[5][enemy.size]) / 100;
	setcolorvalue("table_off",tmp,1,2,3);

	tmp = element[1][elem][0];
	tmp *= (100 - bonus[2][enemy.race]) / 100;
	tmp *= (100 - bonus[4][0]) / 100;
	setcolorvalue("table_def",tmp,2,3,1);

	oldTop = equip[2];
	oldMid = equip[3];
	oldBot = equip[4];

	var slutt = new Date();
	var tid = slutt.getTime() - start.getTime();
	output("Time used for calculations: " + decimal(tid/1000,2) + " seconds");

}
function calcPhysical(as, aslv, elem_mod, atk, atk_min, atk_max, atk_mod, d_mod_p, d_mod_s, up, up_min, up_max, bane, mast, reli, crum, card_mod, e_def, e_vitmin, e_vitmax, hits, o_cur) {

	var note = "";

	var skill = (as) ? true : false;

	if (skill) {
		switch (as[2]) {
		//	case "a_tshur":
		//		break;
			case "a_bomb" :
			case "a_acid" :
			case "a_gc" :
			case "a_mel" :
			case "a_sli" :
			case "a_smite" :
			case "a_sb" :
			case "a_vs" :
				return ["","","","","Disabled or not implemented"];
			case "a_sm" :
			case "a_sna" :
			case "a_hc" :
				note = "Buggy, buggy, buggy";
			default :
				d_mod_s += as[4] + as[5] * aslv;
				break;
		}
	}

	var d_mod = Math.floor(d_mod_p * d_mod_s / 100);

	var dam_n, dam_x, dam_r, dam_c, sel, miss;

	dam_r = Math.floor((mast + reli) * card_mod);
	dam_c = Math.floor(crum * card_mod);
	miss = Math.floor((crum + reli * elem_mod) * card_mod);

	dam_n = atk + atk_min + up_min;
	dam_x = atk + atk_max + up_max;
	//if (o_cur) { dam_n = Math.floor(dam_n * 0.75); dam_x = Math.floor(dam_x * 0.75); }

	dam_n = Math.floor(dam_n * d_mod / 100);
	dam_x = Math.floor(dam_x * d_mod / 100);
	dam_n = Math.floor(dam_n * (1 - e_def / 100)) + up + bane - e_vitmax;
	dam_x = Math.floor(dam_x * (1 - e_def / 100)) + up + bane - e_vitmin;

if(atk_mod){
	dam_n *= (1 + atk_mod / 100);
	dam_x *= (1 + atk_mod / 100);
	}
	sel = (dam_x < 1) ? 3 : (dam_n < 1) ? 1 : (dam_x == dam_n) ? 2 : 0;

	dam_n = Math.floor(dam_n * card_mod);
	dam_x = Math.floor(dam_x * card_mod);

	var damage = [];

	switch (sel) {
		case 3 :
			damage[0] = "";
			damage[1] = Math.floor(1 * elem_mod) + Math.floor(dam_r * elem_mod) + dam_c;
			damage[2] = "";
			break;
		case 2 :
			damage[0] = "";
			damage[1] = Math.floor(dam_x * elem_mod) + Math.floor(dam_r * elem_mod) + dam_c;
			damage[2] = "";
			break;
		case 1 :
			damage[0] = 1;
			damage[1] = (dam_x * (dam_x + 1) / 2 + 1 - dam_n) / (dam_x + 1 - dam_n);
			damage[1] = Math.floor(damage[1] * elem_mod) + Math.floor(dam_r * elem_mod) + dam_c;
			damage[2] = Math.floor(dam_x * elem_mod) + Math.floor(dam_r * elem_mod) + dam_c;
			break;
		default :
			damage[0] = Math.floor(dam_n * elem_mod) + Math.floor(dam_r * elem_mod) + dam_c;
			damage[2] = Math.floor(dam_x * elem_mod) + Math.floor(dam_r * elem_mod) + dam_c;
			damage[1] = Math.floor((damage[0] + damage[2]) / 2);
			break;
	}

	if (skill) {
		switch (as[2]) {
			case "c_env" :
				if (sel > 1) {
					damage[0] += 15 * aslv;
					damage[0] = Math.floor(damage[0] * elem_mod);
					damage[2] += 15 * aslv;
					damage[2] = Math.floor(damage[2] * elem_mod);
					damage[1] = Math.floor((damage[0] + damage[2]) / 2);
					note = "Damage: " + damage[0] + "-" + damage[2];
				} else {
					damage[1] += 15 * aslv;
					damage[1] = Math.floor(damage[1] * elem_mod);
					note = "Damage: " + damage[1];
				}
				break;
			case "a_pr" :
				var crit = calcPhysical(false, 0, elem_mod, atk, atk_min, atk_max, bonus[7][7], d_mod_p, d_mod_s, up, up_min, up_max, bane, mast, reli, crum, card_mod, 0, 0, 0, hits)
				note = "Crit: " + ((crit[0] == "") ? crit[1] : crit[0] + "-" + crit[2]);
				break;
			default :
				if (!note) note = (hits > 1 ? "Total " : "") + "Damage: " + (sel > 1 ? damage[1] * hits : damage[0] * hits + "-" + damage[2] * hits);
				break;
		}
	}

	return [damage[0], damage[1], damage[2], miss, note];

}
function calcMagic(as, aslv, elem_mod, min_matk, max_matk, e_mdef, e_int, e_vit, blv) {

	var matk_mult = 1;
	var hits = (as[5] < 0) ? 1 : as[5] + aslv;

	switch (as[2]) {
		case "a_esma" :
			matk_mult = (blv + 40) / 100;
			break;
		case "a_cbolt" :
		case "a_earth" :
		case "a_fbolt" :
		case "a_heav" :
		case "a_jup" :
		case "a_lbolt" :
		case "a_me" :
			break;
		case "a_fball" :
			matk_mult = 0.9 + 0.05 * aslv;
			break;
		case "a_frost" :
			matk_mult = 1 + 0.1 * aslv;
			break;
		case "a_fwall" :
			matk_mult = 0.5;
			break;
		case "a_holy" :
			matk_mult = 1.25;
			break;
		case "a_lov" :
			hits = 4;
			matk_mult = 0.8 + 0.2 * aslv;
			break;
		case "a_meteo" :
			hits = Math.floor((aslv + 1) / 2);
			break;
		case "a_nap" :
			matk_mult = 0.7 + 0.1 * aslv;
			break;
		case "a_sight" :
			matk_mult = 1 + 0.2 * aslv;
			break;
		case "a_soul" :
			hits = Math.floor((aslv + 1) / 2);
			break;
		case "a_storm" :
			hits = 10;
			matk_mult = 1 + 0.4 * aslv;
			break;
		case "a_thun" :
			matk_mult = 0.8;
			break;
		case "a_water" :
			hits = Math.pow(1 + Math.floor(aslv / 2),2);
			matk_mult = 1 + 0.3 * aslv;
			break;
		case "a_crimsonfire" :
			hits = aslv;
			matk_mult = 0.9;
			break;
		case "a_firedragon" :
	//		hits = 1;
			matk_mult = 2.5 + 1.5*aslv;
			break;
		case "a_icespear" :
			hits = aslv +2;
			matk_mult = 0.7;
			break;
		case "a_icecrystal" :
	//		hits = 1;
			matk_mult = 2 + 0.5*aslv;
			break;
		case "a_windblade" :
			hits = Math.ceil(aslv / 2);
			matk_mult = 0.6 + 0.1*aslv;
			break;
		case "a_lightningstrike" :
			matk_mult = 2.6 + 0.4*aslv;
			break;
		case "a_kamaitachi" :
			matk_mult = 2 + aslv;
			break;
		default :
			return ["","","","","This wasn't supposed to happen..."];
			break;
	}

	var magic = [], note;

	magic[0] = min_matk * matk_mult * (1 - e_mdef / 100) - e_int - e_vit / 2;
	magic[2] = max_matk * matk_mult * (1 - e_mdef / 100) - e_int - e_vit / 2;

	if (magic[2] < 1) {
		magic[0] = "";
		magic[1] = 1;
		magic[2] = "";
	} else if (magic[0] < 1) {
		magic[1] = (magic[2] * (magic[2] + 1) / 2 + 1 - magic[0]) / (magic[2] + 1 - magic[0]);
		magic[0] = 1;
	} else {
		magic[1] = (magic[0] + magic[2]) / 2;
	}

	for (var i = 0; i < 3; i++) magic[i] = Math.floor(magic[i] * elem_mod);

	note = (magic[1] > 0) ? "Total Damage: " + magic[0] * hits + "-" + magic[2] * hits : "You're not doing any damage.";

	return [magic[0],magic[1],magic[2],"",note];

}
function calcTrap(sname, aslv, elem_mod, inte, dex) {

	var trap, note;

	switch (sname) {
		case "a_blast" :
			trap = (50 + dex / 2) * (1 + inte / 100);
			break;
		case "a_clay" :
			trap = (75 + dex / 2) * (1 + inte / 100);
			break;
		case "a_blitz" :
			trap = 80 + Math.floor(inte / 2) * 2 + Math.floor(dex / 10) * 2;
			if (document.getElementById("p_sc")) trap += 6 * document.getElementById("p_sc").value;
			break;
		case "a_land" :
			trap = (75 + dex) * (1 + inte / 100);
			break;
		default :
			return ["","","","","This wasn't supposed to happen..."];
			break;
	}

	trap = Math.floor(trap * aslv);

	trap = Math.floor(trap * elem_mod);

	note = (trap > 0) ? "Total Damage: " + trap : "You're not doing any damage.";

	return ["",trap,"","",note];

}
function setJob() {
	var newjob = + document.getElementById("job_sel").value;
	if (newjob == 9) {
		//if (!confirm("You have selected the assassin job. Since it seems most assassins are too impatient to read beyond the second sentence of this box, the second sentence will be really long so I can make sure as much as possible of the important parts are read, instead of being ignored like my previous warning that assassins are incredibly annoying to code for was. This is the third sentence, which no one is going to read, so it has no actual content at all. Anyway, by selecting okay below, you acknowledge what I just said and what I meant about it, but didn't clarify. Proceed at own risk and all that.")) {
		//	document.getElementById("job_sel").value = job;
		//	return;
		//}
		if (!confirm("The dual wielding calc can be found at http://www.stud.ntnu.no/~magnusrk/dual/. Press cancel now to be redirected.")) {
			location.href = "../dual/";
		}
	}
	//if (newjob == 8 && confirm("You should know the way this works by now. To boldly go where no hunter has gone before (yeah, right) press okay.")) dostuff("calc4.css");
	//if (newjob == 11 && confirm("So you want to be a blacksmith? Then you probably want the matching blacksmith color scheme. Go ahead and press okay. If you're some kind of sissy wannabe smith that's only in it for the forging, press cancel to stick with the regular colors.")) dostuff("calc2.css");
	//if (newjob == 16 && confirm("Are you Mini-Snow? If so, press okay. Otherwise press cancel.")) dostuff("calc3.css");

	if (mod_misc['jobsel'][job] != mod_misc['jobsel'][newjob]) {
		document.getElementById("jlv_sel" + mod_misc['jobsel'][job]).style.display = "none";
		document.getElementById("jlv_sel" + mod_misc['jobsel'][newjob]).style.display = "inline";
	}

	var a;

	var ops = [];
	for (var i = 0; i < 10; i++) ops[mod_equip[i][0]] = '<option value="0" selected>' + name_location[i] + '</option>';
	for (var i in item_data) {
		if (item_use[i][newjob]) {
			a = (item_data[i][11] == 0) ? item_data[i][7] : 0;
			switch (a) {
				case 42 :
				case 48 :
				case 336 :
					ops[6] += '<option value="' + i + '">' + item_data[i][0] + '</option>';
					break;
				case 56 :
					ops[7] += '<option value="' + i + '">' + item_data[i][0] + '</option>';
					break;
				default :
					ops[a] += '<option value="' + i + '">' + item_data[i][0] + '</option>';
					break;
			}
		}
	}

	a = '';
	for (var i = 1; i < 4; i++) {
		a += '<select id="e_s0' + i + '" onchange="calc();"' + ((w_slot == i) ? '' : ' style="display: none"') + '>'
		a += ops[0];
		a += '</select>';
	}
	document.getElementById("i_eq0").innerHTML = a;

	a = '';
	for (var i = 1; i < 4; i++) {
		a += '<select id="e_s1' + i + '" onchange="calc();"' + ((w_slot == i) ? '' : ' style="display: none"') + '>'
		a += ops[1];
		a += '</select>';
	}
	document.getElementById("i_eq1").innerHTML = a;

	for (var i = 2; i < 10; i++) {
		a = '';
		a += '<select id="e_s' + i + '" onchange="calc();">';
		a += ops[mod_equip[i][0]];
		a += '</select>';
		document.getElementById("i_eq" + i).innerHTML = a;
	}

	a = '';
	a += '<select id="p_aspd" class="maxwidth" onchange="calc();">';
	a += '<option value="0" selected>' + name_aspd[0] + '</option>';
	for (var i = 1; i <= mod_misc['aspd'][newjob]; i++) a += '<option value="' + i + '">' + name_aspd[i] + '</option>';
	a += '</select>';
	document.getElementById('i_aspd').innerHTML = a;

	var tmp = 0;
	var b;
	for (var h in skill_passive) {
		if (use_passive[h][newjob] != 0) {
			a = skill_passive[h];

			switch(a[0]) {
				case 0 :
					b = 'sux2bu';
					break;
				case 1 :
					b = '<input id="' + a[2] + '" type="checkbox" onclick="calc();">';
					break;
				default :
					b = '<select id="' + a[2] + '" onchange="calc();">';
					switch (a[2]) {
//					case "p_ec" :
//						b += '<option value="0" selected>SP</option>';
//						for (var i = 1; i <= a[0]; i++) b += '<option value="' + i + '">' + i + '/5</option>';
//						break;
					default :
						b += '<option value="0" selected>0</option>';
						for (var i = 1; i <= a[0]; i++) b += '<option value="' + i + '">' + i + '</option>';
						break;
					}
					b += '</select>';
					break;
			}

			document.getElementById("i_ps" + tmp).innerHTML = a[1];
			document.getElementById("i_pslv" + tmp).innerHTML = b;
			tmp++;
		}
	}
	for (var h = tmp; h < 12; h++) {
		document.getElementById("i_ps" + h).innerHTML = "";
		document.getElementById("i_pslv" + h).innerHTML = "";
	}
	document.getElementById("i_as").innerHTML = "";
	document.getElementById("i_aslv").innerHTML = "";
	job = newjob;
}
function setSkillLv() {
	var a, b;
	var as = + document.getElementById("as_sel").value;
	a = '';
	if (as > 0) {
		var level =  skill_active[as][0];
// was : 		var level = (use_active[as][job] == 1 || skill_active[as][6] == 1) ? skill_active[as][0] : Math.min(document.getElementById('p_pl').value, skill_active[as][0]);
		a += '<select id="aslv_sel" onchange="calc();">';
		for (var i = 1; i < level; i++) a += '<option value="' + i + '">' + i + '</option>';
		a += '<option value="' + level + '" selected>' + level + '</option>';
		a += '</select>';
	}
	document.getElementById("i_aslv").innerHTML = a;
	switch (skill_active[as][2]) {
		case 'a_asura' :
			a = '<input id="as_exsel" size="4" onchange="calc();">';
			b = 'Remaining SP';
			break;
		case 'a_cart' :
			a = '<input id="as_exsel" size="4" onchange="calc();">';
			b = 'Used cart weight';
			break;
		case 'a_ap' :
			a = '<select id="as_exsel" onchange="calc();"><option value="0" selected>0</option><option value="1" selected>1</option><option value="2" selected>2</option><option value="3" selected>3</option><option value="4" selected>4</option><option value="5" selected>5</option><option value="6" selected>6</option><option value="7" selected>7</option><option value="8" selected>8</option><option value="9" selected>9</option><option value="10" selected>10</option></select>';
			b = 'Potion Research';
			break;
		default :
			a = '';
			b = '';
			break;
	}
	document.getElementById('as_exinp').innerHTML = a;
	document.getElementById('as_exinf').innerHTML = b;
	calc();
}
function changeWeapons(new_slot) {
	setWeapons(w_slot,'none');
	setWeapons(new_slot,'inline');
	w_slot = new_slot;
	calc();
}
function setWeapons(slot,disp) {
	document.getElementById("e_r0" + slot).style.display = disp;
	document.getElementById("e_s0" + slot).style.display = disp;
	document.getElementById("e_f" + slot).style.display = disp;
	document.getElementById("e_a" + slot).style.display = disp;
	document.getElementById("e_b" + slot).style.display = disp;
	document.getElementById("e_g" + slot).style.display = disp;
	document.getElementById("e_sh" + slot).style.display = disp;
	for (var j = 0; j < 4; j++) {
		document.getElementById("e_c0" + j + slot).style.display = disp;
		document.getElementById("e_e" + j + slot).style.display = disp;
	}
	document.getElementById("e_r1" + slot).style.display = disp;;
	document.getElementById("e_s1" + slot).style.display = disp;
	document.getElementById("e_c1" + slot).style.display = disp;
	document.getElementById("o_ele" + slot).style.display = disp;
}
function makeCookie() {
	var cookieInfo = '';
	cookieInfo += concatCookie("job_sel",0);
	cookieInfo += concatCookie("blv_sel",0);
	cookieInfo += concatCookie("jlv_sel" + mod_misc['jobsel'][job],0);
	cookieInfo += concatCookie("fixlv",1);
	cookieInfo += concatCookie("enemy_id",0);
	cookieInfo += concatCookie("w_s",0);
	for (var i = 0; i < 6; i++) cookieInfo += concatCookie("sta" + i,0);

	for (var h = 1; h < 4; h++) {
		cookieInfo += concatCookie("e_s0" + h,0);
		cookieInfo += concatCookie("e_r0" + h,0);
		cookieInfo += concatCookie("e_f" + h,1);
		cookieInfo += concatCookie("e_a" + h,0);
		cookieInfo += concatCookie("e_b" + h,0);
		cookieInfo += concatCookie("e_g" + h,0);
		for (var i = 0; i < 4; i++) {
			cookieInfo += concatCookie("e_c0" + i + h,0);
			cookieInfo += concatCookie("e_e" + i + h,0);
		}
		cookieInfo += concatCookie("e_s1" + h,0);
		cookieInfo += concatCookie("e_r1" + h,0);
		cookieInfo += concatCookie("e_c1" + h,0);
		cookieInfo += concatCookie("o_ele" + h,0);
	}

	for (var i = 2; i < 10; i++) {
		cookieInfo += concatCookie("e_s" + i,0);
		cookieInfo += concatCookie("e_r" + i,0);
		cookieInfo += concatCookie("e_c" + i,0);
	}

	cookieInfo += concatCookie("p_aspd",0);
	for (var i in skill_passive) {
		if (use_passive[i][job] == 1) cookieInfo += concatCookie(skill_passive[i][2],2);
	}
	for (var i = 0; i < skill_o.length; i++) {
		cookieInfo += concatCookie(skill_o[i],2);
	}
	cookieInfo += concatCookie("i_party",0);
	return cookieInfo;
}

var xupdate_js = 20050206;