function nanParse(number) {
	number = parseInt(number,10);
	if (isNaN(number)) {
	  return 0;
	}
	return number;
}

function buttonToLink(href,title,text,parentId,siblingId) {
	$('#'+siblingId).replaceWith('<a id="'+siblingId+'" href="#" title="'+title+'" action="'+href+'">'+text+'</a>');
	$('#'+siblingId).click(function(e) 
	{
		e.preventDefault();
		eval($(e.target).attr('action'));
	});
}

function redoUnspent() {
	$('#tunspentpoints').html($('#startingpoints').val() - nanParse($('#tattributepoints').html()) - nanParse($('#tadvantagepoints').html()) + nanParse($('#tdisadvantagepoints').html()));
}

function attributeCost(cost,mult) {
	return (parseInt(cost,10)-10)*mult;
}

// Recalculate attributes.
function attributes() {
	$('#tattributepoints').html(attributeCost($('#st').val(),10)+attributeCost($('#dx').val(),20)+attributeCost($('#iq').val(),20)+attributeCost($('#ht').val(),10));
}

// Recalculate derived attributes.
function derivedAttributes() {
	// Setup.
	damagelevels = [[],['1d-6','1d-5'],['1d-6','1d-5'],['1d-5','1d-4']
		,['1d-5','1d-4'],['1d-4','1d-3'],['1d-4','1d-3']
		,['1d-3','1d-2'],['1d-3','1d-2'],['1d-2','1d-1']
		,['1d-2','1d'],['1d-1','1d+1'],['1d-1','1d+2']
		,['1d','2d-1'],['1d','2d'],['1d+1','2d+1'],['1d+1','2d+2']
		,['1d+2','3d-1'],['1d+2','3d'],['2d-1','3d+1'],['2d-1','3d+2']
		];
	// Base values.
	st = $('#st').val();
	ht = $('#ht').val();
	dx = $('#dx').val();
	iq = $('#iq').val();
	$('#thp').html(st);
	$('#twill').html(iq);
	$('#tper').html(iq);
	$('#tfp').html(ht);

	// Derived block 1.
	x = (st+st)/5;
	if (x > 10) {
		basiclift = Math.round(x);
	} else {
		basiclift = x;
	}
	basicspeed = (ht+dx)/4
	basicmove = Math.floor(basicspeed);
	$('#tbasiclift').html(basiclift);
	$('#tbasicspeed').html(basicspeed);
	$('#tbasicmove').html(basicmove);
	$('#tdamagethr').html(damagelevels[st][0]);
	$('#tdamagesw').html(damagelevels[st][1]);
	
	// Derived block 2.
	dodge = Math.floor(x+3);
	$('#tdodge0').html(dodge);
	$('#tdodge1').html(dodge-1);
	$('#tdodge2').html(dodge-2);
	$('#tdodge3').html(dodge-3);
	$('#tdodge4').html(dodge-4);
	
	$('#tenc0').html(basiclift);
	$('#tenc1').html(basiclift*2);
	$('#tenc2').html(basiclift*3);
	$('#tenc3').html(basiclift*6);
	$('#tenc4').html(basiclift*10);	
	
	$('#tmove0').html(basicmove);
	$('#tmove1').html(Math.round(basicmove*80)/100);
	$('#tmove2').html(Math.round(basicmove*60)/100);
	$('#tmove3').html(Math.round(basicmove*40)/100);
	$('#tmove4').html(Math.round(basicmove*20)/100);
}

function removeOdius(me) {
	$(me).fadeOut("slow", function()
	{
		$(me).remove();
		ilh();
	});
}

function addOdius() {
	if (($('#newodius').val() == '') || ($('#newhabitcost').val()=='')) {
		alert('You must put in values before we can add the odius habit');
		return false;
	}
	habitcosts = [-5,-10,-15];
	for (free=0;free<5;free++) {
		var x = $('#odiusline'+free);
		if ($('#odiusline'+free).length==0)
			break;
	}
	if (free<5) {
		var newRow = $('#odiuses tr:last').clone();
		$(newRow).attr('id','odiusline'+free);
		$(newRow).find('#newodius')
			.attr('id','odiusname'+free)
			.attr('name','odius['+free+'][name]');
		$(newRow).find('#newhabitcost')
			.attr('id','odiuscost'+free)
			.attr('selectedIndex',$('#newhabitcost').attr('selectedIndex'))
			.attr('name','odius['+free+'][cost]');
		$(newRow).find('a')
			.attr('title','Remove this odius disadvantage')
			.click(function(e) {
				e.preventDefault();
				removeOdius($(e.target).closest('tr'));	
			})
			.attr('href','#')
			.html('[Remove]');
		$(newRow).find('#odiusaddtd').attr('id','addCol'+free);
		$(newRow).insertBefore('#odiuslinenew');
	
		// Clear the inputs.
		$('#newodius').val('');
		$('#newhabitcost').attr('selectedIndex',-1);
	} else {
		alert('Only five odius habits allowed');
	}
}

function removeLanguage(me) {
	$(me).fadeOut('slow', function() {
		$(me).remove();
		lang();
	});
}

function addLanguage() {
	if ($('#newlanguagename').val() == '') {
		alert('You must enter the language to know');
		return false;
	}
	langspoke = ['None, free','Broken, 1pt','Accented, 2pts','Native, 3pts'];
	free      = 1;
	langs     = $('#languageline'+free).length;
	while (langs>0) {
		langs = $('#languageline'+(++free)).length;
	}
	var newRow = $('#languagelinenew').clone();
	$(newRow).attr('id','languageline'+free);
	$(newRow).find('#newlanguagename')
		.attr('id','languagename'+free)
		.attr('name','language['+free+'][name]');
	$(newRow).find('#newlanguagespoken')
		.attr('id','languagespoken'+free)
		.attr('name','language['+free+'][spoken]')
		.attr('selectedIndex',$('#newlanguagespoken').attr('selectedIndex'));
	$(newRow).find('#newlanguagewritten')
		.attr('id','languagewritten'+free)
		.attr('name','language['+free+'][written]')
		.attr('selectedIndex',$('#newlanguagewritten').attr('selectedIndex'));
	$(newRow).find('a')
		.attr('title','Remove this language')
		.click(function(e) {
			e.preventDefault();
			removeLanguage($(e.target).closest('tr'));
		})
		.attr('href','#')
		.html('[Remove]');
	$(newRow).find('#languageaddtd').attr('id','addLang'+free+'td');
	$(newRow).insertBefore('#languagelinenew');

	// Clear the inputs.
	$('#newlanguagename').val('');
	$('#newlanguagespoken').attr('selectedIndex',0);
	$('#newlanguagewritten').attr('selectedIndex',0);
}

// Recalculate the Image, Looks, Habits section.
function ilh() {
	appears  = [-16,-8,-4,0,4,8,16];
	odiuses  = [-5,-10,-15];
	charisma = 5;
	voice    = 10;
	
	appearancecost = appears[$('#appearance').val()];
	charismacost   = $('#charisma').val()*charisma;
	voicecost      = ($('#voice').val()==1?voice:0);
	odiuscost      = 0;
	
	odiusesFound = $('#odiuses').find('select[id^=odiuscost]');
	numOdiusesFound = odiusesFound.length
	for (i=0;i<numOdiusesFound;i++) {
		odiuscost -= $(odiusesFound[i]).val();
	}
	
	ilha = charismacost+voicecost;
	ilhd = odiuscost;
	if (appearancecost>0) {
		ilha += appearancecost;
	} else {
		ilhd -= appearancecost;
	}
	
	$('#tadvantagepoints').html($('#tadvantagepoints').html()-$('#ilha').val()+ilha);
	$('#ilha').val(ilha);
	$('#tdisadvantagepoints').html($('#tdisadvantagepoints').html()-$('#ilhd').val()+ilhd);
	$('#ilhd').val(ilhd);
	
	redoUnspent();
}

// Recalculate the Advantage section.
function adv() {
	alladvantagecosts    = [
	 [0,2],[0,2],[0,2],[0,2],[5,0],[5,0],[10,0],[15,0],[15,0],[15,0],[15,0]
	,[5,0],[15,0],[5,0],[5,0],[10,0],[0,2],[5,0],[15,0],[0,2],[10,0]
	,[100,0],[100,0],[10,0],[15,0],[30,0],[60,0],[0,1],[15,0],[3,0],[5,0]
	,[5,0],[10,0],[15,0]
	];
	newadv               = 0;
	numAllAdvantageCosts = alladvantagecosts.length;

	for (i=0;i<numAllAdvantageCosts;i++) {
		var thisAd = $('#advantage'+i);		
		if (thisAd.attr('type')=='checkbox') {
			if (thisAd.attr('checked')) {
				newadv += alladvantagecosts[i][0];
			}
		} else {
			newadv += alladvantagecosts[i][1] * nanParse(thisAd.val());
		}
	}
	
	extra    = $().find('input[id^=newadvantagepoints]');
	numExtra = extra.length;
	for (i=0;i<numExtra;i++) {
		thisId = $(extra[i]).attr('id').substr(18);
		thisAd = $('#advantage'+thisId);
		if (thisAd.attr('type')=='checkbox') {
			if (thisAd.attr('checked')) {
				newadv += nanParse($('#newadvantagepoints'+thisId).val());
			}
		} else {
			newadv += nanParse(thisAd.val()) * nanParse($('#newadvantagepoints'+thisId).val());
		}
	}
	
	$('#tadvantagepoints').html($('#tadvantagepoints').html()-$('#adv').val()+newadv);
	$('#adv').val(newadv);
}

// Recalculate the Disadvantage section.
function dis() {
	alldisadvantagecosts    = [
	 [-10,0],[-25,0],[-10,0],[-10,0],[-5,0],[-10,0],[-15,0],[-5,0],[-5,0]
	,[-10,0],[-15,0],[-5,0],[-15,0],[-10,0],[-10,0],[-10,0],[0,-1],[-10,0]
	,[-10,0],[-15,0],[-5,0],[-10,0],[-5,0],[-5,0],[-10,0],[-5,0],[-10,0]
	,[-15,0],[-2,0],[-5,0],[-10,0],[-15,0],[-20,0],[-5,0],[-10,0],[-5,0]
	,[-10,0],[-15,0]];
	newdis                  = 0;
	numAllDisadvantageCosts = alldisadvantagecosts.length;
	
	for (i=0;i<numAllDisadvantageCosts;i++) {
		var thisDis = $('#disadvantage'+i);
		if (thisDis.attr('type')=='checkbox') {
			if (thisDis.attr('checked')) {
				newdis += alldisadvantagecosts[i][0];
			}
		} else {
			newdis += alldisadvantagecosts[i][1] * nanParse(thisDis.val());
		}
	}
	
	$('#tdisadvantagepoints').html(nanParse($('#tdisadvantagepoints').html())+nanParse($('#dis').val())-nanParse(newdis));
	$('#dis').val(newdis);
}

// Recalculate the Language section.
function lang() {
	newlang   = 0;
	master    = $('#languagestable').find('select[id^=lang]');
	numMaster = master.length;
	for (i=0;i<numMaster;i++) {
		newlang += $(master[i]).attr('selectedIndex');
	}
	
	$('#tadvantagepoints').html($('#tadvantagepoints').html()-$('#lang').val()+newlang);
	$('#adv').val(newlang);
}

// Recalculate quirks.
function qrk() {
	quirkcost = 0;
	for (i=0;i<5;i++) {
		if ($('#quirksname'+i).val()!='') {
			quirkcost++;
		}
	}
	
	$('#tdisadvantagepoints').html(nanParse($('#tdisadvantagepoints').html())-nanParse($('#qrk').val())+nanParse(quirkcost));
	$('#qrk').val(quirkcost);
}

// Recalculate the Reaction section.
function reac() {
	wealths    = [-25,-15,-10,0,10,20,30,50];
	status     = 5;
	reputation = 5;
	
	wealthcost     = nanParse(wealths[nanParse($('#wealth').val())]);
	statuscost     = nanParse($('#status').val())*status;
	reputationcost = nanParse($('#reputationscore').val())*reputation;
	
	reaca = statuscost+reputationcost;
	reacd = 0;
	if (wealthcost>0) {
		reaca += wealthcost;
	} else {
		reacd -= wealthcost;
	}
	
	$('#tadvantagepoints').html($('#tadvantagepoints').html()-nanParse($('#reaca').val())+reaca);
	$('#reaca').val(reaca);
	$('#tdisadvantagepoints').html($('#tdisadvantagepoints').html()-nanParse($('#reacd').val())+reacd);
	$('#reacd').val(reacd);
}

// Recalculate the Skills section.
function skl() {
	skillmatrixcost = [0,1,2,4,8,12];
	allskills       = [
		[2],[1],[1],[0],[1],[0],[0],[0],[1],[0],
		[2],[0],[1],[2],[1],[1],[1],[2],[1],[2],
		[1],[0],[2],[1],[1],[1],[2],[2],[1],[1],
		[0],[1],[1],[1],[0],[2],[2],[1],[1],[2],
		[1],[0],[1],[2],[1],[0],[0],[0],[2],[1],
		[0],[2],[2],[1],[1],[1],[1],[2],[2],[1],
		[1],[1],[0],[1],[1],[0],[2],[1],[1],[1],
		[0],[2],[1],[0],[1],[1],[0],[1],[2],[1]];
	
	skil      = 0;
	inputs    = $('#skills-block').find('select[id^=skill]');
	numInputs = inputs.length;
	for (i=0;i<numInputs;i++) {
		skil += skillmatrixcost[nanParse($(inputs[i]).attr('selectedIndex'))];
	}
	
	$('#tadvantagepoints').html(nanParse($('#tadvantagepoints').html())-nanParse($('#skil').val())+skil);
	$('#skil').val(skil);
}

// Load events.
function attachRecalc() {
	$('#startingpoints').change(redoUnspent);
	
	// Attributes.
	atFunc = function() { attributes(); derivedAttributes(); redoUnspent(); }
	$('#st').change(atFunc);
	$('#iq').change(atFunc);
	$('#dx').change(atFunc);
	$('#ht').change(atFunc);
	
	// Images, Looks, Habits.
	ilhFunc = function() { ilh(); redoUnspent(); }
	$('#appearance').blur(ilhFunc);	
	$('#appearance').click(ilhFunc);
	$('#charisma').change(ilhFunc);
	$('#voice').click(ilhFunc)
	elms    = $('').find('select[id^=odiuscost]');
	numElms = elms.length;
	for (i=0;i<numElms;i++) {
		$(elms[i]).blur(ilhFunc);
		$(elms[i]).click(ilhFunc);		
	}
	$('#newodius').change(ilhFunc);
	$('#newhabitcost').blur(ilhFunc);
	$('#newhabitcost').click(ilhFunc);
	
	// Advantages.
	advFunc = function() { adv(); redoUnspent(); }
	findAttach('advantage',advFunc);
	$('#advantages-perks').append('<a id="new-advantage-link" href="javascript:addNewAdvantage(\'onoff\');">Add new on/ off advantage</a> <a id="new-advantage-link2" href="javascript:addNewAdvantage(\'level\');">Add new levelled advantage</a>');
	
	// Disadvantages.
	disFunc = function() { dis(); redoUnspent(); }
	findAttach('disadvantage',disFunc);
	
	// Quirks.
	qrkFunc = function() { qrk(); redoUnspent(); }
	findAttach('quirksname',qrkFunc);
	
	// Languages.
	langFunc = function() { lang(); redoUnspent(); }
	findAttach('languagespoken',langFunc);
	findAttach('languagewritten',langFunc);
	
	// Reactions.
	reacFunc = function() { reac(); redoUnspent(); }
	$('#wealth').change(reacFunc);
	$('#wealth').click(reacFunc);
	$('#status').change(reacFunc);
	$('#reputationscore').change(reacFunc);
	
	// Skills.
	sklFunc = function() { skl(); redoUnspent(); }
	findAttach2('skill','level',sklFunc);
}

function findAttach(name,func) {
	// Needs repair!
	i        = 0;
	input    = $('#'+name+i);
	numInput = input.length;
	while (numInput>0) {
		if (input.attr('type') == 'checkbox') {
			$('#'+name+i).click(func);
		} else if (input.attr("type") == 'select') {
			$('#'+name+i).click(func);
			$('#'+name+i).blur(func);
		} else {
			$('#'+name+i).change(func);
		}
		
		i++;
		input    = $('#'+name+i);
		numInput = input.length;
	}
}

function findAttach2(name,level,func) {
	i = -1;
	while (1) {
		i++;
		var top1 = "#"+name+level+i;
		input    = $(top1);
		if (input.length>0) {
			$(top1).change(func);
			continue;
		}
		k        = 0;
		input    = $(top1+k+level);
		numInput = input.length;
		while (numInput>0) {
			$(top1+k+level).change(func);
			k++;
			input = $(top1+k+level);
		}
		if (k>0) {
			continue;
		}
		if ($('#'+name+i+level+'new').length>0) {
			$('#'+name+i+level+'new').change(func);
			continue;
		}
		break;
	}
}

// Add a new specialisation option.
function addNewSkillSpecialization(toWhom) {
	others    = $().find('input:text[id^=skill'+toWhom+']');
	newId     = 0;
	numOthers = others.length;
	for (j=0;j<numOthers;j++) {
		newId = Math.max(newId,$(others[j]).attr('name').replace(/^.*level\]\[([^\]]*)\]\[.*/,'$1')*1);
	}
	newId++;
	
	input     = $('#skill'+toWhom+'levelnewtext');
	newInput  = $(input).clone();
	newLabel  = $(input).prev().clone();
	newSpan   = $(input).prev().prev().clone();
	newSelect = $(input).prev().prev().prev().clone();
	newDiv    = $(input).prev().prev().prev().prev().clone();
	
	newInput.attr('id','skill'+toWhom+'level'+newId+'text').attr('name','skill['+toWhom+'][level]['+newId+'][name]');
	newLabel.attr('for','skill'+toWhom+'level'+newId+'text');
	newSelect.attr('id','skill'+toWhom+'level'+newId).attr('name','skill['+toWhom+'][level]['+newId+'][level]').change(function() { skl(); redoUnspent(); });
	input.after(newInput).after(newLabel).after(newSpan).after(newSelect).after(newDiv);	
}

function addNewAdvantage(type) {
	holder    = $('#advantages-perks-disadvantages');
	others    = $(holder).find('input:checkbox[id^=advantage]');
	numOthers = others.length;
	link      = $('#new-advantage-link');
	newId     = 0;
	for (j=0;j<numOthers;j++) {
		newId = Math.max(newId,$(others[j]).attr('id').replace(/^advantage(.*)/,'$1')*1);
	}
	newId++;
	
	if (type == 'onoff') {
		newInput = $('#advantage5').clone();
		newInput.attr('id', 'advantage'+newId).attr('name', 'advantage['+newId+']').change(function() { adv(); redoUnspent(); });
	
		link.before(newInput);
		link.before('<label><input type="text" id="newadvantage'+newId+'" name="newadvantage['+newId+']" /></label><label><input type="text" id="newadvantagepoints'+newId+'" name="newadvantagepoints['+newId+']" size="4" />/level</label>');
		link.before('<div class="clearboth"></div>');
	} else {
		newInput = $('#advantage0').clone();
		newInput.attr('id', 'advantage'+newId).attr('name', 'advantage['+newId+']').change(function() { adv(); redoUnspent(); });

		link.before(newInput);
		link.before('<label><input type="text" id="newadvantage'+newId+'" name="newadvantage['+newId+']" /></label><label><input type="text" id="newadvantagepoints'+newId+'" name="newadvantagepoints['+newId+']" size="4" />/level</label>');
		link.before('<div class="clearboth"></div>');
	}
	$('#newadvantagepoints'+newId).change(function() {
		console.log('argh1');adv();redoUnspent();
	});
	$('#advantage'+newId).change(function() {
		adv();redoUnspent();
	})
}

// Attach Hijax to various buttons (making them links in most cases) to let JS handle interactions rather than requiring page submissions.
function attachHijax() {
	// Remove odius.
	for (i=0;i<5;i++) {
		if ($('#removeodius'+i).length>0) {
			buttonToLink("removeOdius($(e.target).closest('tr')); ilh();","Remove this odius disadvantage","[Remove]",'odiussubmit'+i,'removeodius'+i);
		}
	}
	
	// Add odius.
	buttonToLink("addOdius(); ilh();","Add this odius disadvangage","[Add]","odiusaddtd","odiusadd");
	
	// Remove language.
	master    = $('#languagestable').find('input[id^=removelanguage]');
	numMaster = master.length;
	for (j=0;j<numMaster;j++) {
		if (master[j].type=='submit' && master[j].id.substr(0,14)=='removelanguage') {
			i = master[j].id.substring(14);
			buttonToLink("removeLanguage($(e.target).closest('tr')); lang();", "Remove this language", "[Remove]", 'languagesubmit'+i, 'removelanguage'+i);
		}
	} 
	
	// Add language.
	buttonToLink("addLanguage(); lang(); ", "Add this language", "[Add]", "langaddtd", "langadd");
	
	// Multiple skills.
	master    = $('#skills').find('input:text[id$=levelnewtext]');
	numMaster = master.length;
	for (j=0;j<numMaster;j++) {
		id = $(master[j]).attr('id').replace(/skill(.*)level.*/,'$1');
		$(master[j]).after('<div class="clearboth"><a href="javascript:addNewSkillSpecialization('+id+');">Add new specialisation</a></div>')
	}	
}

// Find the bottom of the instruction bar.
function instructionBottom() { 
	var item = $('#instruction'+currentSelected);
	if (item.height() == 0) {
		return (item.parent().position().top+item.parent().height()+5);
	}
	return (item.position().top+item.height()+5);
}

// Move the points display bar up and down the right column so you can always see what's unspent.
function setupMovePoints() {
	$("#pointsbar").attr('style', 'top:'+Math.max($(window).scrollTop(),instructionBottom()+10)+'px; position:absolute;').addClass('moved');
	$(window).scroll(function() {
		$("#pointsbar").attr('style', 'top:'+Math.max($(window).scrollTop(),instructionBottom()+10)+'px; position:absolute;').addClass('moved');
	});
}

// Show/ hide the file upload button for loading a sheet.
function makeLoadSheetNicer() {
	$("#load-sheet").click(function() {
		$("#load-upload-div").css('display','block');
		$("#upload-form-cancel").click(function() {
			$("#load-upload-div").css('display','none');
		});
		return false;
	});
}

// Add the load events.
$(function() {attachRecalc(); attachHijax(); setupMovePoints(); makeLoadSheetNicer()});

// Change currently shown instructions.
function activeDeactive(who,activeOrDeactive) {
	switch (who) {
		case '1': theID = ['pointsbar'];
			break;
		case '2':
		case '3': theID = ['full-attribute-block'];
			break;
		case '4': theID = ['image-looks-habits-block'];
			break;
		case '5': theID = ['tech-and-language'];
			break;
		case '6': theID = ['reaction-block'];
			break;
		case '7': theID = ['advantages-perks','disadvantages'];
			break;
		case '8': theID = ['quirks'];
			break;
		case '9': theID = ['skills'];
			break;
		default: theID = ['pointsbar'];
			break;
	}
	numTheID = theID.length;
	for (var i=0;i<numTheID;i++) {
		if (activeOrDeactive == '') {
			document.getElementById(theID[i]).className = document.getElementById(theID[i]).className.replace(/\bactive\b/g,'');
			document.getElementById(theID[i]).className = document.getElementById(theID[i]).className.replace(/\bactive\b/g,'');
		} else {
			document.getElementById(theID[i]).className += ' '+activeOrDeactive;
		}
	}
}

function switchUsing(el) {
	if (!el) {
		// IE Event Model.
		el     = window.event; 
		targId = el.srcElement.id;
	} else {
		targId = el.target.id;
	}
	activeDeactive(currentSelected, '');
	document.getElementById('instruction'+currentSelected).className = 'instruction-noncurrent';
	currentSelected = targId.substring(targId.indexOf('-')+1);
	activeDeactive(currentSelected,'active');
	document.getElementById('instruction'+currentSelected).className = 'instruction-current';
	$(window).scroll();
	return false;
}
$(function() {
for (var i=1;i<11;i++) {
	$('#back-'+i).click(switchUsing);
	$('#1step-'+i).click(switchUsing);
	$('#2step-'+i).click(switchUsing);
}
});