var treeAnchors = { "tree1":[25,25], "tree2":[325,25], "tree3":[625,25] };

var MAX_POINTS = 13; // maximum points to spend
var pointsSpent = 0; // default to no points spent

function skillRefFromId(id) {
	var pieces = id.split('-');
	return {
		"tree" : parseInt(pieces[1]),
		"row" : parseInt(pieces[2]),
		"col" : parseInt(pieces[3])
	}
}

function skillFromId(id) {
	var pieces = id.split('-');
	return treeData[parseInt(pieces[1])]['tree'][parseInt(pieces[2])][parseInt(pieces[3])];
}

function skillFromPos(tree,row,col) {
	return treeData[tree]['tree'][row][col];
}

function skillFromRef(ref) {
	return treeData[ref["tree"]]['tree'][ref["row"]][ref["col"]]; 
}

function tryToggleOnSkill(id) {
	var skillRef = skillRefFromId(id);
	var skillData = skillFromRef(skillRef);
	var thisTree = treeData[skillRef["tree"]];
	
	// First, check to make sure skill isn't already on
	if(skillData['state'] > 0) {
		return false;
	}
	
	// Second, check to make sure we're not at the max points spent
	if(pointsSpent >= MAX_POINTS) {
		return false;
	}
	
	// Third, check to make sure we have enough points spent in this tree
	if(thisTree["points"] < skillRef["row"]) {
		return false;
	}
	
	// Fourth, check to make sure we meet skill-specific pre-reqs
	for(var pre in thisTree['prereqs']) {
		if(pre == id) {
			var preSkill = skillFromId(thisTree['prereqs'][pre]);
			if(preSkill['state'] < 1) return false;
		}
	}
	
	// Checks passed, toggle the skill on.
	skillData['state'] = 1;
	thisTree['points'] += 1;
	pointsSpent += 1;
	
	$('#'+id+'-points').text("1/1").addClass('points-on');
	$('#points-spent').text(String(pointsSpent)+"/13");
	$('#'+thisTree['anchor']+' > .tree-count').text(String(thisTree['points']));
	
	buildToAnchor();
	
	return true;
}

function tryToggleOffSkill(id) {
	var skillRef = skillRefFromId(id);
	var skillData = skillFromRef(skillRef);
	var thisTree = treeData[skillRef["tree"]];
	
	// First, check to make sure skill isn't already on
	if(skillData['state'] < 1) {
		return false;
	}
	
	// Second, check to make sure we wouldn't be creating an invalid build
	var pointCount = 0;
	for(var row in thisTree['tree']) {
		for(var col in thisTree['tree'][row]) {
			if(thisTree['tree'][row][col]['state'] > 0) {
				if(row > skillRef['row']) {
					// We're deeper than the skill we're removing.
					// Check to make sure there's enough count.
					if(pointCount < row) {
						// Oh no, not enough points to be able to remove one!
						return false;
					}
				}
				// Assuming this isn't the skill we want to remove, increment the count
				if(skillRef["row"] != row || skillRef["col"] != col) {
					pointCount++;
				}
			}
		}
	}
	
	// Fourth, check to make sure we meet skill-specific pre-reqs
	for(var pre in thisTree['prereqs']) {
		if(thisTree['prereqs'][pre] == id) {
			var preSkill = skillFromId(pre);
			if(preSkill['state'] > 0) return false;
		}
	}
	
	// Checks passed, toggle the skill off.
	skillData['state'] = 0;
	thisTree['points'] -= 1;
	pointsSpent -= 1;
	
	$('#'+id+'-points').text("0/1").removeClass('points-on');
	$('#points-spent').text(String(pointsSpent)+"/13");
	$('#'+thisTree['anchor']+' > .tree-count').text(String(thisTree['points']));
	
	buildToAnchor();
	
	return true;
}

function createEffectsTable(effects) {
	var h = "<table class='skill-effects'>";
	
	for(var i in effects) {
		h += "<tr><td class='skill-effect-name'>"+i+"</td><td class='skill-effect-value'>"+effects[i]+"</td></tr>";
	}
	
	h += "</table>";
	return h;
}

function buildToAnchor() {
	var binString = "";
	for(var t in treeData) {
		var tree = treeData[t]['tree'];
		for(var row=0; row < 7; row++) {
			if(!tree[row]) continue;
			var rowData = tree[row];
			for(var col=0; col < 4; col++) {
				if(!rowData[col]) continue;
				if(rowData[col]['state'] > 0) {
					binString += '1';
				} else {
					binString += '0';
				}
			}
		}
	}
	
	var key = "0123456789abcdefghijklmnopqrstuv";
	
	var anchorString = "";
	for(var i=0; i < binString.length; i += 5) {
		var segment = binString.substring(i,i+5);
		if(segment.length < 5) {
			segment += ("11111").substring(segment.length,5);
		}
		anchorString += key.charAt(parseInt(segment, 2));
	}
	
	window.location.hash = anchorString;
}

function anchorToBuild() {
	var binString = "";
	var anchorString = window.location.hash;
	
	for(var i=1; i < anchorString.length; i++) {
		var value = parseInt(anchorString.substring(i,i+1),32);
		if(value >= 0) {
			var segment = value.toString(2);
			if(segment.length < 5) {
				segment = ("00000").substring(segment.length,5) + segment;
			}
			binString += segment;
		} else {
			// For NaN anchors
			break;
		}
	}
	
	var i=0;
	for(var t in treeData) {
		var tree = treeData[t]['tree'];
		for(var row=0; row < 7; row++) {
			if(!tree[row]) continue;
			var rowData = tree[row];
			for(var col=0; col < 4; col++) {
				if(!rowData[col]) continue;
				var seg = parseInt(binString.substring(i,i+1));
				if(seg > 0) {
					rowData[col]['state'] = seg;
					treeData[t]['points'] += seg;
					pointsSpent += 1;
					
					$('#skill-'+String(t)+'-'+String(row)+'-'+String(col)+'-points').text("1/1").addClass('points-on');
					$('#points-spent').text(String(pointsSpent)+"/13");
					$('#'+treeData[t]['anchor']+' > .tree-count').text(String(treeData[t]['points']));
				}
				i++;
			}
		}
	}
}

$(function() {
	for(var t in treeData) {
		var data = treeData[t];
		data['points'] = 0; // default to no points spent
		var tree = data['tree']
		var treeObj = $("#" + data['anchor']);
		treeObj.noContext();
		
		$(".tree-title",treeObj).text(data['title']);
		
		for(var row in tree) {
			var rowData = tree[row];
			for(var col in rowData) {
				skillData = rowData[col];
				
				skillData['state'] = 0; // default to no point spent
				skillData['id'] = 'skill-' + String(t) + '-' + String(row) + '-' + String(col);
				var topPos = (row*(50+15)) + 15 + 25; // 50 = height, 15 = spacing, 25 = header
				var leftPos = (col*(50+15)) + 15; // 50 = width, 15 = spacing
				var skillObj =
					$('<img/>')
						.addClass("skill")
						.attr("id", skillData['id'])
						.attr("src", "skillimg/" + skillData['image'])
						.css("top", String( topPos ) + "px")
						.css("left", String( leftPos ) + "px")
						.qtip({
							content:{
								title:{
									text:skillData['title']
								},
								text: createEffectsTable(skillData['effects'])
							},
							style:{
								name:'dark'
							},
							position:{
								adjust:{
									screen: true
								}
							}
						})
					;
				treeObj.append(skillObj);
				var pointObj =
					$('<div>0/1</div>')
						.addClass("points")
						.attr("id", skillData['id'] + "-points")
						.css("top", String( topPos + 40 ) + "px")
						.css("left", String( leftPos + 30 ) + "px")
					;
				treeObj.append(pointObj);
				skillObj.click(function() { tryToggleOnSkill( $(this).attr("id") ); })
				skillObj.rightClick(function() { tryToggleOffSkill( $(this).attr("id") ); })
				
				if(data['prereqs'][skillData['id']]) {
					var ref = skillRefFromId(data['prereqs'][skillData['id']]);
					var diff = row - ref['row'];
					var prereqArrow = $('<img src="arrowdown'+diff+'.png"/>')
						.css("position","absolute")
						.css("top", String(topPos - (15+ (65*(diff-1)) ) ) + "px")
						.css("left", String(leftPos + 17) + "px")
					;
					treeObj.append(prereqArrow);
				}
			}
		}
	}
	
	// Load the anchor, if any is supplied
	anchorToBuild();
});