/**
 * CS_GallerySlider Class
 * @author Paul Kruijt
 */
var CS_GallerySlider = new Class({
	
	/**
	 * initialize
	 * @param	string	root_node_id
	 * @return	void
	 */
	initialize: function(root_node_id)
	{
		// id's
		this.root_node_id	= root_node_id;
		
		// classes
		this.gallery_wrapper_class			= 'cs_gallery_slider_wrapper';
		this.gallery_class					= 'cs_gallery_slider';
		this.image_wrapper_class			= 'cs_gallery_slider_image_wrapper';
		this.image_class					= 'cs_gallery_slider_image';
		this.thumbnails_wrapper_class		= 'cs_gallery_slider_thumbnails_wrapper';
		this.thumbnails_class				= 'cs_gallery_slider_thumbnails';
		this.thumbnail_wrapper_class		= 'cs_gallery_slider_thumbnail_wrapper';
		this.thumbnail_class				= 'cs_gallery_slider_thumbnail';
		this.handler_left_wrapper_class		= 'cs_gallery_slider_handler_left_wrapper';
		this.handler_left_class				= 'cs_gallery_slider_handler_left';
		this.handler_right_wrapper_class	= 'cs_gallery_slider_handler_right_wrapper';
		this.handler_right_class			= 'cs_gallery_slider_handler_right';
		this.filter_class					= 'cs_gallery_slider_filter';
		this.active_class					= 'cs_active';
		
		// settings
		this.active_thumbnail_index			= 0;
		this.center_thumbnail_index			= 0;
		this.total_thumbnails_showed		= 0;
		this.thumbnails_wrapper_width		= 0;
		this.thumbnails_width				= 0;
		this.thumbnail_td_width				= 0;
		this.slide_duration					= 500;
	},
	
	/**
	 * start
	 * @return	void
	 */
	start: function()
	{
		this.root_node = $(this.root_node_id);
		
		if (this.root_node)
		{
			this.setEvents();
		}
	},
	
	/**
	 * set events
	 * @return	void
	 */
	setEvents: function()
	{
		// set var as object
		var _this	= this;
		
		// get settings
		this.getSettings();
		
		// set handler events
		this.setHandlerEvents();
		
		// set thumbnail events
		this.setThumbnailEvents();
	},
	
	/**
	 * get settings
	 * @return	void
	 */
	 getSettings: function()
	{
		var thumbnails_wrapper_node = this.root_node.getElement('.'+this.thumbnails_wrapper_class);
		
		if (thumbnails_wrapper_node)
		{
			// get wrapper width
			var thumbnails_wrapper_coordinates	= thumbnails_wrapper_node.getCoordinates();
			this.thumbnails_wrapper_width		= thumbnails_wrapper_coordinates.width.toInt();
			
			// get total width of table
			var thumbnails_table_node	= thumbnails_wrapper_node.getElement('table');
			
			if (thumbnails_table_node)
			{
				var thumbnails_table_coordinates	= thumbnails_table_node.getCoordinates();
				this.thumbnails_width				= thumbnails_table_coordinates.width.toInt();
				
				// get thumbnail width
				var thumbnail_td_node	= thumbnails_wrapper_node.getElement('td');
				
				if (thumbnail_td_node)
				{
					var thumbnail_td_coordinates	= thumbnail_td_node.getCoordinates();
					this.thumbnail_td_width			= thumbnail_td_coordinates.width.toInt();
					
					if (this.thumbnails_wrapper_width > 0 && this.thumbnail_td_width > 0)
					{
						// calculate center index
						this.total_thumbnails_showed = Math.floor((this.thumbnails_wrapper_width / this.thumbnail_td_width)).toInt();
						this.center_thumbnail_index = Math.floor((this.total_thumbnails_showed / 2) - 1).toInt();
					}
				}
			}
		}
	},
	
	/**
	 * set handler events
	 * @return	void
	 */
	setHandlerEvents: function()
	{
		// set vars
		var _this = this;
		
		// left handler
		var handler_left_wrapper_node = this.root_node.getElement('.'+this.handler_left_wrapper_class);
		
		if (handler_left_wrapper_node)
		{
			var handler_left_node = handler_left_wrapper_node.getElement('a');
			
			if (handler_left_node)
			{
				handler_left_node.removeEvents();
				handler_left_node.addEvent('click', function()
				{
					// activate
					_this.activateImage(_this.active_thumbnail_index - 1);
					
					// slide
					_this.slide(1);
					
					return false;
				});
			}
		}
		
		// right handler
		var handler_right_wrapper_node = this.root_node.getElement('.'+this.handler_right_wrapper_class);
		
		if (handler_right_wrapper_node)
		{
			var handler_right_node = handler_right_wrapper_node.getElement('a');
			
			if (handler_right_node)
			{
				handler_right_node.removeEvents();
				handler_right_node.addEvent('click', function()
				{
					// activate
					_this.activateImage(_this.active_thumbnail_index + 1);
					
					// slide
					_this.slide(2);
					
					return false;
				});
			}
		}
	},
	
	/**
	 * set thumbnail events
	 * @return	void
	 */
	setThumbnailEvents: function()
	{
		// set vars
		var _this = this;
		
		var thumbnails_wrapper_node = this.root_node.getElement('.'+this.thumbnails_wrapper_class);
		
		if (thumbnails_wrapper_node)
		{
			var thumbnails_anchor_nodes			= thumbnails_wrapper_node.getElements('a');
			var total_thumbnails_anchor_nodes	= thumbnails_anchor_nodes.length;
			
			if (total_thumbnails_anchor_nodes > 0)
			{
				thumbnails_anchor_nodes.each(function(thumbnails_anchor_node, index)
				{
					thumbnails_anchor_node.removeEvents();
					thumbnails_anchor_node.addEvent('click', function()
					{
						_this.activateImage(index);
						
						return false;
					});
				});
			}
		}
	},
	
	/**
	 * activate image
	 * @param	integer	anchor_node_index
	 * @return	void
	 */
	activateImage: function(anchor_node_index)
	{
		if (anchor_node_index >= 0)
		{
			var thumbnails_wrapper_node = this.root_node.getElement('.'+this.thumbnails_wrapper_class);
			
			if (thumbnails_wrapper_node)
			{
				var thumbnails_anchor_nodes			= thumbnails_wrapper_node.getElements('a');
				var total_thumbnails_anchor_nodes	= thumbnails_anchor_nodes.length;
				
				if (total_thumbnails_anchor_nodes > 0 && anchor_node_index < total_thumbnails_anchor_nodes)
				{
					// disable previous image
					thumbnails_anchor_nodes[this.active_thumbnail_index].set('class', '');
					
					// enable current image
					thumbnails_anchor_nodes[anchor_node_index].set('class', this.active_class);
					
					// set active index
					this.active_thumbnail_index = anchor_node_index;
					
					// set image
					var current_thumbnail_node = thumbnails_anchor_nodes[anchor_node_index].getElement('img');
					
					if (current_thumbnail_node)
					{
						var current_thumbnail_src = current_thumbnail_node.get('src');
						
						var image_wrapper_node = this.root_node.getElement('.'+this.image_wrapper_class);
						
						if (image_wrapper_node)
						{
							var image_node = image_wrapper_node.getElement('img');
							
							if (image_node)
							{
								// get dimensions of thumbnail
								var current_thumbnail_width		= !current_thumbnail_node.getStyle('width').toInt() ? 0 : current_thumbnail_node.getStyle('width').toInt();
								var current_thumbnail_height	= !current_thumbnail_node.getStyle('height').toInt() ? 0 : current_thumbnail_node.getStyle('height').toInt();
								
								// get dimensions of image
								var image_width		= !image_node.getStyle('width').toInt() ? 0 : image_node.getStyle('width').toInt();
								var image_height	= !image_node.getStyle('height').toInt() ? 0 : image_node.getStyle('height').toInt();
								
								// replace src (thumbnail.php)
								if (current_thumbnail_width > 0 && current_thumbnail_height > 0 && image_width > 0 && image_height > 0)
								{
									current_thumbnail_src = current_thumbnail_src.replace('w='+current_thumbnail_width, 'w='+image_width);
									current_thumbnail_src = current_thumbnail_src.replace('h='+current_thumbnail_height, 'h='+image_height);
								}
								
								image_node.set('src', current_thumbnail_src);
							}
						}
					}
				}
			}
		}
	},
	
	/**
	 * execute slide
	 * @param	integer	index
	 * @param	integer	direction
	 * @return	void
	 */
	slide: function(direction)
	{
		// set vars
		var _this = this;
		
		if (direction > 0)
		{
			// show filter
			var filter_node = this.root_node.getElement('.'+this.filter_class);
			if (filter_node) filter_node.setStyle('display', 'block');
			
			var thumbnails_wrapper_node = this.root_node.getElement('.'+this.thumbnails_wrapper_class);
			
			if (thumbnails_wrapper_node)
			{
				var thumbnails_node	= thumbnails_wrapper_node.getElement('.'+this.thumbnails_class);
				
				if (thumbnails_node)
				{
					// get position
					var thumbnails_left_old	= !thumbnails_node.getStyle('left').toInt() ? 0 : thumbnails_node.getStyle('left').toInt();
					
					// slide left
					if (direction == 1)
					{
						var thumbnails_left_new	= (thumbnails_left_old + this.thumbnail_td_width).toInt();
					}
					
					// slide right
					else
					{
						var thumbnails_left_new	= (thumbnails_left_old - this.thumbnail_td_width).toInt();
					}
					
					if (thumbnails_left_new <= 0 && thumbnails_left_new >= -this.thumbnails_width + this.thumbnails_wrapper_width)
					{
						// start effect
						var slide_effect = new Fx.Morph(thumbnails_node, {duration: this.slide_duration, transition: Fx.Transitions.Quad.easeOut});
				 
						slide_effect.start({
						    'left': [thumbnails_left_old, thumbnails_left_new]
						}).chain(function()
						{
							// hide filter
							if (filter_node) filter_node.setStyle('display', 'none');
						});
					}
					else
					{
						// hide filter
						if (filter_node) filter_node.setStyle('display', 'none');
					}
				}
			}
		}
	}
	
});