/**
 * class	CS_Carrousel
 * author	Paul Kruijt
 */
var CS_Carrousel = new Class({
	
	/**
	 * initialize
	 * @param	string	root_node_id
	 * @param	integer	time_interval
	 * @param	integer	effect_type
	 * @return	void
	 */
	initialize: function(root_node_id, time_interval, effect_type)
	{
		// nodes
		this.root_node			= !root_node_id ? document.getElement('body') : $(root_node_id);
		this.active_item_node	= null;
		
		// classes
		this.carrousel_wrapper_class				= 'cs_carrousel_wrapper';
		this.carrousel_class						= 'cs_carrousel';
		this.carrousel_main_wrapper_class			= 'cs_carrousel_main_wrapper';
		this.carrousel_main_class					= 'cs_carrousel_main';
		this.carrousel_main_image_wrapper_class		= 'cs_carrousel_main_image_wrapper';
		this.carrousel_main_image_class				= 'cs_carrousel_main_image';
		this.carrousel_main_text_wrapper_class		= 'cs_carrousel_main_text_wrapper';
		this.carrousel_main_text_class				= 'cs_carrousel_main_text';
		this.carrousel_main_label_wrapper_class		= 'cs_carrousel_main_label_wrapper';
		this.carrousel_main_label_class				= 'cs_carrousel_main_label';
		this.carrousel_items_wrapper_class			= 'cs_carrousel_items_wrapper';
		this.carrousel_items_class					= 'cs_carrousel_items';
		this.carrousel_item_wrapper_class			= 'cs_carrousel_item_wrapper';
		this.carrousel_item_class					= 'cs_carrousel_item';
		this.carrousel_item_hover_class				= 'cs_carrousel_item_hover';
		this.carrousel_item_info_wrapper_class		= 'cs_carrousel_item_info_wrapper';
		this.carrousel_item_info_class				= 'cs_carrousel_item_info';
		this.carrousel_item_image_class				= 'cs_carrousel_item_image';
		this.carrousel_item_text_class				= 'cs_carrousel_item_text';
		this.carrousel_item_label_class				= 'cs_carrousel_item_label';
		this.carrousel_item_link_class				= 'cs_carrousel_item_link';
		
		// settings
		this.time_interval		= !time_interval ? 5000 : time_interval; /* default 5 seconds */
		this.effect_type		= !effect_type ? 0 : effect_type.toInt(); /* default no effect */
		this.effect_interval	= 250;
		this.total_items		= this.getTotalItems();
		
		// overall
		this.carrousel_play	= null;
	},
	
	/**
	 * start
	 * @return	void
	 */
	start: function()
	{
		if (this.root_node)
		{
			// set events
			this.setEvents();
			
			// set first item active
			this.activateItem();
			
			// play carrousel
			this.play();
		}
	},
	
	/**
	 * get total items
	 * @return	integer	total_items
	 */
	getTotalItems: function()
	{
		var total_items = 0;
		
		if (this.root_node)
		{
			var carrousel_item_nodes		= this.root_node.getElements('.'+this.carrousel_item_wrapper_class);
			var total_carrousel_item_nodes	= carrousel_item_nodes.length;
			
			if (total_carrousel_item_nodes > 0) total_items = total_carrousel_item_nodes;
		}
		
		return total_items;
	},
	
	/**
	 * set events
	 * @return	void
	 */
	setEvents: function()
	{
		// set vars
		var _this	= this;
		
		// set events on carrousel
		var carrousel_node	= this.root_node.getElement('.'+this.carrousel_wrapper_class);
		
		if (carrousel_node)
		{
			carrousel_node.addEvents(
			{
				'mouseover': function()
				{
					_this.stop();
				},
				
				'mouseout': function()
				{
					_this.play();
				}
			});
		}
		
		// get items and set events
		var carrousel_item_nodes		= this.root_node.getElements('.'+this.carrousel_item_wrapper_class);
		var total_carrousel_item_nodes	= carrousel_item_nodes.length;
		
		if (total_carrousel_item_nodes > 0)
		{
			carrousel_item_nodes.each(function(carrousel_item_node)
			{
				carrousel_item_node.addEvents(
				{
					'mouseover': function()
					{
						_this.activateItem(this);
					},
					
					'click': function()
					{
						_this.linkItem(this);
					}
				});
			});
		}
	},
	
	/**
	 * activate item
	 * @param	object	item_node
	 * @return	void
	 */
	activateItem: function(item_node)
	{
		// set vars
		var _this	= this;
		
		// get next item
		if (!item_node)
		{
			item_node = this.getNextItem();
		}
		
		if (item_node)
		{
			var carrousel_item_inner_node = item_node.getElement('.'+this.carrousel_item_class);
			
			if (carrousel_item_inner_node)
			{
				// de-activate active item
				if (this.active_item_node) this.active_item_node.set('class', this.carrousel_item_class);
				
				// set new active item
				carrousel_item_inner_node.set('class', this.carrousel_item_hover_class);
				
				this.active_item_node = carrousel_item_inner_node;
				
				// set item content
				var item_image_node	= item_node.getElement('.'+this.carrousel_item_image_class);
				var item_text_node	= item_node.getElement('.'+this.carrousel_item_text_class);
				var item_label_node	= item_node.getElement('.'+this.carrousel_item_label_class);
				
				// set main image
				if (item_image_node)
				{
					var main_image_node	= this.root_node.getElement('.'+this.carrousel_main_image_class);
					
					if (main_image_node)
					{
						switch (this.effect_type)
						{
							// fade
							case 1:
							
								var fade_out_effect = new Fx.Morph(main_image_node, {duration: this.effect_interval, transition: Fx.Transitions.Quad.easeOut});
								
								fade_out_effect.start({
									'opacity': 0
								}).chain(function()
								{
									var item_image_content	= item_image_node.get('html');
									main_image_node.set('html', item_image_content);
									
									var fade_in_effect = new Fx.Morph(main_image_node, {duration: _this.effect_interval, transition: Fx.Transitions.Quad.easeOut});
									
									fade_in_effect.start({
										'opacity': 1
									});
								});
							
							break;
							
							// no effect
							default:
							
								var item_image_content	= item_image_node.get('html');
								main_image_node.set('html', item_image_content);
								
							break;
						}
						
						// remove and set item events
						main_image_node.removeEvents();
						
						main_image_node.addEvents(
						{
							'click': function()
							{
								_this.linkItem(item_node);
							}
						});
					}
				}
				
				// set main text
				if (item_text_node)
				{
					var main_text_node	= this.root_node.getElement('.'+this.carrousel_main_text_class);
					
					if (main_text_node)
					{
						var item_text_content	= item_text_node.get('html');
						main_text_node.set('html', item_text_content);
						
						// remove and set item events
						main_text_node.getParent().removeEvents();
						
						main_text_node.getParent().addEvents(
						{
							'click': function()
							{
								_this.linkItem(item_node);
							}
						});
					}
				}
				
				// set main label
				if (item_label_node)
				{
					var main_label_node	= this.root_node.getElement('.'+this.carrousel_main_label_class);
					
					if (main_label_node)
					{
						var item_label_content	= item_label_node.get('html');
						main_label_node.set('html', item_label_content);
						
						// remove and set item events
						main_label_node.removeEvents();
						
						main_label_node.addEvents(
						{
							'click': function()
							{
								_this.linkItem(item_node);
							}
						});
					}
				}
			}
		}
	},
	
	/**
	 * link item
	 * @param	object	item_node
	 * @return	void
	 */
	linkItem: function(item_node)
	{
		if (item_node)
		{
			var item_link_node	= item_node.getElement('.'+this.carrousel_item_link_class);
			
			// link to page
			if (item_link_node)
			{
				var item_link_content	= item_link_node.get('text');
				
				if (item_link_content != '')
				{
					document.location	= item_link_content;
				}
			}
		}
	},
	
	/**
	 * play carrousel
	 * @return	void
	 */
	play: function()
	{
		var _this = this;
		
		// clear interval
		clearInterval(this.carrousel_play);
		
		// set interval
		this.carrousel_play = setInterval(function()
		{
			_this.activateItem();
		}, this.time_interval);
	},
	
	/**
	 * stop carrousel
	 * @return	void
	 */
	stop: function()
	{
		// clear interval
		clearInterval(this.carrousel_play);
	},
	
	/**
	 * get next item
	 * @return	object	item_node
	 */
	getNextItem: function()
	{
		var item_node;
		
		// get items
		var carrousel_item_nodes		= this.root_node.getElements('.'+this.carrousel_item_wrapper_class);
		var total_carrousel_item_nodes	= carrousel_item_nodes.length;
		
		if (total_carrousel_item_nodes > 0)
		{
			// check if an item is active (if not...set first item to active)
			if (!this.active_item_node)
			{
				item_node = carrousel_item_nodes[0];
			}
			else
			{
				item_node = this.active_item_node.getParent().getNext();
				
				// get first item
				if (!item_node) item_node = carrousel_item_nodes[0];
			}
		}
		
		return item_node;
	}
});