/**
 * class	CS_Carrousel
 * author	Paul Kruijt
 */
var CS_Carrousel = new Class({
	
	/**
	 * initialize
	 * @param	string	root_node_id
	 * @param	integer	effect_type
	 * @return	void
	 */
	initialize: function(root_node_id, effect_type)
	{
		// nodes
		this.root_node			= !root_node_id ? document.getElement('body') : $(root_node_id);
		this.active_item_node	= null;
		
		// classes
		this.image_class		= 'cs_carrousel_image';
		this.text_class			= 'cs_carrousel_text';
		this.button_class		= 'cs_carrousel_button';
		this.items_class		= 'cs_carrousel_items';
		this.item_label_class	= 'cs_carrousel_item_label';
		this.item_image_class	= 'cs_carrousel_item_image';
		this.item_text_class	= 'cs_carrousel_item_text';
		this.item_active_class	= 'cs_active';
		this.item_li_active_class	= 'li_active';
		
		// settings
		this.effect_type		= !effect_type ? 1 : effect_type.toInt();
		this.effect_interval	= 1000;
		this.time_interval		= 5000; /* default 5 seconds */
		
		// overall
		this.carrousel_play	= null;
	},
	
	/**
	 * start
	 * @return	void
	 */
	start: function()
	{
		if (this.root_node)
		{
			// init active item
			this.initActiveItem();
			
			// set events
			this.setEvents();
			
			// play carrousel
			this.play();
		}
	},
	
	/**
	 * set events
	 * @return	void
	 */
	initActiveItem: function()
	{
		// get items
		var items_wrapper_node = this.root_node.getElement('.'+this.items_class);
		
		if (items_wrapper_node)
		{
			var active_item_node = items_wrapper_node.getElement('.'+this.item_active_class);
			
			if (active_item_node) this.active_item_node = active_item_node;
			
			else
			{
				var item_nodes			= items_wrapper_node.getElements('li');
				var total_item_nodes	= item_nodes.length;
				
				if (total_item_nodes > 0)
				{
					var active_item_node = item_nodes[0].getElement('a');
					var active_li_node = item_nodes[0];
					
					if (active_item_node)
					{
						active_item_node.set('class', this.item_active_class);
						this.active_item_node = active_item_node;
						
						active_li_node.set('class', this.item_li_active_class);
					}
				}
			}
		}
	},
	
	/**
	 * set events
	 * @return	void
	 */
	setEvents: function()
	{
		// set vars
		var _this	= this;
		
		// get items and set events
		var items_wrapper_node = this.root_node.getElement('.'+this.items_class);
		
		if (items_wrapper_node)
		{
			var item_nodes			= items_wrapper_node.getElements('li');
			var total_item_nodes	= item_nodes.length;
			
			if (total_item_nodes > 0)
			{
				item_nodes.each(function(item_node)
				{
					var item_handler_node = item_node.getElement('a');
					
					if (item_handler_node)
					{
						item_handler_node.removeEvents();
						item_handler_node.addEvents(
						{
							'click': function()
							{
								_this.activateItem(this);
								
								return false;
							},
							
							'focus': function()
							{
								this.blur();
							}
						});
					}
				});
			}
		}
	},
	
	/**
	 * 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)
		{
			// get item parts
			var item_text_node			= item_node.getElement('.'+this.item_text_class);
			var item_image_wrapper_node	= item_node.getElement('.'+this.item_image_class);
			
			if (item_text_node && item_image_wrapper_node)
			{
				// get content of parts
				var item_text_content	= item_text_node.innerHTML;
				var item_image_node		= item_image_wrapper_node.getElement('img');
				var item_image_source	= null;
				
				if (item_image_node)
				{
					item_image_source 		= item_image_node.get('src');
					item_image_source_org 	= item_image_node.get('name');
				}
				
				// get listeners
				var image_wrapper_node	= this.root_node.getElement('.'+this.image_class);
				var text_node			= this.root_node.getElement('.'+this.text_class);
				var button_node			= this.root_node.getElement('.'+this.button_class);
				
				if (image_wrapper_node && text_node && button_node)
				{
					var image_node 	= image_wrapper_node.getElement('img');
					var anchor_node = image_wrapper_node.getElement('a');

					if (image_node)
					{
						// get active item and de-activate it
						var items_wrapper_node = item_node.getParent('.'+this.items_class);
						var li_node = item_node.getParent('li');

						if (items_wrapper_node)
						{
							var item_active_node = items_wrapper_node.getElement('.'+this.item_active_class);
							var item_li_active_node = items_wrapper_node.getElement('.'+this.item_li_active_class);
							
							if (item_active_node && item_active_node != item_node) 
							{
								item_active_node.removeClass(this.item_active_class);
								item_li_active_node.removeClass(this.item_li_active_class);
							}
						}
						
						// activate item
						item_node.set('class', this.item_active_class);
						li_node.set('class', this.item_li_active_class);
						this.active_item_node = item_node;
						
						// set content based on effect type
						switch (this.effect_type)
						{
							//***************
							// toggle parts *
							//***************
							case 1:
								image_node.set('src', item_image_source);
								
							break;
							
							//*************
							// fade parts *
							//*************
							case 2:
								
								// stop autoplay
								this.stop();
								
								if (item_image_source_org)
								{
									var image = item_image_source_org;
								}
								else {
									var image = item_image_source;
								}							
								
								// create new image with clicked source
								var new_image_node = new Element('img',
								{
									'src' 		: item_image_source,
									'opacity'	: 0,
									'name'		: image
								});

								new_image_node.inject(image_wrapper_node);
								
								Slimbox.scanPage();
								
								var fade_out_effect = new Fx.Morph(new_image_node, {duration: this.effect_interval, transition: Fx.Transitions.Quad.easeOut});
								
								fade_out_effect.start({
									'opacity': 1
								}).chain(function()
								{
									image_node.dispose();
									
									// play again
									_this.play();
								});
								
							break;
						}
						
						// set text
						text_node.innerHTML	= item_text_content;
						
						// set link
						var item_link			= item_node.get('href');
						var button_anchor_node	= button_node.getElement('a');
						
						if (item_link && button_anchor_node)
						{
							button_anchor_node.set('href', item_link);
						}
					}
				}
			}
		}
	},
	
	/**
	 * 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 items_wrapper_node = this.root_node.getElement('.'+this.items_class);
		
		if (items_wrapper_node)
		{
			var item_nodes			= items_wrapper_node.getElements('li');
			var total_item_nodes	= item_nodes.length;
			
			if (total_item_nodes > 0)
			{
				// check if an item is active (if not...set first item to active)
				if (!this.active_item_node)
				{
					item_node = item_nodes[0].getElement('a');
				}
				else
				{
					var parent_item_node = this.active_item_node.getParent().getNext();
					
					if (parent_item_node) item_node = parent_item_node.getElement('a');
					
					// get first item
					if (!item_node) item_node = item_nodes[0].getElement('a');
				}
			}
		}
		
		return item_node;
	}
});
