var BD = BD || {};

BD.Stack = function()
{
	var stack = [];
	var current_offset = 0;
	
	function normalize_offset(offset)
	{
		offset %= stack.length;
		offset = offset<0 ? offset + stack.length : offset;
		return offset;
	}
	
	return {
		add: function(element)
		{
			stack.push(element);
		},
		
		setOffset: function(offset)
		{
			current_offset = normalize_offset(offset);
		},
		
		setRelativeOffset: function(relativeOffset)
		{
			current_offset = normalize_offset(current_offset + relativeOffset);
		},
		
		relativeAt: function(relativeOffset)
		{
			var offset = normalize_offset(current_offset + relativeOffset);
			return stack[offset];
		},
		
		each: function(callback)
		{
			for(var i=0; i<stack.length; i++)
			{
				callback(stack[i]);
			}
		},
		
		at: function(offset)
		{
			offset = normalize_offset(offset);
			return stack[offset];
		},
		
		current: function()
		{
			return stack[current_offset];
		}
	}
}
