/*
 * jQuery JavaScript Plugin jquery.simpleCarousel 0.9.0
 * http://bugsoftware.co.uk/jQuery/
 *
 * Copyright (c) 2010 Ritchie Comley
 * Dual licensed under the MIT and GPL licenses.
 *
 * Date: 2010-08-02 (Tue, 02 August 2010)
 * Revision: 0
 *
 * Dependencies:
 * jQuery 1.4.1 (jquery.com)
 * 
 */
 
jQuery.fn.simpleCarousel = function(options) {

	// PRIVATE VARIABLES		
	var defaults = {
			interval:50,             // interval between animation frames
			vertical:false,
			prevImage:'img/prev_sprite.png',
			nextImage:'img/next_sprite.png',
			controlWidth:29,
			controlHeight:37,
			controlAlign:false,
			controlMarginY:5,
			controlMarginX:10,
			easing:'swing',
			duration:250,
			discriptionAlign:'bottom',
			altBG: 'white',
			altColor: 'black',
			fontSize: 12,
			altBGOpacity: 0.7
		};
		
	var opts = jQuery.extend(defaults, options);
	
	return this.each(function()
	{
		var jWrapper = jQuery(this);
		var jList = jWrapper.find(">ul");
		var jListItems = jList.find(">li");
		var jListImages = jListItems.find("img");
		var noImages = jList.size();
		var boxHeight = jWrapper.height();
		var boxWidth = jWrapper.width();
		
		if(!jListItems.size())
		{
			return;
		}
		
		jList.wrap('<div></div>');
		jList.wrap('<div></div>');
		
		var jRelWrapper = jList.parent();
		var jInnerWrapper = jRelWrapper.parent();

		jWrapper.css({overflow:'hidden', position:'relative'});
		jList.add(jListItems).css({'list-style': 'none', padding:0, margin:0});
		jListItems.css({height:jWrapper.height(),width:jWrapper.width()});
		jListImages.css({padding:0, margin:0, position:'absolute'});
		jListImages.wrap('<div style="float:left; width:' + boxWidth + 'px; height:' + boxHeight + 
			'px;"><div style="position:absolute; width:' + boxWidth + 'px; height:' + boxHeight + 'px;"></div></div>');
		
		jInnerWrapper.css({position:'absolute'});
		
		jListItems.each(function()
		{
			jListItem = jQuery(this);
			var jListImage = jListItem.find('img');
			
			var altText = jListImage.attr('alt');
			
			if(altText)
			{
				var jAltDivBG = jQuery('<div></div>').appendTo(jListImage.parent());
				var jAltDiv = jQuery('<div>' + altText + '</div>').appendTo(jListImage.parent());
				jAltDiv.css({position:'absolute', padding:3, color:opts.altColor, width:boxWidth, 'font-size': opts.fontSize});
				jAltDivBG.css({position:'absolute', background:opts.altBG, width:boxWidth, opacity:opts.altBGOpacity});
				
				if(opts.discriptionAlign == 'bottom')
				{
					jAltDiv.css({top:(boxHeight - jAltDiv.outerHeight())});
					jAltDivBG.css({top:(boxHeight - jAltDiv.outerHeight()), height:jAltDiv.outerHeight()});
				}
			}
		});

		if(jListItems.size() > 1)
		{
		
			var jPrev = jQuery('<a href="#">prev</a>').insertAfter(jInnerWrapper);
			var jNext = jQuery('<a href="#">next</a>').insertAfter(jInnerWrapper);
			
			var controlCSS = {position:'absolute', width:opts.controlWidth, height:opts.controlHeight, 
				display:'block', overflow:'hidden', 'text-indent':'-9999em', outline: 'none', margin:opts.controlMarginY + 'px ' + opts.controlMarginX + 'px', top:0, left:0};

			var nextOrigCSS = jQuery.extend({}, controlCSS);
			var prevOrigCSS = jQuery.extend({}, controlCSS);
			
			prevOrigCSS.background = 'url(' + opts.prevImage + ')';
			nextOrigCSS.background = 'url(' + opts.nextImage + ')';

			if(!opts.controlAlign)
			{
				if(opts.vertical)
				{
					opts.controlAlign = 'vertical-centered';
				}
				else
				{
					opts.controlAlign = 'horizontal-centered';
				}
			}
			
			switch(opts.controlAlign)
			{
				case 'left':

					nextOrigCSS.top = jWrapper.height() - opts.controlHeight - (2 * opts.controlMarginY);
				break;
				
				case 'left-centered':
				
					prevOrigCSS.top = (jWrapper.height() / 2) - opts.controlHeight - (2 * opts.controlMarginY);
					nextOrigCSS.top = (jWrapper.height() / 2);
				break;
				
				case 'right':
				
					prevOrigCSS.left = jWrapper.width() - opts.controlWidth - (2 * opts.controlMarginX);
					nextOrigCSS.top = jWrapper.height() - opts.controlHeight - (2 * opts.controlMarginY);
					nextOrigCSS.left = prevOrigCSS.left;
				break;
				
				case 'right-centered':
				
					prevOrigCSS.top = (jWrapper.height() / 2) - opts.controlHeight - (2 * opts.controlMarginY);
					prevOrigCSS.left = jWrapper.width() - opts.controlWidth - (2 * opts.controlMarginX);
					nextOrigCSS.top = (jWrapper.height() / 2);
					nextOrigCSS.left = prevOrigCSS.left;
				break;
				
				case 'top':

					nextOrigCSS.left = jWrapper.width() - opts.controlWidth - (2 * opts.controlMarginX);
				break;
				
				case 'top-centered':

					prevOrigCSS.left = jWrapper.width() / 2 - opts.controlWidth - (2 * opts.controlMarginX);
					nextOrigCSS.left = jWrapper.width() / 2;
				break;
				
				case 'bottom':

					prevOrigCSS.top = jWrapper.height() - opts.controlHeight - (2 * opts.controlMarginY);
					nextOrigCSS.top = prevOrigCSS.top;
					nextOrigCSS.left = jWrapper.width() - opts.controlWidth - (2 * opts.controlMarginX);
				break;
				
				case 'bottom-centered':

					prevOrigCSS.top = jWrapper.height() - opts.controlHeight - (2 * opts.controlMarginY);
					nextOrigCSS.top = prevOrigCSS.top;
					prevOrigCSS.left = jWrapper.width() / 2 - opts.controlWidth - (2 * opts.controlMarginX);
					nextOrigCSS.left = jWrapper.width() / 2;
				break;
				
				case 'vertical-centered':
				
					prevOrigCSS.left = (jWrapper.width() - opts.controlWidth - (2 * opts.controlMarginX)) / 2;
					nextOrigCSS.top = jWrapper.height() - opts.controlHeight - (2 * opts.controlMarginY);
					nextOrigCSS.left = prevOrigCSS.left;
				break;
				
				case 'horizontal-centered':

					prevOrigCSS.top = (jWrapper.height() - opts.controlHeight - (2 * opts.controlMarginY)) / 2;
					nextOrigCSS.top = prevOrigCSS.top;
					nextOrigCSS.left = jWrapper.width() - opts.controlWidth - (2 * opts.controlMarginX);
				break;
			}

			if(opts.vertical)
			{
				jListImages.add(jListItems).css({'height': jWrapper.height(), margin:'0 auto'});
				
				var prevAnim = {top:0};
				var nextAnim = {top:-jWrapper.height()};
				
				var prevCSS = {top:-jWrapper.height()};
				var nextCSS = {top:0};
			}
			else
			{
				jListImages.add(jListItems).css({'width': jWrapper.width(), margin:'0 auto', float:'left'});
				jInnerWrapper.css({width:'9999em'});
				
				var prevAnim = {left:0};
				var nextAnim = {left:-jWrapper.width()};
				
				var prevCSS = {left:-jWrapper.width()};
				var nextCSS = {left:0};
			}
			
			jPrev.css(prevOrigCSS);
			jNext.css(nextOrigCSS);
			
			var anim = false
			
			jPrev.click(function(evt)
			{
				evt.preventDefault();
				
				if(anim)
				{
					return;
				}
				
				anim = true;
				
				jListItems.filter(':last').prependTo(jList);
				jListItems = jList.children();
				
				jInnerWrapper.css(prevCSS);
				jInnerWrapper.animate(prevAnim, {
					complete:function()
					{	
						anim = false;
					},
					easing:opts.easing,
					duration:opts.duration});
			});

			jNext.click(function(evt)
			{
				evt.preventDefault();
				
				if(anim)
				{
					return;
				}
				
				anim = true;
				
				jInnerWrapper.animate(nextAnim, {
					complete:function()
					{
						jListItems.filter(':first').appendTo(jList);
						jInnerWrapper.css(nextCSS);
						jListItems = jList.children();
						
						anim = false;
					},
					easing:opts.easing,
					duration:opts.duration});
			});
			
			jPrev.add(jNext).mouseover(function(evt)
			{
				jQuery(this).css({'background-position':'0 -' +opts.controlHeight + 'px'});
			});
			
			jPrev.add(jNext).mouseout(function(evt)
			{
				jQuery(this).css({'background-position':'0 0'});
			});
		
		}
		
	});
};
