var skills = {};
var skillPoints = 0;

function updateSkillPointDisplay() {
	$('skill_points').innerHTML = skillPoints;
}

function addPoints(stat, change) {
	change = change || 1;
	var stat_field = $('hidden_' + stat);
	if (stat_field) {
		var current_increase_value = parseFloat(stat_field.value);
		var current_total_value = parseFloat($(stat).innerHTML);
		
		// How much?
		if (current_total_value < 50) {
			var cost = 1;
		} else if (current_total_value < 70) {
			var cost = 2;
		} else if (current_total_value < 80) {
			var cost = 3;
		} else if (current_total_value < 90) {
			var cost = 4;
		} else if (current_total_value < 94) {
			var cost = 5;
		} else if (current_total_value < 96) {
			var cost = 6;
		} else if (current_total_value = 96) {
			var cost = 7;
		} else if (current_total_value = 97) {
			var cost = 8;
		} else if (current_total_value = 98) {
			var cost = 9;
		}

		//var cost = 2;
		if (change == -1) {
			if (current_total_value < 51) {
				var cost = 1;
			} else if (current_total_value < 71) {
				var cost = 2;
			} else if (current_total_value < 81) {
				var cost = 3;
			} else if (current_total_value < 91) {
				var cost = 4;
			} else if (current_total_value < 95) {
				var cost = 5;
			} else if (current_total_value < 97) {
				var cost = 6;
			} else if (current_total_value = 97) {
				var cost = 7;
			} else if (current_total_value = 98) {
				var cost = 8;
			} else if (current_total_value = 99) {
				var cost = 9;
			}
			cost *= -1;
		}

		if (skillPoints >= cost) {	
			// Increment
			var new_increase_value = current_increase_value + change;
			
			// Fill in values
			var new_value = current_total_value + change;
			try {new_value = new_value.toFixed(0);} catch(err) {}
			$(stat).innerHTML = new_value;
			stat_field.value = new_increase_value;
			$('modifier_' + stat).innerHTML = new_increase_value;
			// Decrease skill points
			skillPoints -= cost;
			updateSkillPointDisplay();
			$('inc').innerHTML = retCost(new_value);
		}
	}
}

function subtractPoints(stat, change) {
	change = change || 1;
	var stat_field = $('hidden_' + stat);
	if (stat_field) {
		var current_increase_value = parseFloat(stat_field.value);
		if (current_increase_value > 0) {
			change *= -1;
			addPoints(stat, change);
		}
	}
}

function attributeCost(stat, change) {
	var stat_field = $('hidden_' + stat);
	if (stat_field) {
		var current_increase_value = parseFloat(stat_field.value);
		var current_total_value = parseFloat($(stat).innerHTML);
		
		// How much?
		if (current_total_value < 50) {
			var cost = 1;
		} else if (current_total_value < 70) {
			var cost = 2;
		} else if (current_total_value < 80) {
			var cost = 3;
		} else if (current_total_value < 90) {
			var cost = 4;
		} else if (current_total_value < 94) {
			var cost = 5;
		} else if (current_total_value < 96) {
			var cost = 6;
		} else if (current_total_value = 96) {
			var cost = 7;
		} else if (current_total_value = 97) {
			var cost = 8;
		} else if (current_total_value = 98) {
			var cost = 9;
		} else if (current_total_value = 99) {
			var cost = 10;
		}
		return cost;
	}
	return 0;
}

function skillLevel(skill) {
	return parseInt($('skill_level_' + skill).innerHTML);
}

function addSkillPoints(skill) {
	// Where is it at currently and how much does it cost?
	var current_modifier = parseInt($('hidden_' + skill).value);
	var points_to_modify = skillUpgradeCost(skill);
	
	// Do I have enough points?
	if (skillPoints < points_to_modify) {
		return false;
	}
	
	// See if parent is leveled up enough (if there is a parent)
	if (!prerequisiteSkillMet(skill)) {
		return false;
	}
	
	// Ok, up the skill
	skillPoints -= points_to_modify;
	$('skill_level_' + skill).innerHTML = skillLevel(skill) + 1;
	$('hidden_' + skill).value = current_modifier + 1;
	updateSkillPointDisplay();
	
	return true;
}

function prerequisiteSkillMet(skill, offset) {
	offset = offset || 0;
	var parent = skills[skill].parent;
	if (parent && skillLevel(parent) - offset <= skillLevel(skill) / 2) {
		return false;
	}
	
	return true;
}

function prerequisiteSkillMetForSubtract(skill, offset) {
	offset = offset || 0;
	var parent = skills[skill].parent;
	if (parent && skillLevel(parent) - offset < skillLevel(skill) / 2) {
		return false;
	}
	
	return true;
}

function subtractSkillPoints(skill) {
	// Where is it at currently and how much did it cost?
	var current_modifier = parseInt($('hidden_' + skill).value);
	var points_to_modify = skillDowngradeCost(skill);
	
	// Already minimum level?
	if (current_modifier == 0) {
		return false;
	}
			
	skillPoints += points_to_modify;
	$('skill_level_' + skill).innerHTML = skillLevel(skill) - 1;
	$('hidden_' + skill).value = current_modifier - 1;

	// Ok, subtract, but first check child to make sure they go down if needed too
	var child = skillChild(skill);
	if (child && !prerequisiteSkillMetForSubtract(child)) {
		subtractSkillPoints(child);
		if (child && !prerequisiteSkillMetForSubtract(child)) {
			subtractSkillPoints(child);
		}
	}
	updateSkillPointDisplay();
	
	return true;
}

function skillChild(skill) {
	for (var s in skills) {
		if (skills[s].parent == skill) {
			return s;
		}
	}
	
	return;
}

function attributePointsNeededTip(stat) {
	set_tip('Skill Points Needed: <b>' + attributeCost(stat, 1) + '</b>', 0, 0, 1, 1);	
}

function pointsNeededTip(skill) {
	if (prerequisiteSkillMet(skill)) {
		var points_to_modify = skillUpgradeCost(skill);
		set_tip('Skill Points Needed: <b>' + points_to_modify + '</b>', 0, 0, 1, 1);
	}
	else {
		set_tip('Prerequisite skill level not met', 0, 0, 1, 1);
	}
}

function skillUpgradeCost(skill) {
	return parseInt((skills[skill].base_cost + (skillLevel(skill) - 1)) / 2) + 1;
}

function skillDowngradeCost(skill, offset) {
	offset = offset || 0;
	return parseInt((skills[skill].base_cost + (skillLevel(skill) - 2 - offset)) / 2) + 1;
}

function calculatePointsGivenOnSubtract(skill, num) {
	var num = num || 1;
	var current_modifier = parseInt($('hidden_' + skill).value);
	var points_to_modify = 0;
	
	// Already minimum level?
	if (current_modifier == 0) {
		return 0;
	}

	// Figure out my max level after parent goes down by num
	if (skills[skill].parent) {
		var max_level = (skillLevel(skills[skill].parent) - num) * 2;
		if (max_level < current_modifier) {
			points_to_modify = 0;
			for (var i = 0; i < current_modifier - max_level; i++) {
				points_to_modify += skillDowngradeCost(skill, i);
			}
		
			var child = skillChild(skill);
			if (child) {
				points_to_modify += calculatePointsGivenOnSubtract(child, current_modifier - max_level);
			}
		}
	}
	else {
		points_to_modify = skillDowngradeCost(skill);
		var child = skillChild(skill);
		if (child) {
			points_to_modify += calculatePointsGivenOnSubtract(child, num);
		}
	}
	
	return points_to_modify;
}

function attributePointsGivenTip(stat) {
	var stat_field = $('hidden_' + stat);
	if (stat_field) {
		var current_increase_value = parseFloat(stat_field.value);
		if (current_increase_value > 0) {
			set_tip('Skill Points Returned: <b>' + (-1 * attributeCost(stat, -1)) + '</b>', 0, 0, 1, 1);
		}
		else {
			set_tip('Cannot remove points', 0, 0, 1, 1);
		}
	}
}

function pointsGivenTip(skill) {
	var points_to_modify = calculatePointsGivenOnSubtract(skill);
	if (points_to_modify) {
		set_tip('Skill Points Returned: <b>' + points_to_modify + '</b>', 0, 0, 1, 1);
	}
	else {
		set_tip('Cannot remove points', 0, 0, 1, 1);
	}

}

function getSkill(stat, dir) {
var stat_field = $(stat);
	if (stat_field && dir == '+') {
		inc = retCost(stat_field.innerHTML, '+')
		return "Skill points to increase skill: <strong id='inc'>"+inc+"</strong>";
	} else if (stat_field) {
		inc = retCost(stat_field.innerHTML, '-')
		return "Skill points returned: <strong id='inc'>"+inc+"</strong>";
	}
}

function retCost(val, dir) {
	if (dir == "plus" || dir == "+") {
		if (val < 50) {
			var cost = 1;
		} else if (val < 70) {
			var cost = 2;
		} else if (val < 80) {
			var cost = 3;
		} else if (val < 90) {
			var cost = 4;
		} else if (val < 94) {
			var cost = 5;
		} else if (val < 96) {
			var cost = 6;
		} else if (val = 96) {
			var cost = 7;
		} else if (val = 97) {
			var cost = 8;
		} else if (val = 98) {
			var cost = 9;
		}
	} else {
		if (val < 51) {
			var cost = 1;
		} else if (val < 71) {
			var cost = 2;
		} else if (val < 81) {
			var cost = 3;
		} else if (val < 91) {
			var cost = 4;
		} else if (val < 95) {
			var cost = 5;
		} else if (val < 97) {
			var cost = 6;
		} else if (val = 97) {
			var cost = 7;
		} else if (val = 98) {
			var cost = 8;
		} else if (val = 99) {
			var cost = 9;
		}
	}
	return cost;
}