jQuery.fn.recologyCarousel = function(options)
{
	return this.each(function()
	{
		//Import passed settings.
		var settings = jQuery.extend(
		{
			start: 0,
			delay: 7000,
			delay_mouseout: 3000,
			fade_delay: 500
		}, options);
		jQuery(this).data("settings", settings);

		//Generate random ID if none exists.
		if(!jQuery(this).attr("id"))
		{
			jQuery(this).attr("id", jQuery.UUID());
		}

		//Ensure that the positioning of carousel is not static.
		if(jQuery(this).css("position") === "static")
		{
			jQuery(this).css("position", "relative");
		}

		//Initialize items.
	    jQuery(this).children("div").each(function()
	    {
			jQuery(this).addClass("item");
			jQuery(this).css("position", "absolute");
			jQuery(this).css("top", "0px");
			jQuery(this).css("left", "0px");
	    	jQuery(this).width(jQuery(this).parent().innerWidth());
	    	jQuery(this).height(jQuery(this).parent().innerHeight());
	    	jQuery(this).hide();
	    }); 

		//Create carousel anchor & navigation objects. Anchor must come first!
		jQuery.fn.recologyCarousel.createAnchor(jQuery(this));
		jQuery.fn.recologyCarousel.createNavigation(jQuery(this));

		//Set the current carousel index.
		if(settings.start == "random")
		{
			settings.start = Math.floor(Math.random() * jQuery(this).children("div.item").length);
		}
		jQuery.fn.recologyCarousel.setIndex(jQuery(this), settings.start);

		//start the carousel timer.
		jQuery.fn.recologyCarousel.startTimer(jQuery(this));
		jQuery(this).data("timer_enabled", true);

		//Disable, enable transition delay time on hover.
		jQuery(this).hover(function()
		{
			jQuery.fn.recologyCarousel.stopTimer(jQuery(this));
			jQuery(this).data("timer_enabled", false);
		}, function()
		{
			jQuery.fn.recologyCarousel.startTimer(jQuery(this), settings.delay_mouseout);
			jQuery(this).data("timer_enabled", true);
		});		
	});
};  

jQuery.fn.recologyCarousel.createAnchor = function(carousel)
{
	carousel.append("<div class=\"anchor\"></div>");

	return carousel;
};

jQuery.fn.recologyCarousel.createNavigation = function(carousel)
{
	var i;
	var item;

	var nav = jQuery("<div class=\"navigation\"></div>");

	var count = carousel.children("div.item").length;
	for(i = 0; i < count; i++)
	{
		item = jQuery("<div class=\"item index_"+i+"\">"+(i+1)+"</div>");

		item.data("parent_id", carousel.attr("id"));
		item.data("index_id", i);
		item.click(function()
		{
			jQuery.fn.recologyCarousel.setIndex(jQuery("#"+jQuery(this).data("parent_id")), jQuery(this).data("index_id"));
		});

		nav.append(item);
	}

	carousel.append(nav);

	return carousel;
};

jQuery.fn.recologyCarousel.setIndex = function(carousel, index)
{
	//Save old index for transition.
	var index_old = carousel.data("current");

	//Only continue if we are actually changing to a new item.
	if(index_old != index)
	{
		//Set new carousel index.
		carousel.data("current", index);

		//Clear all anchor children.
		carousel.children("div.anchor").empty();

		//Remove the current class from all carousel items.
		carousel.children("div.item").removeClass("current");

		//Set the current carousel item.
		carousel.children("div.item:eq("+index+")").addClass("current");

		//Display current carousel item.
		carousel.children("div.anchor").append(carousel.children("div.item:eq("+index+")").clone().show());

		//Display previous carousel item.
		if(index_old !== undefined)
		{
			carousel.children("div.anchor").append(carousel.children("div.item:eq("+index_old+")").clone().show());
		}

		//Remove the current class from all navigation items.
		carousel.children("div.navigation").children("div").removeClass("current");

		//Set the current navigation item.
		carousel.children("div.navigation").children("div:eq("+index+")").addClass("current");

		//Perform a fade transition if the previous page exists.
		if(index_old !== undefined)
		{
			carousel.children("div.anchor").children("div.item:eq(1)").fadeTo(carousel.data("settings").fade_delay, 0, function()
			{
				jQuery(this).hide();
			});
		}

		//Restart the transition timer if timers are enabled.
		if(carousel.data("timer_enabled") === true)
		{
			jQuery.fn.recologyCarousel.startTimer(carousel);
		}
	}

	return carousel;
}

jQuery.fn.recologyCarousel.stopTimer = function(carousel)
{
	carousel.stopTime("change");

	return carousel;
}

jQuery.fn.recologyCarousel.startTimer = function(carousel, delay)
{
	//Get default from settings.
	if(!delay)
	{
		delay = carousel.data("settings").delay;
	}

	//Stop existing timer if it exists.
	jQuery.fn.recologyCarousel.stopTimer(carousel);

	//Start new timer.
	carousel.oneTime(delay, "change", function()
	{
		jQuery.fn.recologyCarousel.nextIndex(jQuery(this));
	});

	return carousel;
}

jQuery.fn.recologyCarousel.nextIndex = function(carousel)
{
	var current = carousel.data("current");
	if(++current >= carousel.children("div.item").length)
	{
		current = 0;
	}

	jQuery.fn.recologyCarousel.setIndex(carousel, current);

	return carousel;
}

