/**
 * class	CS_NodeTicker
 * author	Paul Kruijt / Rakesh Sieuw
 */
var CS_NodeTicker = new Class({
	
	/**
	 * initialize
	 * @param	string	ticker_node_id
	 * @param	array	arr_items
	 * @param	integer	effect_type
	 * @param	integer	effect_duration
	 * @param	integer	effect_delay
	 * @return	void
	 */
	initialize: function(ticker_node_id, arr_items, effect_type, effect_duration, effect_delay)
	{
		// vars
		this.arr_items		= arr_items;
		this.last_item		= 0;
		this.ticker_node_id	= ticker_node_id;
		
		// secure integers
		var effect_type		= parseInt(effect_type);
		var effect_duration	= parseInt(effect_duration);
		var effect_delay	= parseInt(effect_delay);
		
		// settings
		this.effect_type		= effect_type > 0 ? effect_type : 1;
		this.effect_duration	= effect_duration > 0 ? effect_duration : 1000;
		this.effect_delay		= effect_delay > 0 ? effect_delay : 5000;
	},
	
	/**
	 * start
	 * @return void
	 */
	start: function()
	{
		if (this.arr_items.length > 0)
		{
			// set object as var
			var _this = this;
			
			// get random item
			/*
			var current_item	= this.arr_items.getRandom();
			
			if (current_item == this.last_item)
			{
				this.start();
				return;
			}
			
			// set last item
			this.last_item = current_item;
			*/
			
			// set item to first
			if (this.last_item > (this.arr_items.length - 1)) this.last_item = 0;
			
			// get item
			var current_item = this.arr_items[this.last_item];
			
			// set html and opacity to 0
			var ticker_node	= $(this.ticker_node_id).getElement('div');
			
			if (ticker_node)
			{
				// get effect type
				switch(this.effect_type)
				{
					//**************
					// fade in/out *
					//**************
					case 1:
						
						ticker_node.setStyle('opacity', 0);
						ticker_node.innerHTML = current_item;
						
						// start effect
						var ticker_effect = new Fx.Morph(ticker_node, {duration: this.effect_duration,	transition: Fx.Transitions.Quad.easeOut});
						
						ticker_effect.start({
							   'opacity': 1
						}).chain(function(){
								
							// executes x seconds after completion of above effect
							if (_this.arr_items.length > 1)
							{
								this.start.delay(_this.effect_delay, this, {
									'opacity': 0
								});
							}
							
						}).chain(function(){
							
							// next item
							_this.last_item++;
							
							// re-init start method
							if (_this.arr_items.length > 1)
							{
								_this.start();
							}
						});
						
					break;
					
					//***********************
					// scroll right to left *
					//***********************
					case 2:
					
						// create outer table
						var table_outer_node	= new Element('table');
						
						table_outer_node.inject(ticker_node);
						
						var tbody_outer_node	= new Element('tbody');
						
						tbody_outer_node.inject(table_outer_node);
						
						var tr_outer_node	= new Element('tr');
						
						tr_outer_node.inject(tbody_outer_node);
						
						var td_outer_node	= new Element('td');
						
						td_outer_node.inject(tr_outer_node);
						
						// create inner table
						var table_inner_node	= new Element('table');
						
						table_inner_node.inject(td_outer_node);
						
						var tbody_inner_node	= new Element('tbody');
						
						tbody_inner_node.inject(table_inner_node);
						
						var tr_inner_node	= new Element('tr');
						
						tr_inner_node.inject(tbody_inner_node);
						
						arr_items.each(function(item, index)
						{
							var td_inner_node	= new Element('td');
							
							td_inner_node.inject(tr_inner_node);
							td_inner_node.set('html', item);
						});
						
						var ticker_coordinates	= $(this.ticker_node_id).getCoordinates();
						var ticker_width		= ticker_coordinates.width.toInt();
						
						var table_inner_coordinates	= table_inner_node.getCoordinates();
						var table_inner_width		= table_inner_coordinates.width.toInt();
						
						// set inner node same width as parent
						if (ticker_width > table_inner_width) table_inner_node.setStyle('width', ticker_width+'px');
						
						// copy inner node for scrolling
						var td_cloned_node = td_outer_node.clone().injectAfter(td_outer_node);
						
						// start scroll (after timeout)
						var newTimer = setTimeout(
							function ()
							{
								_this.scroll(ticker_node, table_inner_width, ticker_width);
							}
							, _this.effect_delay
						);
						
					break;
				}
			}
		}
	},
	
	/**
	 * start
	 * @param	node	ticker_node
	 * @param	integer	table_inner_width
	 * @param	integer	ticker_width
	 * @return	void
	 */
	scroll: function(ticker_node, table_inner_width, ticker_width)
	{
		var _this = this;
		
		// adjust speed duration based on width of table with items
		var effect_duration	= (table_inner_width / ticker_width) * this.effect_duration;
		effect_duration		= effect_duration.ceil();
		
		// get start margin
		var margin_start	= ticker_node.getStyle('margin-left').toInt > 0 ? ticker_node.getStyle('margin-left').toInt : 0;
		var margin_end		= -(table_inner_width);
		
		// start scroll
		var scroll_effect = new Fx.Morph(ticker_node, {duration: effect_duration, transition: Fx.Transitions.linear});
 		
		scroll_effect.start(
		{
		    'margin-left': [margin_start, margin_end]
		    
		}).chain(function()
		{
			// move node to start position
			ticker_node.setStyle('margin-left', 0);
			
			// start scroll again (recursive)
			_this.scroll(ticker_node, table_inner_width, ticker_width);
		});
	}
	
});
