package {
	import flash.geom.Rectangle;

	public class RectangleNode
	{
		public var Left:RectangleNode = null;
		public var Right:RectangleNode = null;
		public var Rect:Rectangle = null;
		public var InUse:Boolean = false;
		public var Removed:Boolean = false;
		public var Parent:RectangleNode = null;
		public var AllocationID = 0;
		public var Host:RectanglePacker= null;
		public var MinAllocationID = 0;
		public var NodeID;
		public static var NextNodeID = 0;
		
		public var DontRemove = false;
		
		public var LastAccessTime = 0;
		
		public var Flags = [];
		
		public var UpdateTo:RectangleNode = null;
		
		/*
		public function get Removed()
		{
			return _Removed;
		}
		
		public function set Removed(r)
		{
			this._Removed = r;
		}
		
		public function get Host():RectanglePacker
		{
			return _Host;
		}
		public function set Host(p:RectanglePacker)
		{
			this._Host = p;

			if (_Left && _Left.Host != p)
			{
				throw new Error("bad left host");
			}
			if (_Right && _Right.Host != p)
			{
				throw new Error("bad right host");
			}
			if (_Parent && _Parent.Host != p)
			{
				throw new Error("bad parent host");
			}

		}
		
		public function get Left():RectangleNode
		{
			return _Left;
		}
		public function set Left(n:RectangleNode)
		{
			if (n && n.Host != Host)
			{
				throw new Error("bad left host");
			}
			_Left = n;
		}
		public function get Right():RectangleNode
		{
			return _Right;
		}
		public function set Right(n:RectangleNode)
		{
			if (n && n.Host != Host)
			{
				throw new Error("bad right host");
			}
			_Right = n;
		}
		
		public function get Parent():RectangleNode
		{
			return _Parent;
		}
		public function set Parent(n:RectangleNode)
		{
			if (n && n.Host != Host)
			{
				throw new Error("bad parent host");
			}
			_Parent = n;
		}
		*/
		public function get IsFreeSpace()
		{
			return Left == null && Right == null && !InUse;
		}
		public function UpdateLinksFromNode(node:RectangleNode)
		{
			if (node.Parent)
			{
				if (node.Parent.Left == node)
				{
					node.Parent.Left = this;
				}
				if (node.Parent.Right == node)
				{
					node.Parent.Right = this;
				}
			}
			if (node.Left)
			{
				node.Left.Parent = this;
			}
			if (node.Right)
			{
				node.Right.Parent = this;
			}
		}
		public function MakeFromNode(node:RectangleNode)
		{
			//_Host = node.Host;
			Host = node.Host;
			Left = node.Left;
			Right = node.Right;
			Parent = node.Parent;
			AllocationID = node.AllocationID;
			InUse = node.InUse;
			MinAllocationID = node.MinAllocationID;
			NodeID = node.NodeID;
			Rect = node.Rect.clone();
			Removed = node.Removed;
			DontRemove = node.DontRemove;
		}
		public function RectangleNode(x, y, w, h, host:RectanglePacker)
		{
			this.NodeID = NextNodeID++;
			this.Host = host;
			this.Rect = new Rectangle(x, y, w, h);
		}
		public function OutputJSON()
		{
			var node = {};
			node.rect = [this.Rect.left, this.Rect.top, this.Rect.width, this.Rect.height];
			node.in_use = InUse;
			node.id = NodeID;
			if (this.Left) node.left = this.Left.OutputJSON();
			if (this.Right) node.right = this.Right.OutputJSON();
			return node;
		}
		
		public function ReadJSON(details)
		{
			details.new_node = this;
			this.Rect = new Rectangle(details.rect[0], details.rect[1], details.rect[2], details.rect[3]);
			this.Removed = false;
			
			this.InUse = details.in_use;
			
			if (details.hasOwnProperty("right"))
			{
				this.Right = new RectangleNode(0, 0, 0, 0, this.Host);
				Right.ReadJSON(details.right);
				Right.Parent = this;
			}
			if (details.hasOwnProperty("left"))
			{
				this.Left = new RectangleNode(0, 0, 0, 0, this.Host);
				Left.ReadJSON(details.left);
				Left.Parent = this;
			}
		}
	}
}