/**
 * class	CS_NodeClicker
 * author	Paul Kruijt
 */
var CS_NodeClicker = new Class({
	
	/**
	 * initialize
	 * @param	string	root_node_id
	 * @param	string	node_name
	 * @param	integer	effect_type
	 * @param	integer	effect_duration
	 * @return	void
	 */
	initialize: function(root_node_id, node_name, effect_type, effect_duration)
	{
		// vars
		this.last_item		= 0;
		this.root_node_id	= root_node_id;
		this.node_name		= node_name;
		this.filter_id		= 'cs_node_clicker_filter';
		
		// secure integers
		var effect_type		= parseInt(effect_type);
		var effect_duration	= parseInt(effect_duration);
		
		// settings
		this.effect_type		= effect_type > 0 ? effect_type : 1;
		this.effect_duration	= effect_duration > 0 ? effect_duration : 1000;
	},
	
	/**
	 * start
	 * @return void
	 */
	start: function()
	{
		var _this = this;
		
		if (this.root_node_id && this.node_name)
		{
			var root_node	= $(this.root_node_id);
			
			if (root_node)
			{
				var nodes		= root_node.getElements(this.node_name);
				var total_nodes	= nodes.length;
				
				if (total_nodes > 0)
				{
					nodes.each(function(node, index)
					{
						if (index == 0) node.setStyle('display', 'block');
						else node.setStyle('display', 'none');
						
						node.setStyle('z-index', 1);
						
						node.addEvent('click', function()
						{
							_this.clickEvent(this, nodes);
						});
					});
				}
			}
		}
	},
	
	/**
	 * Click event
	 * @return void
	 */
	clickEvent: function(node, nodes)
	{
		// set vars
		var _this = this;
		
		// get next node
		var next_node = node.getNext();
		if (!next_node || next_node.get('id') == this.filter_id) next_node = nodes[0];
		
		// get effect type
		switch(this.effect_type)
		{
			//*********
			// toggle *
			//*********
			case 1:
				
				node.setStyle('display', 'none');
				next_node.setStyle('display', 'block');
				
			break;
			
			//**************
			// fade in/out *
			//**************
			case 2:
				
				// show filter
				this.showFilter(node);
				
				if (node.getNext() && node.getNext().get('id') != this.filter_id)
				{
					next_node.setStyle('opacity', 0);
					next_node.setStyle('display', 'block');
					
					// start effect
					var fade_effect = new Fx.Morph(next_node, {duration: this.effect_duration,	transition: Fx.Transitions.Quad.easeOut});
					
					fade_effect.start({
						'opacity': 1
					}).chain(function()
					{
						node.setStyle('display', 'none');
						
						// remove filter
						_this.removeFilter();
					});
				}
				else
				{
					next_node.setStyle('opacity', 1);
					next_node.setStyle('display', 'block');
					
					// start effect
					var fade_effect = new Fx.Morph(node, {duration: this.effect_duration,	transition: Fx.Transitions.Quad.easeOut});
					
					fade_effect.start({
						'opacity': 0
					}).chain(function()
					{
						node.setStyle('display', 'none');
						
						// remove filter
						_this.removeFilter();
					});
				}
				
			break;
		}
	},
	
	/**
	 * Show filter
	 * @param	object	node
	 * @return	void
	 */
	showFilter: function(node)
	{
		var parent_node = node.getParent();
		
		if (parent_node && !$(this.filter_id))
		{
			var filter_node = new Element('div', {
				'id' : 'cs_node_clicker_filter',
				'styles' : 
				{
					'background'	: 'url(empty.gif)',
					'height'		: node.getCoordinates().height,
					'left'			: 0,
					'position'		: 'absolute',
					'right'			: 0,
					'top'			: 0,
					'width'			: node.getCoordinates().width,
					'z-index'		: 100
				}
			});
			
			filter_node.inject(parent_node);
		}
	},
	
	/**
	 * Remove filter
	 * @return void
	 */
	removeFilter: function()
	{
		if ($(this.filter_id)) $(this.filter_id).dispose();
	}
});
