/**
 * @class	CS_Carrousel
 * @author	Paul Kruijt
 * @author	Jeffrey van der Veen
 */
var CS_Carrousel = new Class({

	/**
	 * initialize
	 * @param	string	root_node_id
	 * @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.image_class			= 'cs_carrousel_image';
		this.text_class				= 'cs_carrousel_text';
		this.button_class			= 'cs_carrousel_button';
		this.items_wrapper_class	= 'cs_carrousel_items_wrapper';
		this.items_prev_class		= 'cs_carrousel_items_prev';
		this.items_next_class		= 'cs_carrousel_items_next';
		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_active_prev_class	= 'cs_active_prev';

		// settings
		this.effect_type		= !effect_type ? 1 : effect_type.toInt();
		this.time_interval		= !time_interval ? 5000 : time_interval.toInt(); /* default 5 seconds */

		this.effect_interval	= 1000;
		this.prev_next			= 0;

		// 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');

					if (active_item_node)
					{
						active_item_node.set('class', this.item_active_class);

						this.active_item_node	= active_item_node;
						var active_item_li_node	= active_item_node.getParent('li');

						if (active_item_li_node)
						{
							active_item_li_node.set('class', this.item_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();
							}
						});
					}
				});

				if (this.prev_next && total_item_nodes > 1)
				{
					var items_wrapper_node = this.root_node.getElement('.'+this.items_wrapper_class);

					if (items_wrapper_node)
					{
						var prev_a_node	= items_wrapper_node.getElement('.'+this.items_prev_class+' a');
						var next_a_node	= items_wrapper_node.getElement('.'+this.items_next_class+' a');

						if (prev_a_node)
						{
							prev_a_node.removeEvents();
							prev_a_node.addEvents(
							{
								'click': function()
								{
									_this.activateItem(_this.getNeighborItem('prev'));

									return false;
								},

								'focus': function()
								{
									this.blur();
								}
							});
						}

						if(next_a_node)
						{
							next_a_node.removeEvents();
							next_a_node.addEvents(
							{
								'click': function()
								{
									_this.activateItem(_this.getNeighborItem('next'));

									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.getNeighborItem('next');
		}

		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');
				}

				// 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');

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

						if (items_wrapper_node)
						{
							var item_active_node = items_wrapper_node.getElement('a.'+this.item_active_class);

							if (item_active_node && item_active_node != item_node)
							{
								item_active_node.removeClass(this.item_active_class);

								var item_active_li_node = items_wrapper_node.getElement('li.'+this.item_active_class);

								if (item_active_li_node)
								{
									item_active_li_node.removeClass(this.item_active_class);

									var item_active_prev_li_node = items_wrapper_node.getElement('li.'+this.item_active_prev_class);

									if (item_active_prev_li_node)
									{
										item_active_prev_li_node.removeClass(this.item_active_prev_class);
									}
								}
							}
						}

						// activate item
						item_node.addClass(this.item_active_class);

						this.active_item_node	= item_node;
						var item_li_node		= item_node.getParent('li');

						if (item_li_node)
						{
							item_li_node.addClass(this.item_active_class);

							var item_prev_li_node = item_li_node.getPrevious();

							if (item_prev_li_node)
							{
								item_prev_li_node.addClass(this.item_active_prev_class);
							}
						}

						// 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();

								// create new image with clicked source
								var new_image_node = new Element('img',
								{
									'src' 		: item_image_source,
									'opacity'	: 0
								});
								new_image_node.inject(image_wrapper_node);

								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);

							if (item_link == '#')
							{
								button_anchor_node.set('class', 'passive');
								button_anchor_node.set('onclick', 'return false;');
							}
							else
							{
								button_anchor_node.erase('class');
								button_anchor_node.erase('onclick');
							}
						}
					}
				}
			}
		}
	},

	/**
	 * 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 neighbor item
	 * @param	string	side
	 * @return	object	item_node
	 */
	getNeighborItem: function(side)
	{
		if (side == 'prev' || side == 'next')
		{
			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
					{
						if (side == 'prev')
						{
							var parent_item_node = this.active_item_node.getParent().getPrevious();

							if (parent_item_node) item_node = parent_item_node.getElement('a');

							// get last item
							if (!item_node) item_node = item_nodes[total_item_nodes-1].getElement('a');
						}
						else if (side == 'next')
						{
							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;
		}
	}
});
