var OFF_END = 8;
var DEF_END = 16;
var ATH_END = 23;

var total_xp = 2500; 
var off_xp = 2500;
var def_xp = 2500;
var ath_xp = 2500;
var build = 0; 

var attrs = new Array(10);
attrs[0] = [75, 70, 80, 65, 70, 70, 70, 70, 70, 40, 40, 40, 70, 60, 40, 50, 45, 65, 65, 55, 60, 60, 65, 50];	//sniper
attrs[1] = [70, 70, 70, 65, 70, 60, 75, 55, 70, 60, 55, 45, 70, 60, 60, 60, 50, 65, 65, 60, 60, 60, 65, 70];	//power fwd
attrs[2] = [60, 60, 50, 65, 60, 50, 70, 60, 60, 70, 70, 60, 60, 60, 60, 70, 60, 65, 60, 60, 60, 65, 65, 70];	//grinder
attrs[3] = [70, 70, 70, 70, 60, 60, 60, 70, 60, 60, 60, 70, 70, 65, 50, 80, 70, 65, 65, 60, 60, 70, 65, 60];	//2WF
attrs[4] = [75, 80, 75, 75, 75, 60, 50, 70, 60, 40, 40, 50, 70, 60, 40, 60, 60, 65, 65, 55, 60, 60, 65, 50];	//playmaker
attrs[5] = [60, 60, 60, 60, 50, 50, 75, 50, 70, 70, 75, 60, 40, 60, 80, 65, 50, 65, 65, 55, 60, 60, 65, 85];	//Enforcer F
attrs[6] = [50, 50, 40, 60, 50, 55, 75, 50, 70, 70, 75, 85, 70, 50, 60, 80, 70, 60, 60, 60, 60, 60, 65, 70];	//defensive D
attrs[7] = [60, 70, 70, 70, 70, 70, 65, 65, 70, 50, 50, 65, 70, 50, 40, 65, 60, 65, 65, 60, 60, 60, 65, 50];	//offensive D
attrs[8] = [60, 60, 55, 65, 60, 70, 70, 65, 70, 50, 60, 65, 70, 50, 40, 70, 60, 65, 65, 60, 60, 70, 65, 60];	//2WD
attrs[9] = [50, 50, 50, 60, 50, 50, 75, 50, 60, 70, 80, 70, 40, 50, 80, 70, 60, 60, 60, 60, 70, 60, 65, 80];	//Enforcer D

// costs are how often the xp cost increases by 10. It is as follows:
//	1 = never
//	2 = 10
//	3 = 6
//	4 = 5
//	5 = 4
//	6 = 3
//	7 = 2
var costs = new Array(10);
costs[0] = [2, 3, 3, 3, 3, 4, 4, 6, 4, 2, 4, 2, 1, 2, 5, 2, 3, 5, 5, 3, 2, 2, 6, 3];
costs[1] = [2, 3, 3, 3, 3, 4, 3, 4, 4, 3, 3, 2, 1, 2, 3, 2, 3, 5, 6, 2, 1, 2, 6, 3];
costs[2] = [3, 3, 2, 3, 3, 4, 3, 6, 6, 4, 6, 2, 1, 2, 3, 1, 4, 5, 6, 2, 1, 2, 5, 4];
costs[3] = [3, 3, 2, 3, 3, 3, 3, 5, 5, 4, 5, 2, 1, 2, 4, 1, 5, 6, 5, 3, 2, 2, 5, 4];
costs[4] = [2, 2, 2, 2, 3, 4, 3, 5, 6, 3, 4, 2, 1, 2, 5, 3, 5, 5, 5, 3, 2, 2, 6, 4];
costs[5] = [5, 4, 3, 3, 4, 5, 3, 5, 4, 2, 5, 3, 1, 2, 1, 2, 3, 6, 6, 2, 1, 2, 6, 7];
costs[6] = [6, 5, 4, 3, 4, 5, 3, 6, 5, 4, 6, 2, 1, 4, 2, 2, 3, 6, 6, 3, 1, 2, 6, 3];
costs[7] = [2, 2, 2, 3, 3, 3, 2, 6, 6, 3, 5, 4, 1, 4, 4, 2, 3, 5, 5, 3, 2, 2, 5, 3];
costs[8] = [3, 3, 3, 3, 3, 4, 3, 6, 7, 2, 5, 2, 1, 4, 3, 2, 3, 5, 6, 3, 2, 2, 5, 3];
costs[9] = [7, 3, 4, 3, 4, 5, 3, 6, 5, 2, 7, 1, 1, 4, 1, 2, 3, 6, 6, 3, 1, 2, 6, 6];

var boosts = new Array(attrs[0].length);
for (var i = 0; i < boosts.length; i++) {
	boosts[i] = new Array(3);
	boosts[i][0] = boosts[i][1] = boosts[i][2] = false;
}   

function reset_all(load_build) {
	reset_boosts(true); 
	change_build();
	if(load_build) {	
		load_build_from_url();
	}
}

function load_build_from_url() {
	var base64data = getUrlVars()["build"];
	if(base64data == undefined) {
		return; 
	}
	var data = base64Decode(unescape(base64data)).split(",");
	
	// set card and build
	get_object("type").selectedIndex = parseInt(data[0]);
	get_object("card").selectedIndex = parseInt(data[1]);
	change_card();
	
	// set xps
	off_xp = parseInt(data[2]);
	def_xp = parseInt(data[3]);
	ath_xp = parseInt(data[4]);
	update_xp();
	
	// set attributes
	for(var i=0; i<attrs[0].length; i++) {
		get_object("iv"+i).innerHTML = parseInt(data[i+5]);
		update_total(i);
		update_buttons(i);
		update_cost(i);
	}	
	
	//set boosts
	var start = attrs[0].length + 5; 
	for (var i=0; i<4; i++) {
		for (var j=0; j<3; j++) {
			get_object("slot"+i+j).value = data[start+6*i+2*j];
			var x = parseInt(data[start+6*i+2*j+1]);
			if(x != -1) {
				document.getElementsByName("s"+i+j)[x].checked = true;
			}
		}
	}
	// reset boosts
	change_boost();
	update_average();
	update_share_link();
}

function reset(section) {
	var start, end;
	if(section == 1) {
		start = 0;
		end = OFF_END;	
		off_xp = total_xp;			
	}
	else if(section == 2) {
		start = OFF_END + 1; 
		end = DEF_END;
		def_xp = total_xp;
	}
	else {
		start = DEF_END + 1;
		end = ATH_END;	
		ath_xp = total_xp;				
	}
	
	for(var i=start; i <=end; i++) {
		var val = attrs[build][i];
		get_object("iv"+i).innerHTML = val;
		update_total(i);
		update_buttons(i);
		update_cost(i);
	}
	update_xp();
	update_average();
	update_share_link();
}

function change_build() {
	build = get_object("type").selectedIndex;
	off_xp = total_xp; 
	def_xp = total_xp;
	ath_xp = total_xp;	
	
	update_xp(); 
	
	for(var i=0; i<attrs[0].length; i++) {
		var val = attrs[build][i];
		get_object("iv"+i).innerHTML = val;
		update_total(i);
		update_buttons(i);
		update_cost(i);
	}		
	update_average();	
	update_share_link();	
}

function change_boost() {
	reset_boosts(); 	
	for (var i=0; i<4; i++) {
		for (var j=0; j<3; j++) {
			var attr = parseInt(get_object("slot"+i+j).value);
			set_boost_checkbox_disable(i,j, attr == -1);
			if(attr != -1) {
				var x = document.getElementsByName("s"+i+j);
				var b = 0;				
				for (var k = 0; k < x.length; k++) {  
					if (x[k].checked) {
						b = parseInt(x[k].value);
						boosts[attr][k] = true;
					}					
				}								
				var val = parseInt(get_object("b"+attr).innerHTML);
				val += b; 
				get_object("b"+attr).innerHTML = val; 
				update_total(attr);
				update_buttons(attr);
				update_average();
				update_share_link(); 
			}			
		}
	}
	update_constraints(); 	
}

function change_boost_attr(i, j) {
	reset_boost_checkbox(i,j);
	change_boost();
}

function change_card() {
	total_xp = 500+400*get_object("card").selectedIndex;	
	change_build();
}

function update(attr_id, inc) {
	var total = parseInt(get_object("t"+attr_id).innerHTML);
	var val = parseInt(get_object("iv"+attr_id).innerHTML);
	var init = attrs[build][attr_id];
	var r = costs[build][attr_id];

	// begin NHL 11 cost calculation
	var c = 10;
	var n = 10; // number of games to increase c by 10
	if(r > 2) {
		n = 9-r; 
	}
	if(r >=2 ) {
		c += 10*Math.floor((val-init+inc-1)/n);
	}

	var xp; 
	if(attr_id <= OFF_END)
		xp = off_xp; 
	else if(attr_id > DEF_END)
		xp = ath_xp; 
	else
		xp = def_xp;
		
	// incrementing a stat. make sure we have enough points to increment and that we don't go above 99
	if(inc == 1) {
		if(total < 99 && xp >= c) {
			get_object("iv"+attr_id).innerHTML = val+1; 
			if(attr_id <= OFF_END)
				off_xp -= c; 
			else if(attr_id > DEF_END)
				ath_xp -= c;  
			else
				def_xp -= c;
		}
	}
	// decrementing a stat. make sure we don't go below the initial value and then add points to xp
	else {
		if(val > init) {
			get_object("iv"+attr_id).innerHTML = val-1; 
			if(attr_id <= OFF_END)
				off_xp += c; 
			else if(attr_id > DEF_END)
				ath_xp += c;  
			else
				def_xp += c;
		}
	}	
	update_cost(attr_id);
	update_total(attr_id);
	update_buttons(attr_id);
	update_xp();	
	update_average();	
	update_share_link();
}

////////////////////////
// Update functions   //
////////////////////////

function update_average() {
	var total = 0; 
	var o = 0;
	var d = 0; 
	var a = 0;
	
	for (var i = 0; i <= OFF_END; i++) {
		o += parseInt(get_object("t"+i).innerHTML);
	}
	
	for (var i = OFF_END+1; i <= DEF_END; i++) {
		d += parseInt(get_object("t"+i).innerHTML);
	}
	
	for (var i = DEF_END+1; i <= ATH_END; i++) {
		a += parseInt(get_object("t"+i).innerHTML);
	}
	
	get_object("offavg").innerHTML = Math.floor(o/(OFF_END+1));
	get_object("defavg").innerHTML = Math.floor(d/(DEF_END-OFF_END));
	get_object("athavg").innerHTML = Math.floor(a/(ATH_END-DEF_END));							
	get_object("overall").innerHTML = Math.floor((o/(OFF_END+1)+d/(DEF_END-OFF_END)+a/(ATH_END-DEF_END))/3);
}

function update_xp() {
	get_object("offxp").innerHTML = off_xp;
	get_object("defxp").innerHTML = def_xp;
	get_object("athxp").innerHTML = ath_xp;
}

function update_cost(id) {
	var val = parseInt(get_object("iv"+id).innerHTML);
	var init = attrs[build][id];
	var r = costs[build][id];

	// begin NHL 11 cost calculation
	var c = 10;
	var n = 10; // number of games to increase c by 10
	if(r > 2) {
		n = 9-r; 
	}
	if(r >=2 ) {
		c += 10*Math.floor((val-init)/n);
	}
	get_object("c"+id).innerHTML = c;
}

function update_total(id) {
	var c = parseInt(get_object("iv"+id).innerHTML);
	var b = parseInt(get_object("b"+id).innerHTML);
	get_object("t"+id).innerHTML = Math.min(c+b,99);	
}

function update_buttons(id) {
	var total = parseInt(get_object("t"+id).innerHTML);
	var val = parseInt(get_object("iv"+id).innerHTML);
	get_object("m"+id).disabled = (val <= attrs[build][id]); 
	get_object("p"+id).disabled = (total >= 99); 	
}

function reset_boosts(reset_ui) {
	for(var i=0; i<boosts.length; i++) {
		boosts[i][0] = false;
		boosts[i][1] = false;
		boosts[i][2] = false;
		get_object("b"+i).innerHTML = 0; 
		update_total(i);
	}
	
	if(reset_ui !== undefined) {
		for (var i=0; i<4; i++) {
			for (var j=0; j<3; j++) {
				reset_boost_checkbox(i,j);
				get_object("slot"+i+j).value = "-1";
				set_boost_checkbox_disable(i,j,true);
			}		
		}			
	}
	update_average(); 
	update_share_link(); 
}

function reset_boost_checkbox(i, j) {
	var x = document.getElementsByName("s"+i+j);
	for (var k = 0; k < x.length; k++)
		x[k].checked = false;  	
}

function set_boost_checkbox_disable(i, j, disable, idx) {
	if(idx === undefined)
		idx = -1;
	var x = document.getElementsByName("s"+i+j);
	if (idx == -1) {
		for (var k = 0; k < x.length; k++) {
			x[k].disabled = disable;
			if (disable && x[k].checked) 
				x[k].checked = false;
		}
	}
	else
		x[idx].disabled = disable; 
}

function update_constraints() {
	for (var i = 0; i < 4; i++) {
		for (var j = 0; j < 3; j++) {
			var attr = parseInt(get_object("slot" + i + j).value);
			if (attr != -1) {
				var x = document.getElementsByName("s" + i + j);
				for (var k = 0; k < x.length; k++) {
					var d = false;
					if (!x[k].checked)
						d = boosts[attr][k];
					set_boost_checkbox_disable(i, j, d, k);
				}
			}
		}
	}
}

function update_share_link() {
	var data = "";
		
	// add build
	data += build.toString() +",";
	
	// add card
	data += get_object("card").selectedIndex.toString() + ",";
	
	// add xp
	data += off_xp.toString() + ",";
	data += def_xp.toString() + ",";
	data += ath_xp.toString();
	
	//add attrs
	for(var i=0; i<attrs[0].length; i++) {
		data += ","+get_object("iv"+i).innerHTML;
	}
	
	// add boosts
	for (var i=0; i<4; i++) {
		for (var j=0; j<3; j++) {
			var attr = get_object("slot"+i+j).value;
			var x = document.getElementsByName("s"+i+j);
			var b = "-1"; 
			for (var k = 0; k < x.length; k++) {  
				if (x[k].checked) {
					b = k.toString(); 
					break; 
				}					
			}	
			data += ","+attr.toString();	//the selected attribute's value (-1 for no selection)
			data += ","+b.toString();	//the index of the value of the boost, i.e. 2 for +5 (or -1	for no selection)
		}
	}
	
	data = base64Encode(data);
	var url = window.location.pathname +"?"+insertParam("build", data);
	get_object("share_build").innerHTML = "<a href='"+url+"'>Link this build</a>";
}
	 	
function get_object(id) {
	var object = null;
	if( document.layers ) {   
		object = document.layers[id];
	} else if( document.all ) {
    	object = document.all[id];
   	} else if( document.getElementById ) {
    	object = document.getElementById(id);
   	}
   	return object;
}

function getUrlVars() { 
	var map = {}; 
	var parts = window.location.search.replace(/[?&]+([^=&]+)(=[^&]*)?/gi, function(m,key,value) { map[key] = (value === undefined) ? true : value.substring(1); }); 
	return map; 
}

function insertParam(key, value)
{
    key = escape(key); value = escape(value);

    var kvp = document.location.search.substr(1).split('&');

    var i=kvp.length; var x; while(i--) 
    {
    	x = kvp[i].split('=');

    	if (x[0]==key)
    	{
    		x[1] = value;
    		kvp[i] = x.join('=');
    		break;
    	}
    }

    if(i<0) {kvp[kvp.length] = [key,value].join('=');}
    return kvp.join('&'); 
}

