
function emulateDisabled(selectBox) {
	for (var i=0, option; option = selectBox.options[i]; i++) {
		if (option.disabled) {
			option.style.color = "#ccc";
		}else{
			option.style.color = "#000";
		}
	}
}

function restoreEmulateDisabled(selectBox) {
	for (var i=0, option; option = selectBox.options[i]; i++) {
		if(option.selected && option.disabled){
			option.selected=false;
		}
	}
}

function addEmulation(selectBox){
	window.select_current = new Array();
	selectBox.onfocus = function(){ window.select_current[this.id] = this.selectedIndex; }
	selectBox.oldKeyUp = selectBox.onKeyUp;
	selectBox.onKeyUp = function(){ restoreEmulateDisabled(this); this.oldKeyUp(); }
	
	selectBox.oldClick = selectBox.onClick;
	selectBox.onClick = function(){ restoreEmulateDisabled(this); this.oldClick(); }
}

window.onload = function() {
	if (document.getElementsByTagName) {
		var s = document.getElementsByTagName("select");
		if (s.length > 0) {
			window.select_current = new Array();
			for (var i=0, select; select = s[i]; i++) {
				select.onfocus = function(){ window.select_current[this.id] = this.selectedIndex; }
				select.onchange = function(){ restoreEmulateDisabled(this); }
				emulateDisabled(select);
			}
		}
	}
}

var isCalculatingACP = false;

function calculateAvailCP() {
	if (isCalculatingACP) return;
	isCalculatingACP = true;
	var contage_df = parseInt(document.chargen.contage_df.value);
	if (isNaN(contage_df)) contage_df = 0;
	contage_df = Math.max(0,Math.min(6,contage_df));
	document.chargen.contage_df.value = contage_df;
	
	var contage_nichtDf = parseInt(document.chargen.contage_nichtDf.value);
	if (isNaN(contage_nichtDf)) contage_nichtDf = 0;
	contage_nichtDf = Math.max(0,contage_nichtDf);
	document.chargen.contage_nichtDf.value = contage_nichtDf;

	var cp = 15 + Math.round(contage_nichtDf / 10) + contage_df;

	document.getElementById("chp_calc").innerHTML = "15 ChP <br/>+ " + contage_df + " ChP (DF-Bonus) <br/>+ (" + contage_nichtDf + " / 10 ChP) (Contage)";
	document.getElementById("chp_total").innerHTML = cp + " ChP";
	isCalculatingACP = false;
	return cp;
}

var isCalculatingTCP = false;

function calculateTotalCP() {
	// Calculate total CP
	if (isCalculatingTCP) return;
	isCalculatingTCP = true;

	var skill_chp = 0;
	var magic_chp = parseInt(document.getElementById('magic_chp').innerHTML);
	var alchemy_chp = parseInt(document.getElementById('alchemie_chp').innerHTML);
		
	var res_schaden = document.chargen.res_schaden.selectedIndex;
	res_schaden = Math.max(0,Math.min(10,res_schaden));
	var res_magie = document.chargen.res_magie.selectedIndex;
	res_magie = Math.max(0,Math.min(10-res_schaden,res_magie));
	var res_alchemie = document.chargen.res_alchemie.selectedIndex;
	res_alchemie = Math.max(0,Math.min(10-res_schaden-res_magie,res_alchemie));
	
	document.chargen.res_schaden.selectedIndex = res_schaden;
	document.chargen.res_magie.selectedIndex = res_magie;
	document.chargen.res_alchemie.selectedIndex = res_alchemie;
	
	// Update the resist rank selections
	var ranksUsed = res_schaden + res_alchemie + res_magie;
	
	var i=0;
	for (i = 0; i <= 10; i++) {
		// TODO : disabling doesn't work for IE
		document.chargen.res_schaden.item(i).disabled = !(i <= res_schaden + (10 - ranksUsed));
		document.chargen.res_magie.item(i).disabled = !(i <= res_magie + (10 - ranksUsed));
		document.chargen.res_alchemie.item(i).disabled = !(i <= res_alchemie + (10 - ranksUsed));
	}
	emulateDisabled(document.chargen.res_schaden);
	emulateDisabled(document.chargen.res_magie);
	emulateDisabled(document.chargen.res_alchemie);
	
	document.getElementById("total_lep").innerHTML = 2 + res_schaden;
	document.getElementById("total_meuchelschutz").innerHTML = res_schaden;	

	//
	
	var nahkampfBonus = document.chargen.skill_nahkampf.selectedIndex;
	var nahkampfRang = 0;

	if (document.chargen.skill_einhaendig.checked) { skill_chp += 1; nahkampfRang += 1; }
	if (document.chargen.skill_zweihaendig.checked) { skill_chp += 2; nahkampfRang += 1; }
	if (document.chargen.skill_stangenwaffen.checked) { skill_chp += 2; nahkampfRang += 1; }
	if (document.chargen.skill_schusswaffen.checked) { skill_chp += 2; }
	if (document.chargen.skill_belagerung.checked) { skill_chp += 3; }
	if (document.chargen.skill_zwei_waffen.checked) { skill_chp += 2; nahkampfRang += 1; }
	
	var maxNahkampfBonus = 10 - nahkampfRang;
	for (i = 0; i <= 10; i++) {
		document.chargen.skill_nahkampf.item(i).disabled = i > maxNahkampfBonus;
	}
	if (nahkampfBonus > maxNahkampfBonus) {
		nahkampfBonus = maxNahkampfBonus;
		document.chargen.skill_nahkampf.selectedIndex = nahkampfBonus;
	}
	document.getElementById("total_nahkampf").innerHTML = nahkampfRang + nahkampfBonus;
	
	if (document.chargen.skill_schild.checked) { skill_chp += 3; }
	if (document.chargen.skill_leicht.checked) { skill_chp += 2; }
	if (document.chargen.skill_mittel.checked) { skill_chp += 4; }
	if (document.chargen.skill_schwer.checked) { skill_chp += 8; }
	if (document.chargen.skill_regeneration.checked) { skill_chp += 2; }
	if (document.chargen.skill_zaehigkeit.checked) { skill_chp += 2; }
	
	if (document.chargen.skill_erste_hilfe.checked) { skill_chp += 1; }
	if (document.chargen.skill_erste_hilfe.checked) {
		if (document.chargen.skill_heilkunde.checked) { skill_chp += 2; }
	}
	if (document.chargen.skill_erste_hilfe.checked && document.chargen.skill_heilkunde.checked) {
		if (document.chargen.skill_arztkunde.checked) { skill_chp += 4; }
	}

	if (document.chargen.skill_feuer_machen.checked) { skill_chp += 1; }
	if (document.chargen.skill_lesen_schreiben.checked) { skill_chp += 1; }
	if (document.chargen.skill_zaehlen_rechnen.checked) { skill_chp += 1; }
	if (document.chargen.skill_kraeuteranbau.checked) { skill_chp += 1; }
	
	if (document.chargen.skill_holzarbeiten.checked) { skill_chp += 2; }
	if (document.chargen.skill_lederarbeiten.checked) { skill_chp += 2; }
	if (document.chargen.skill_metallarbeiten.checked) { skill_chp += 3; }
	
	if (document.chargen.skill_schloesser.checked) { skill_chp += 2; }
	if (document.chargen.skill_fallen.checked) { skill_chp += 3; }
	
	skill_chp += document.chargen.skill_nahkampf.selectedIndex;
	
	if (document.chargen.zugang_magie.checked) { skill_chp += 2; }
	if (document.chargen.zugang_alchemie.checked) { skill_chp += 1; }
	if (document.chargen.zugang_erwAlchemie.checked && document.chargen.zugang_alchemie.checked) { skill_chp += 2; }

	if (document.chargen.zugang_magie.checked) {
		skill_chp += 2*res_magie + 5*res_schaden + res_alchemie*2;
	} else {
		skill_chp += 3*res_magie + 4*res_schaden + res_alchemie*2;
	}
	
	skill_chp += document.chargen.magie_extraRang.selectedIndex;
	
	var chp = calculateAvailCP();
	var chp_used = skill_chp + magic_chp + alchemy_chp;
	document.getElementById("chp_used").innerHTML = chp_used;
	var bilanzElement = document.getElementById("chp_balance");
	
	var magic_maxrank = parseInt(document.getElementById("magic_maxrank").innerHTML);
	var magic_maxmaxrank = parseInt(document.getElementById("magic_maxmaxrank").innerHTML);
	
	if (chp_used > chp) {
		bilanzElement.setAttribute("bgColor","#ff0000");
		document.body.setAttribute("bgColor","#ffcccc");
	} else {
		bilanzElement.setAttribute("bgColor","#ffffff");
		document.body.setAttribute("bgColor","#ffffff");
	}
	
	bilanzElement.innerHTML = chp - chp_used;
	
	var validationElement = document.getElementById("validation_result");
	var chpLeft = chp-chp_used;

	var allOK = true;
	
	validationElement.innerHTML = "";
	if (ranksUsed > 10) {
		validationElement.innerHTML = validationElement.innerHTML + "Die Summe der Resistenzen darf maximal 10 betragen, ist im Moment " + ranksUsed + " !<br/>";
		allOK = allOK && false;
	}

	if (nahkampfRang > 10)  { 
		validationElement.innerHTML = validationElement.innerHTML + "Der Nahkampfrang darf maximal 10 betragen, ist im Moment jedoch " + ranksUsed + " !<br/>";
		allOK = allOK && false;	
	}

	if (magic_maxrank > magic_maxmaxrank) {
		validationElement.innerHTML = validationElement.innerHTML + "Der maximal anwendbare Magierang darf durch Zukauf von R&auml;ngen nur auf das doppelte (" + magic_maxmaxrank + ") erhöht werden, beträgt jetzt jedoch " + magic_maxrank + " !<br/>";
		allOK = allOK && false;
	}

	if (chpLeft > 0) {
		validationElement.innerHTML = validationElement.innerHTML + "Du hast noch " + chpLeft + " Punkte &uuml;brig. <br/>";
		allOK = allOK && true;
	} else if (chpLeft < 0) {
		validationElement.innerHTML = validationElement.innerHTML + "Der Charakter verwendet " + (-chpLeft) + " Punkte zu viel !<br/>";
		allOK = allOK && false;
	} else {
		validationElement.innerHTML = validationElement.innerHTML + "Du hast alle Punkte verwendet.<br/>";
		allOK = allOK && true;
	}

	if (allOK) {
		validationElement.innerHTML = validationElement.innerHTML + "Der Charakter ist OK.";
		document.chargen.drucken.disabled=false;
	} else {
		validationElement.innerHTML = validationElement.innerHTML + "Der Charakter ist nicht OK !";
		document.chargen.drucken.disabled=true;
	}
	

	isCalculatingTCP = false;
}

function toggleSkillsEnabled() {
	document.chargen.skill_zwei_waffen.disabled = !(document.chargen.skill_einhaendig.checked);
	document.chargen.skill_heilkunde.disabled = !(document.chargen.skill_erste_hilfe.checked);
	document.chargen.skill_arztkunde.disabled = !(document.chargen.skill_erste_hilfe.checked && document.chargen.skill_heilkunde.checked);
	
	calculateTotalCP();
}

function updateMagicStats() {
	var chp = 0;
	var rank = 0;
	var extraRang = 0;
	
	document.chargen.magie_ruestung.disabled = !(document.chargen.zugang_magie.checked && document.chargen.magie_ritualmagie.checked);
	
	if (document.chargen.zugang_magie.checked) {
	if (document.chargen.magie_blindheit.checked) { chp += 1; }
	if (document.chargen.magie_schweigen.checked) { chp += 1; }
	if (document.chargen.magie_taubheit.checked) { chp += 1; }
	if (document.chargen.magie_schlaf.checked) { chp += 2; }

	if (document.chargen.magie_windstoss.checked) { chp += 1; }
	if (document.chargen.magie_energieball.checked) { chp += 4; }
	
	if (document.chargen.magie_freundschaft.checked) { chp += 3; }
	if (document.chargen.magie_furcht.checked) { chp += 2; }
	if (document.chargen.magie_waffe_beschweren.checked) { chp += 1; }
	if (document.chargen.magie_verwirrung.checked) { chp += 1; }
	if (document.chargen.magie_wahrheit.checked) { chp += 3; }
	
	if (document.chargen.magie_gift_neutralisieren.checked) { chp += 2; }
	if (document.chargen.magie_heilung.checked) { chp += 2; }
	
	if (document.chargen.magie_aufheben.checked) { chp += 3; }
	if (document.chargen.magie_licht.checked) { chp += 1; }
	if (document.chargen.magie_energiefeld.checked) { chp += 3; }
	if (document.chargen.magie_identifizieren.checked) { chp += 2; }
	if (document.chargen.magie_ruestung.checked && document.chargen.magie_ritualmagie.checked) { chp += 4; }
	if (document.chargen.magie_ritualmagie.checked) { chp += 2; }
	
	rank = 1 + Math.floor(chp / 5);
	
	extraRang = document.chargen.magie_extraRang.selectedIndex;
	var maxExtraRang = rank;
	if (maxExtraRang+rank > 10) {
		maxExtraRang = 10-rank;	
	}
		
	if (extraRang + rank > 10) {
		extraRang = maxExtraRang;
	}
	if (extraRang < 0) {
		extraRang = 0;
	}
	document.chargen.magie_extraRang.selectedIndex = extraRang;
	
	for (var i = 0; i <= 10; i++) {
		document.chargen.magie_extraRang.item(i).disabled = (i > maxExtraRang);
	}
	emulateDisabled(document.chargen.magie_extraRang);
	
	}
	
	document.getElementById("magic_chp").innerHTML = chp;
	document.getElementById("magic_maxrank").innerHTML = (rank + extraRang);
	document.getElementById("magic_maxmaxrank").innerHTML = Math.min(10,2*rank);
	
	calculateTotalCP();
}

function toggleMagicEnabled() {
	var enabled = false;
	
	if (document.chargen.zugang_magie.checked) { enabled = true; }
	
	var elements = document.chargen.getElementsByTagName("input");
	
	for (var i = 0; i < elements.length; i++) {
		if (elements[i].name.substr(0,6) == "magie_") {
			elements[i].disabled = !enabled;
		}
	}
	
	document.chargen.magie_extraRang.disabled = !enabled;
	
	updateMagicStats();
}

function updateAlchemyStats() {
	var chp = 0;
	
	if (document.chargen.zugang_alchemie.checked) {
	if (document.chargen.alchemie_blindheit.checked) { chp += 1; }
	if (document.chargen.alchemie_schweigen.checked) { chp += 1; }
	if (document.chargen.alchemie_taubheit.checked) { chp += 1; }
	if (document.chargen.alchemie_schlaf.checked) { chp += 1; }
	if (document.chargen.alchemie_freundschaft.checked) { chp += 1; }
	if (document.chargen.alchemie_verwirrung.checked) { chp += 1; }
	if (document.chargen.alchemie_wahrheit.checked) { chp += 1; }
	if (document.chargen.alchemie_amnesie.checked) { chp += 1; }
	if (document.chargen.alchemie_gift.checked) { chp += 1; }
	if (document.chargen.alchemie_gegengift.checked) { chp += 1; }
	if (document.chargen.alchemie_heilung.checked) { chp += 1; }
	if (document.chargen.alchemie_meditation.checked) { chp += 2; }
	if (document.chargen.alchemie_gesundheit.checked) { chp += 2; }
	
	if (document.chargen.zugang_erwAlchemie.checked) {
		if (document.chargen.alchemie_kg_schlaf.checked) { chp += 3; }
		if (document.chargen.alchemie_kg_gift.checked) { chp += 3; }
		if (document.chargen.alchemie_kg_verwirrung.checked) { chp += 3; }
	
		if (document.chargen.alchemie_p_schiesspulver.checked) { chp += 3; }
		if (document.chargen.alchemie_p_verstaerken.checked) { chp += 2; }
	}
	
	}
	
	document.getElementById("alchemie_chp").innerHTML = chp;

	calculateTotalCP();
}

function toggleAlchemyEnabled() {
	var maxAlchemy = 0;
	
	if (document.chargen.zugang_alchemie.checked) {
		maxAlchemy = 1;
	}
	document.chargen.zugang_erwAlchemie.disabled = (maxAlchemy  < 1);
	
	if (maxAlchemy > 0 && document.chargen.zugang_erwAlchemie.checked) {
		maxAlchemy = 3;
	}
	
	var elements = document.chargen.getElementsByTagName("input");
	
	for (var i = 0; i < elements.length; i++) {
		if (elements[i].name.substr(0,12) == "alchemie_kg_") {
			elements[i].disabled = (maxAlchemy < 2);
		}
		else if (elements[i].name.substr(0,11) == "alchemie_p_") {
			elements[i].disabled = (maxAlchemy < 3);
		}
		else if (elements[i].name.substr(0,9) == "alchemie_") {
			elements[i].disabled = (maxAlchemy < 1);
		}
	} 
	
	if (!document.chargen.alchemie_gift.checked) { document.chargen.alchemie_kg_gift.disabled = true; }
	if (!document.chargen.alchemie_verwirrung.checked) { document.chargen.alchemie_kg_verwirrung.disabled = true; }
	if (!document.chargen.alchemie_schlaf.checked) { document.chargen.alchemie_kg_schlaf.disabled = true; }
	
	updateAlchemyStats();
}

function resetMagic() {
	var elements = document.chargen.getElementsByTagName("input");
	
	for (var i = 0; i < elements.length; i++) {
		if (elements[i].name.substr(0,6) == "magie_") {
			elements[i].checked = false;
		}
	}
	
	document.chargen.magie_extraRang.selectedIndex = 0;
	
	updateMagicStats();
}

function resetAlchemy() {
	var elements = document.chargen.getElementsByTagName("input");
	
	for (var i = 0; i < elements.length; i++) {
		if (elements[i].name.substr(0,9) == "alchemie_") {
			elements[i].checked = false;
		}
	}
	
	updateAlchemyStats();
}

function resetSkills() {
	var elements = document.chargen.getElementsByTagName("input");
	
	for (var i = 0; i < elements.length; i++) {
		if (elements[i].name.substr(0,6) == "skill_") {
			elements[i].checked = false;
		}
	}
	
	document.chargen.skill_nahkampf.selectedIndex = 0;
	
	calculateTotalCP();
}

function resetRanks() {
	document.chargen.res_schaden.selectedIndex = 0;
	document.chargen.res_alchemie.selectedIndex = 0;
	document.chargen.res_magie.selectedIndex = 0;
	
	document.chargen.zugang_magie.checked = false;
	document.chargen.zugang_alchemie.checked = false;
	document.chargen.zugang_erwAlchemie.checked = false;
	
	toggleMagicEnabled();
	toggleAlchemyEnabled();
	calculateTotalCP();
}

function postLoad() {
	calculateAvailCP();
	toggleMagicEnabled();
	toggleAlchemyEnabled();
	toggleSkillsEnabled();
	updateMagicStats();
	updateAlchemyStats();	
	calculateTotalCP();
}

function invalidate() {
	var validationElement = document.getElementById("validation_result");
	validationElement.innerHTML = "Nicht gepr&uuml;ft.";
}

function validateAll() {
	calculateAvailCP();
	toggleMagicEnabled();
	toggleAlchemyEnabled();
	toggleSkillsEnabled();
	updateMagicStats();
	updateAlchemyStats();	
	calculateTotalCP();
}

postLoad();