var Tree = Class.create();
Tree.prototype = {
	initialize: function(el)
	{
		this.el = el.addClassName('yui-skin-sam');

		this.max_depth = 0;
		this.node_desc_objs = new Hash();
		
		// YUI Tree
		this.yui_tree_el = new Element('div');
		this.yui_tree = new YAHOO.widget.TreeView(this.yui_tree_el);
		this.el.insert(this.yui_tree_el);
		
	},
	insertNode: function(node_desc_obj, render)
	{
		if ( !Object.isUndefined(node_desc_obj.id) && !Object.isUndefined(node_desc_obj.label) && !Object.isUndefined(node_desc_obj.parent_category_id) && Object.isUndefined(this.node_desc_objs.get(node_desc_obj.id)) )
		{
			this.node_desc_objs.set(node_desc_obj.id, node_desc_obj);
		}
		if ( render )
		{
			this.render();
		}
	},
	observe: function(method, func)
	{
		switch(method)
		{
			case 'label_click':
				this.yui_tree.subscribe('labelClick', function(node)
				{
					func(node);
					
				}.bindAsEventListener(this));
				break;
				
			case 'node_expand':
				this.yui_tree.subscribe('expand', function(node)
				{
					func(node);
					
				}.bindAsEventListener(this));
				break;
		}
	},
	clear: function()
	{
		
	},
	render: function()
	{
		this.yui_tree_el.update('');
		this.max_depth = 0;
		this.yui_tree.removeChildren(this.yui_tree.getRoot());
		this._recursiveRender(this.yui_tree.getRoot());
		this.yui_tree.draw();
	},
	_recursiveRender: function(target_node)
	{
		var level_nodes = [];
		
		var parent_category_id = ( target_node.isRoot() ? 0 : target_node.data.id );
		this.node_desc_objs.each( function(node_desc_obj_pair, node_desc_obj_pair_index)
		{
			if ( node_desc_obj_pair.value.parent_category_id == parent_category_id )
			{
				var node = new YAHOO.widget.TextNode(node_desc_obj_pair.value, target_node, false);	
				this._recursiveRender(node);
				
				if ( node.depth > this.max_depth )
				{
					this.max_depth = node.depth;
				}
				
				level_nodes.push(node);
			}
			
		}.bind(this));
	},
	_swapTwoNodes: function(src_node, dst_node)
	{
		if ( src_node != null && dst_node != null && src_node != dst_node )
		{
			dst_node.insertAfter(src_node);
		}
	}
};

var CategoryTree = Class.create(Tree, {
	initialize: function($super, el)
	{
		$super(el);
	},
	render: function($super)
	{
		$super();
		this._sortByOrder(this.yui_tree.getRoot());
		this.yui_tree.draw();
	},
	_sortByOrder: function(target_node)
	{
		// Sort the children
		if ( target_node.children.length > 0 )
		{
			var current_id = '0';
			for ( var i = 0; i < target_node.children.length; i++ )
			{
				for ( var j = 0; j < target_node.children.length; j++ )
				{
					if ( target_node.children[j].data.prev_category_id == current_id )
					{
						current_id = target_node.children[j].data.id;
						this._swapTwoNodes(target_node.children[i], target_node.children[j]);
						break;
					}
				}
				this._sortByOrder(target_node.children[i]);
			}
			
		}
	},
	_swapTwoNodesWithData: function(src_node, dst_node)
	{
		if ( src_node != null && dst_node != null && src_node != dst_node )
		{
			if ( src_node.nextSibling != null )
			{
				var tmp_prev_category_id = src_node.data.prev_category_id;
				src_node.data.prev_category_id = dst_node.data.prev_category_id;
				dst_node.data.prev_category_id = src_node.nextSibling.data.prev_category_id;
				src_node.nextSibling.data.prev_category_id = tmp_prev_category_id;
			}
			else {
				src_node.data.prev_category_id = dst_node.data.prev_category_id;
				dst_node.data.prev_category_id = src_node.data.id;
			}
			dst_node.insertAfter(src_node);
			this.yui_tree.draw();
		}
	}
});
