(function($){
	$.fn.ticker = function(options)
	{
		return this.each(function()
		{
			$.ticker(this,options);
		});
	};
	
	$.ticker = function(container,options)
	{
		$.ticker.defaults = {
			'animationtype':'fade',
			'speed':'normal',
			'type':'sequence',
			'timeout':2000,
			'containerheight':'auto',
			'runningclass':'runningticker',
			'children':null			
		};
		
		
		if(options)
			$.extend($.ticker.defaults,options);
		if($.ticker.defaults.children === null)
		{
			$.ticker.elements = $(container).children();
		}else
		{
			$.ticker.elements = $(container).children($.ticker.defaults.children);
		}
		$.ticker.current = null;
		$.ticker.next = null;
		
		if($.ticker.elements.length > 1) // ONLY START ROTATOR IF THERE ARE MORE THAN ONE ELEMENT
		{
			//SET THE CONTAINER POSITION TO RELATIVE, HEIGHT TO CONTAINER HEIGHT AND ADD RUNNING CLASS
			$(container).css('position','relative').css('height',$.ticker.defaults.containerheight).addClass($.ticker.defaults.runningclass);
			//SET ALL ELEMENTS Z-INDEX, POSITIONING AND HIDE THEM
			for(var i = 0; i < $.ticker.elements.length; i++)
			{
				$($.ticker.elements[i]).css('position','absolute').css('z-index',String($.ticker.elements.length - i)).hide();
			}
			
			switch($.ticker.defaults.type) // SETS UP START VALUES FOR THE ELEMENTS
			{
				case 'sequence':
					$.ticker.current = 0;
					$.ticker.next = 1;
					break;
				case 'random':
					$.ticker.next = Math.floor ( Math.random () * ( $.ticker.elements.length ) );
					do
					{
						$.ticker.current =  Math.floor ( Math.random ( ) * ( $.ticker.elements.length ) );
					}while($.ticker.current == $.ticker.next);
					break;
				case 'random_start':
					$.ticker.defaults.type = 'sequence';
					$.ticker.current =  Math.floor ( Math.random ( ) * ( $.ticker.elements.length ) );
					if(($.ticker.current + 1) < $.ticker.elements.length)
					{
						$.ticker.next = $.ticker.current + 1;
					}else
					{
						$.ticker.next = 0;
					}
					break;
				case 'reverse':
					$.ticker.current = $.ticker.elements.length - 1;
					$.ticker.next = $.ticker.current - 1;
					break;
				default:
					alert('Ticker-type must be \'sequence\' \'random\' \'random_start\' or \'reverse \'');
					return;
					break;
			}
			
			$($.ticker.elements[$.ticker.current]).show(); //SHOW THE FIRST ITEM
			$.tick(); // START THE INTERVAL
			
			$(container).hover(
			function() //OVER HANDLER
			{
				clearInterval($.ticker.interval);
			},
			function() //OUT HANDLER
			{
				$.tick();
			});
		}
	};
	
	$.tick = function()
	{
		$.ticker.interval = setInterval(
			function()
			{
				$.doTick();
				$.setNext();
			},$.ticker.defaults.timeout
		);
	};
	
	$.doTick = function()
	{
		switch($.ticker.defaults.animationtype)
		{
			case 'slide':
				$($.ticker.elements[$.ticker.current]).slideUp($.ticker.defaults.speed);
				$($.ticker.elements[$.ticker.next]).slideDown($.ticker.defaults.speed);
				break;
			case 'fade':
				$($.ticker.elements[$.ticker.current]).fadeOut($.ticker.defaults.speed);
           		$($.ticker.elements[$.ticker.next]).fadeIn($.ticker.defaults.speed, function() { removeFilter($(this)[0]); });
				break;
			default:
				alert('Ticker-animationtype must either be \'slide\' or \'fade\'');
				break;	
		}
	};
	
	$.setNext = function()
	{
		switch($.ticker.defaults.type) // SETS UP START VALUES FOR THE ELEMENTS
			{
				case 'sequence':
					
					if (($.ticker.next + 1) < $.ticker.elements.length) 
					{
						$.ticker.next = $.ticker.next + 1;
						$.ticker.current = $.ticker.next - 1;
					} else 
					{
						$.ticker.next = 0;
						$.ticker.current = $.ticker.elements.length - 1;
					}
					break;
				case 'random':
					$.ticker.current = $.ticker.next;
					do
					{
						$.ticker.next =  Math.floor ( Math.random ( ) * ( $.ticker.elements.length ) );
					}while($.ticker.next == $.ticker.current);
					break;
				case 'reverse':
					$.ticker.current = $.ticker.next;
					
					if($.ticker.next - 1 >= 0)
					{
						$.ticker.next = $.ticker.next - 1;	
					}else
					{
						$.ticker.next = $.ticker.elements.length - 1;
					}
					break;
				default:
					alert('Ticker-type must be\'sequence\' \'random\' \'random_start\' or \'reverse \'');
					break;
			}
	};
})(jQuery);

function removeFilter(element) {
	if(element.style.removeAttribute){
		element.style.removeAttribute('filter');
	}
}
