(function($){
	$.jqContentSlider = function(el, options, objectID)
	{
		var base = this;
		//Context Element
		base.contextEl = $(el); 
		base.contextEl.data('objectID', objectID);
		
		function setEvents()
		{
			//Configurar o evento click para o elemento que retrocede o slide
			if(base.options.prev != '')
			{
				$(base.options.prev).click(function(){
					if(base.options.autoSlide)
					{
						base.clearAutoSlide();
					}

					prevSlide();
				});
			};
			
			//Configurar o evento click para o elemento que avança o slide
			if(base.options.next != ''){
				$(base.options.next).click(function(){
					if(base.options.autoSlide)
					{
						base.clearAutoSlide();
					}

					nextSlide();
				});
			};
			
			//Configurar o autoslide
			if(base.options.autoSlide)
			{
				base.autoSlide();
			};
		};
		
		function configAutoSlideElement()
		{
			if(base.options.autoSlideElement != '')
			{
				var i=-1;
				$(base.options.autoSlideElement).bind({
					mouseenter : function(){
						++i;
						//Efectuar logo uma mudança
						if(i == 0)
						{
							if(base.options.autoSlideDirection == 'prev')
							{
								prevSlide();
							}
							else if(base.options.autoSlideDirection == 'next')
							{
								nextSlide();
							}
						}
						
						base.autoSlide();
					},
					
					mouseleave : function(){
						i=-1;
						base.clearAutoSlide();
					}
				});
			};
		};
		
		function buildNavigation()
		{
			if(base.options.slideNavigation && base.options.slideNavigationElement !='')
			{
				//Criar elementos da paginação
				if(base.options.buildNavigation)
				{
					base.childs.each(function(i){
						var elemClass = '';
						
						if(i == (base.options.startSlide - 1))
						{
							elemClass = 'active';
						}
	
						var objAttrLink = {
							'class' : elemClass,
							'href' : '#',
							'rel' : i
						};
						
						$(base.options.slideNavigationElement).append($(document.createElement('li')).append($(document.createElement('a')).attr(objAttrLink).text(i+1)));
					});
					
					//Calcular width do elemento
					if(base.options.setNavigationElementWidth)
					{
						var ulChilds = $(base.options.slideNavigationElement).children().length,
						childWidth = $(base.options.slideNavigationElement + ' li:last').outerWidth(true);
						
						$(base.options.slideNavigationElement).width(parseInt((ulChilds * childWidth), 10));
					}
				}
				else
				{
					$(base.options.slideNavigationElement + ' li:eq(' + (base.options.startSlide - 1) + ') a').attr('class', 'active');
				}

				//Adicionar evento aos elementos previamente criados
				$(base.options.slideNavigationElement + ' li a').click(function(ev){
					ev.preventDefault();
					
					base.clearAutoSlide();
					
					var that = $(this);
					
					if(base.options.msiedetection && $.browser.msie)
					{
						$(base.childs[base.currentSlide - 1]).hide();
					}
					else
					{
						$(base.childs[base.currentSlide - 1]).fadeOut('fast', 'linear');
					}
					
					$(base.childs[base.currentSlide - 1]).css('z-index', '0');
					
					$(base.options.slideNavigationElement + ' li a.active').removeClass('active');
					
					base.currentSlide = parseInt(that.attr('rel'), 10) + 1;
					
					if(base.options.msiedetection && $.browser.msie)
					{
						$(base.childs[base.currentSlide - 1]).show();
					}
					else
					{
						$(base.childs[base.currentSlide - 1]).fadeIn(base.options.animSpeed, 'linear');
					}
					
					$(base.childs[base.currentSlide - 1]).css('z-index', '10');
					
					that.addClass('active');
					
					//Configurar o autoslide
					if(base.options.autoSlide && !base.options.stopAutoSlideWhenClick){
						base.autoSlide();
					}
				});
			};
		};
		
		function prevSlide()
		{
			if(base.currentSlide == 1)
			{
				base.currentSlide = base.totChilds;
				
				if(base.options.msiedetection && $.browser.msie)
				{
					$(base.childs[0]).hide();
					$(base.childs[base.currentSlide - 1]).show();
				}
				else
				{
					$(base.childs[0]).stop().fadeOut('fast', 'linear');
					$(base.childs[base.currentSlide - 1]).stop().fadeIn(base.options.animSpeed, 'linear');
				}
				
				//Seleccionar elemento de navegação
				if(base.options.slideNavigation && base.options.slideNavigationElement !='')
				{
					slideNavigationCurrent(base.currentSlide - 1);
				}
			}
			else
			{
				if(base.options.msiedetection && $.browser.msie)
				{
					$(base.childs[base.currentSlide - 1]).hide();
					$(base.childs[base.currentSlide - 2]).show();
				}
				else
				{
					$(base.childs[base.currentSlide - 1]).stop().fadeOut('fast', 'linear');
					$(base.childs[base.currentSlide - 2]).stop().fadeIn(base.options.animSpeed, 'linear');
				}
				
				//Seleccionar elemento de navegação
				if(base.options.slideNavigation && base.options.slideNavigationElement !='')
				{
					slideNavigationCurrent(base.currentSlide - 2);
				}

				base.currentSlide--;
			}
		};
	
		function nextSlide()
		{
			if(base.currentSlide == base.totChilds)
			{
				base.currentSlide = 1;
				
				if(base.options.msiedetection && $.browser.msie){
					$(base.childs[base.totChilds - 1]).hide();
					$(base.childs[base.currentSlide - 1]).show();
				}
				else{
					$(base.childs[base.totChilds - 1]).stop().fadeOut('fast', 'linear');
					$(base.childs[base.currentSlide - 1]).stop().fadeIn(base.options.animSpeed, 'linear');
				}
					
				//Seleccionar elemento de navegação
				if(base.options.slideNavigation && base.options.slideNavigationElement !=''){
					slideNavigationCurrent(base.currentSlide - 1);
				}
			}
			else
			{
				if(base.options.msiedetection && $.browser.msie)
				{
					$(base.childs[base.currentSlide - 1]).hide();
					$(base.childs[base.currentSlide]).show();
				}
				else
				{
					$(base.childs[base.currentSlide - 1]).stop().fadeOut('fast', 'linear');
					$(base.childs[base.currentSlide]).stop().fadeIn(base.options.animSpeed, 'linear');
				}
				
				//Seleccionar elemento de navegação
				if(base.options.slideNavigation && base.options.slideNavigationElement !=''){
					slideNavigationCurrent(base.currentSlide);
				}
				
				base.currentSlide++;
			}
		};
			
		//Função de autoslide
		base.autoSlide = function()
		{
			if(base.options.autoSlideDirection == 'prev'){
				base.autoRun = setInterval(function (){ prevSlide()}, base.options.autoSlideInterval);
			}
			else if(base.options.autoSlideDirection == 'next'){
				base.autoRun = setInterval(function (){ nextSlide()}, base.options.autoSlideInterval);
			}
		};
		
		base.clearAutoSlide = function () 
		{
			clearInterval(base.autoRun);
		}
		
		function slideNavigationCurrent(toCompare)
		{
			$(base.options.slideNavigationElement + ' li a.active').removeClass('active');
			
			$(base.options.slideNavigationElement + ' li a').filter(function(i){
				return (parseInt($(this).attr('rel'), 10) == (toCompare)) ? true : false;
			}).addClass('active');
		};
		
		function init()
		{
			base.options = $.extend($.jqContentSlider.defaultOptions, options);
			
			base.childs = base.contextEl.children().hide();
			$(base.childs[base.options.startSlide - 1]).show();
			
			base.currentSlide = base.options.startSlide;
			base.totChilds = base.childs.length;
			
			setEvents();
			buildNavigation();
			configAutoSlideElement();
		}
		
		init();
	};
	
	//Holds currently ID
	$.jqContentSlider.ObjectID = -1;
	//Array of objects
	$.jqContentSlider.Objects = [];
	
	$.jqContentSlider.defaultOptions = {
		animSpeed : 600,
		prev : '',
		next : '',
		autoSlide : false,
		autoSlideInterval : 1000,
		autoSlideElement : '',
		autoSlideDirection : 'next',
		slideNavigation : false,
		slideNavigationElement : '',
		buildNavigation : true,
		setNavigationElementWidth : true,
		stopAutoSlideWhenClick : false,
		startSlide : 1,
		msiedetection : true
	};
	
	$.fn.jqContentSlider = function(options)
	{
		return this.each(function(){
			if(typeof(options) == 'string') {
				switch (options) {
					case 'stopAutoSlide':
						$.jqContentSlider.Objects[$(this).data('objectID')].clearAutoSlide();
						break;
					case 'startAutoSlide':
						$.jqContentSlider.Objects[$(this).data('objectID')].autoSlide();
						break;
				}
			} else {
				$.jqContentSlider.ObjectID++;
				$.jqContentSlider.Objects[$.jqContentSlider.ObjectID] = new $.jqContentSlider(this, options, $.jqContentSlider.ObjectID);
			}
		});
	};
})(jQuery);
