var backing_store = {};

// Add to every control
function backup_form(form)
{
	backing_store = {};
	for (var i=0;i<form.elements.length;i++)
	{
		var c = form.elements[i];
		if (!backing_store[c.name])
			update_backing_store(c.form,c.name);
	}
}

function update_backing_store(form,name)
{
// Populate the store
	var store = new Array();
	for (var i=0;i<form.elements.length;i++)
	{
	// Look for controls that match the name
		var c = form.elements[i];
		if (c.name != name && c.name != name+'[]')
			continue;

	// Add to the store
		switch (c.type)
		{
		case 'radio':
		case 'checkbox':
			if (c.checked)
				store[store.length] = c.value;
			break;
		default:
			store[store.length] = c.value;
			break;
		}
	}

// Add the new store
	backing_store[name] = store;
}

function restore_from_backing_store(form)
{
	var store = backing_store;
	for (var i=0;i<form.elements.length;i++)
	{
	// Look for controls that match the name
		var c = form.elements[i];

	// Look for the next value based on the type of control
		switch (c.type)
		{
		case 'radio':
		case 'checkbox':
		// Find out if this value was in the store
			var checked = false;
			for (var j=0;j<store[c.name].length;j++)
			{
				if (c.value == store[c.name][j])
				{
					checked = true;
					break;
				}
			}

		// Check if it was in the store
			c.checked = checked;
			break;
		default:
		// Set the control
			c.value = (store[c.name].length > 0) ? store[c.name][0] : '';

		// Remove the value
			var tmp = new Array();
			for (var j=1;j<store[c.name].length;j++)
				tmp[j-1] = store[c.name][j];
			store[c.name] = tmp;
			break;
		}
	}
}
