jQuery.iCarousel = {
	
	build : function(options)
	{
		return this.each(
			function()
			{
				var el = this;
				var increment = 3.5*Math.PI/360;
				var maxRotation = 2*Math.PI;
				el.carouselCfg = {
					items : jQuery(options.items, this),
					itemWidth : options.itemWidth,
					itemHeight : options.itemHeight,
					itemMinWidth : options.itemMinWidth,
					currentItem : 0,
					maxRotation : maxRotation,
					size : jQuery.iUtil.getSize(this),
					position : jQuery.iUtil.getPosition(this),
					start : Math.PI/2,
					rotationSpeed : options.rotationSpeed,
					reflectionSize : options.reflections,
					reflections : [],
					protectRotation : false,
					back : false,
					increment: 3.5*Math.PI/360,
					nextBtn : jQuery('#next'),
					prevBtn : jQuery('#prev')
				};
				el.carouselCfg.radiusX = (el.carouselCfg.size.w - el.carouselCfg.itemWidth)/2;
				el.carouselCfg.radiusY =  (el.carouselCfg.size.h - el.carouselCfg.itemHeight - el.carouselCfg.itemHeight * el.carouselCfg.reflectionSize)/2;
				el.carouselCfg.step = 2*Math.PI/el.carouselCfg.items.size();
				el.carouselCfg.paddingX = el.carouselCfg.size.w/2;
				el.carouselCfg.paddingY = el.carouselCfg.size.h/2 - el.carouselCfg.itemHeight * el.carouselCfg.reflectionSize;
				el.carouselCfg.nextBtn
					.bind(
						'click',
						function(e)
						{
							jQuery.iCarousel.spin(el, false);
							return false;
						}
				);
				el.carouselCfg.prevBtn
					.bind(
						'click',
						function(e)
						{
							jQuery.iCarousel.spin(el, true);
							return false;
						}
				);
				jQuery.iCarousel.positionItems(el);
				el.carouselCfg.speed = el.carouselCfg.increment;
			}
		);
	},

	spin : function(el, back)
	{
		if (el.carouselCfg.rotationTimer) return;
		
		if (back) {
			if (el.carouselCfg.currentItem == (el.carouselCfg.items.length - 1)) {
				el.carouselCfg.currentItem = 0;
			} else {
				el.carouselCfg.currentItem++;
			}
		} else {
			if (el.carouselCfg.currentItem == 0) {
				el.carouselCfg.currentItem = el.carouselCfg.items.length - 1;
			} else {
				el.carouselCfg.currentItem--;
			}
		}
		el.carouselCfg.back = back;
		el.carouselCfg.rotationTimer = window.setInterval(
			function()
			{
				if (el.carouselCfg.back) {
					el.carouselCfg.start -= el.carouselCfg.speed;
					if (el.carouselCfg.start <= 0) {
						el.carouselCfg.start = el.carouselCfg.maxRotation;
					}
				} else {
					el.carouselCfg.start += el.carouselCfg.speed;
					if (el.carouselCfg.start > el.carouselCfg.maxRotation) {
						el.carouselCfg.start = 0;
					}
				}
				jQuery.iCarousel.positionItems(el);
			},
			20
		);
	},

	positionItems : function(el)
	{
		el.carouselCfg.items.each(
			function (nr)
			{
				angle = el.carouselCfg.start+nr*el.carouselCfg.step;
				x = el.carouselCfg.radiusX*Math.cos(angle);
				y = el.carouselCfg.radiusY*Math.sin(angle);
				itemZIndex = parseInt(100*(el.carouselCfg.radiusY+y)/(2*el.carouselCfg.radiusY));
				parte = (el.carouselCfg.radiusY+y)/(2*el.carouselCfg.radiusY);
				
				width = parseInt((el.carouselCfg.itemWidth - el.carouselCfg.itemMinWidth) * parte + el.carouselCfg.itemMinWidth);
				height = parseInt(width * el.carouselCfg.itemHeight / el.carouselCfg.itemWidth);

				left = el.carouselCfg.paddingX + x - width/2;			
				thetop = el.carouselCfg.paddingY + y - height/2;

				$(this).css({
					'top' : thetop, 
					'left' : left,
					'width' : width,
					'height' : height,
					'zIndex' : itemZIndex
				});

				center = (el.carouselCfg.size.w - width) / 2;
				
				if ((el.carouselCfg.items[el.carouselCfg.currentItem] == this) && (left > (center - 3)) && (left < (center + 3))) {
					window.clearInterval(el.carouselCfg.rotationTimer);
					el.carouselCfg.rotationTimer = null;
					if (this.alt == "Purchase your assigned textbook as an eTextbook and save 50%") {
						jQuery('#description').html("<a href=\"http://www.coursesmart.com\">Purchase your assigned textbook</a> as an eTextbook and save 50%");
					} else {
						jQuery('#description').text(this.alt);
					}
				}				
			}
		);
	}
	
};
jQuery.fn.Carousel = jQuery.iCarousel.build;
