(function($) {
	$.extend ($.easing,
	{
		w2dDesignCarousel: function (x, t, b, c, d) {
			if ((t/=d/2) < 1) return c/2*t*t*t + b;
			return c/2*((t-=2)*t*t + 2) + b;
		}
	});

	$.fn.w2dCarousel = function(settings) {
		var config = {	'spinspeed': 600,
						'fadespeed': 300,
						'tagopacity': 0.8,
						'autospindelay': 8000,
						'startitem': 1
		};
					
		if (settings) $.extend(config, settings);
	
		return this.each(function() {
			var carouselPos = new Array(
				{'top': '90px', 'left': '0px', 'width': '240px', 'height': '120px', 'opacity':0} ,
				{'top': '60px', 'left': '50px', 'width': '320px', 'height': '160px', 'opacity':0.8} ,
				{'top': '0', 'left': '235px', 'width': '480px', 'height': '240px', 'opacity':1} ,
				{'top': '60px', 'left': '580px', 'width': '320px', 'height': '160px', 'opacity':0.8} ,
				{'top': '90px', 'left': '710px', 'width': '240px', 'height': '120px', 'opacity':0} 
			);
			var carouselZ = new Array(1,2,3,2,1);	
			var carouselD = new Array('none','block','block','block','none');
				
			var carouselOffset=0;
			var carouselCount=0;
			var carouselStart=0;
			var carouselAuto;
			var carouselChildren=$(this).children("a");
			
			carouselCount=carouselChildren.length;
			switch (carouselCount) {
			case 1:
			case 2:
				carouselStart=2;
				break;
			case 3:
			case 4:
				carouselStart=1;
				break;
			}		
			
			carouselOffset=config.startitem-3+carouselStart;
			
			carouselChildren.each(function(i) 
			{
				j=carouselTrim(i-carouselOffset+carouselStart);
				if (j>carouselPos.length-1) j=carouselPos.length-1;
				$(this).css(carouselPos[j]).css('zIndex',carouselZ[j]).css('display',carouselD[j]).click(carouselClick);
				if (j==2) $(this).css(carouselPos[j]).find('span').show();
			});
			
			if (carouselCount>=carouselPos.length) {
				carouselAuto = window.setInterval(function() {
					carouselOffset++;
					carouselSpin();
				}, config.autospindelay);
			}
				
			function carouselClick() {
				window.clearInterval(carouselAuto);
				switch ($(this).css("left")) {
				case carouselPos[1]['left']:
					carouselOffset-=1;
					carouselSpin();
					return false;
				case carouselPos[3]['left']:
					carouselOffset+=1;
					carouselSpin();
					return false;
				case carouselPos[2]['left']:
					return true;
				default:
					return false;
				}
			}
			
			function carouselTrim(value) {
				var i=value;
				if (carouselCount >=carouselPos.length) {
					while (i>=carouselCount) i-=carouselCount;
					while (i<0) i+=carouselCount;
				}
				return i;
			}
			
			function setCarouselZ() {
				for (i=0;i<5;i++) {
					j = carouselTrim(carouselOffset+i-carouselStart);
					if (j>=0 && j<carouselCount) carouselChildren.eq(j).css('zIndex',carouselZ[i]);
				}
			}

			function setCarouselD() {
				for (i=0;i<carouselPos.length;i++) {
					j = carouselTrim(carouselOffset+i-carouselStart);
					if (j>=0 && j<carouselCount) {
						carouselChildren.eq(j).css('display',carouselD[i]);
						if (i==2) carouselChildren.eq(j).find('span').fadeIn(config.fadeSpeed);
					}
				}
			}
			
			function carouselSpin() {
				carouselChildren.find('span').hide();
				for (i=0;i<5;i++) {
					j = carouselTrim(carouselOffset+i-carouselStart);
					if (j>=0 && j<carouselCount) {
						$("#carouselcontainer a").eq(j).animate(carouselPos[i],{duration:config.spinspeed, easing:"w2dDesignCarousel", complete:setCarouselD});
					}
				}
				window.setTimeout(setCarouselZ, config.spinspeed/2);
			};
		});
	};
})(jQuery);

