inventory = {}

items = [
	{name: 'nucleon', mass: 1, recipe: [], note: 'Nucleons are the basic building blocks of elements and are unlimited in this demo.'},
	{name: 'hydrogen', recipe: [{name: 'nucleon', quantity: 2}]},
	{name: 'carbon', recipe: [{name: 'nucleon', quantity: 12}]},
	{name: 'oxygen', recipe: [{name: 'nucleon', quantity: 16}]},
	{name: 'water', recipe: [{name: 'hydrogen', quantity: 2}, {name: 'oxygen', quantity: 1}]},
	{name: 'carbon dioxide', recipe: [{name: 'carbon', quantity: 1}, {name: 'oxygen', quantity: 2}]},
	{name: 'turkey', recipe: [{name: 'carbon', quantity: 5e7}, {name: 'water', quantity: 1e9}]}
]

function display(o, target, noOverwrite)
{
	if(o instanceof Array)
		r = '<ol>' + o.reduce(function(a, b){return a+'<li>'+display(b)+'</li>'}, '') + '</ol>'
	else if(o instanceof Object)
	{
		table = ''
		for(key in o)
		{
			table += '<dt>'+key+'</dt><dd>'+display(o[key])+'</dd>'
		}
		r = '<dl>'+table+'</dl>'
	}
	else
	{
		r = (target ? '<p>'+o+'</p>' : o)
	}
	
	if(target)
	{
		if(noOverwrite) $(target).prepend(r)
		else $(target).html(r)
	}
	else return r
}

for(i=0; i<items.length; ++i)
{
	$('#item').append('<option value="'+i+'">'+items[i].name+'</option>')
}

$('#item').change(function(){
	i = Number($('#item').val())
	display(items[i], '#items')
})

display(items[0], '#items')

$('#make').click(function(){
	make(inventory, Number($('#item').val()), Number($('#quantity').val()))
	return false
})

function make(inventory, index, quantity)
{
	var canMake = true
	item = items[index]
	left = (inventory[item.name] || 0) + quantity
	if(left < 0)
	{
		display('You do not have enough '+item.name+' ('+(-left)+' short).', '#status', true)
		canMake = false
	}
	else item.recipe.forEach(function(spec){
		left = (inventory[spec.name] || 0) - quantity * spec.quantity
		if(left < 0)
		{
			display('You do not have enough '+spec.name+' ('+(-left)+' short).', '#status', true)
			canMake = false
		}
	})
	
	if(canMake)
	{
		item.recipe.forEach(function(spec){
			inventory[spec.name] = (inventory[spec.name] || 0) - quantity * spec.quantity
			if(inventory[spec.name] == 0)
			{
				display('Out of '+spec.name+'.', '#status', true)
				delete inventory[spec.name]
			}
		})
		inventory[item.name] = (inventory[item.name] || 0) + quantity
		display(quantity+' '+item.name+' created.', '#status', true)
		if(inventory[item.name] == 0)
		{
			display('Out of '+item.name+'.', '#status', true)
			delete inventory[item.name]
		}
		display(inventory, '#inventory')
	}
}
