(function($)
{
	var $$;
	if(!Array.indexOf){Array.prototype.indexOf = function(obj, start){for(var i=(start||0); i<this.length; i++){if(this[i]==obj){return i;}}}}	
	$$ = $.fn.ke_carousel = function($options)
	{
		var _container = {id:$(this).attr('id'),self:$(this),parent:$(this).parent()};
		$.extend(
		{
			ke_carousel : 
			{
				width : 293,
				height:220,
				doThumbs:true,
				thumbWidth:74,
				thumbHeight:56,
				padding:2,
				thumbPadding:5,
				overlayClassname:'whiteOverlay',
				animateOverlay:true,
				stopCarouselOnHover:false,
				playCounter:0,
				totalGroup:0,
				thumbWindow:[0,1,2],
				playTimer:null,
				timeInterval:"3000",
				playing:true,
				grouping:2,
				pausedByButton:false,
				animationOffsetWhiteOverlay:20,
				animationType:"fade",
				whiteOverlayHeight:87,
				container:_container,
				trimHeadings:true,
				trimDescriptions:true,
				headingSupportLines:2,
				supportLines:2,
				override:false,
				h4Pos:0,
				imageOverrideAttr:"override",
				optimizeLoadTime:true,
				animateOverlayOnButtonHover:false,
				elipsesOnTitle:true,
				elipsesOnDescription:true
			}
		});
		for (var i in $options) 
		{
			if (i) 
				$.ke_carousel[i]  = $options[i];
		}
		$.ke_carousel.whiteOverlayHeight = $('.'+$.ke_carousel.overlayClassname).height();
		$('#'+_container.id+'>li').each(function(i)
		{
			$.ke_carousel.h4Pos=parseInt($(this).find('h4').css('top').replace('px',''));
			$(this).width($.ke_carousel.width).height($.ke_carousel.height).attr('seq',i);
			var img = $(this).find('a').find('img');
			//img.width($.ke_carousel.width).height($.ke_carousel.height);
			if($.ke_carousel.override)
				if(img.attr($.ke_carousel.imageOverrideAttr)!="")
					img.attr('src',img.attr($.ke_carousel.imageOverrideAttr));
			$(this).parent().width((i+1)*($.ke_carousel.width+(2*$.ke_carousel.padding))+2);
			if($.ke_carousel.trimHeadings)
				$$.snipsnap($(this),$.ke_carousel.headingSupportLines,'h4 a',$.ke_carousel.elipsesOnTitle);
			if($.ke_carousel.animationType=="slide")
			{
				$(this).find('.description').wrap('<div class="slide" style="height:'+$(this).find('.description').height()+'px"></div>');
				$(this).find('.description').css('top',$(this).find('.description').height());
			}
			if($.ke_carousel.trimDescriptions)
				$$.snipsnap($(this),$.ke_carousel.supportLines,'span.description a',$.ke_carousel.elipsesOnDescription);
			$(this).bind('mouseenter',function(e)
			{
				$$.mouseEnterHandler($(this));
			}).bind('mouseleave',function(e)
			{
				$$.mouseLeaveHandler($(this));
			});
			//try{console.log('li'+i);}catch(e){}
			$.ke_carousel.totalGroups = i;
		});
		if($.ke_carousel.animateOverlayOnButtonHover)
		{
			$("#carouselButtons").bind('mouseenter',function(e)
			{
				$$.mouseEnterHandler($('#'+$.ke_carousel.container.id+'>li:nth-child('+($.ke_carousel.playCounter+1)+')'));
			}).bind('mouseleave',function(e){});
		}
		$.ke_carousel.totalGroups=Math.ceil(($.ke_carousel.totalGroups+1)/$.ke_carousel.grouping);
		if($.ke_carousel.doThumbs)$$.createThumbnails();
		$$.initNavButtons();
		$$.startAnimation();
	};
	$$.mouseEnterHandler = function(obj)
	{
		if($.ke_carousel.animateOverlay)
		{
			if($.ke_carousel.animationOffsetWhiteOverlay=="auto")
			{
				//var animateLength = $(this).find('span.description').height()+5;
				var animateLength = obj.find('h4').height();
				obj.find('div.'+$.ke_carousel.overlayClassname).stop().animate({'height':''+($.ke_carousel.whiteOverlayHeight+animateLength)},200);
				obj.find('h4').stop().animate({'top':$.ke_carousel.h4Pos-animateLength},200);
				if($.ke_carousel.animationType=="fade")
					obj.find('span.description').stop().animate({'opacity':1},200);
				else if ($.ke_carousel.animationType=="slide")
					obj.find('span.description').stop().animate({'top':0,'opacity':1},200);
			}
			else
			{
				obj.find('div.'+$.ke_carousel.overlayClassname).stop().animate({'height':''+($.ke_carousel.whiteOverlayHeight+$.ke_carousel.animationOffsetWhiteOverlay)},200);
				obj.find('h4').stop().animate({'top':$.ke_carousel.h4Pos-$.ke_carousel.animationOffsetWhiteOverlay},200);
			}
		}
		if($.ke_carousel.stopCarouselOnHover && $.ke_carousel.playing)
			$$.playPauseHandler($('#'+$.ke_carousel.container.id).find('#pausePlayButton'),'stop','blah');
		obj.find('h4').find('a').addClass('carouselLinkHover');
	};
	$$.mouseLeaveHandler = function(obj)
	{
		if($.ke_carousel.animateOverlay)
		{
			obj.find('div.'+$.ke_carousel.overlayClassname).stop().animate({'height':$.ke_carousel.whiteOverlayHeight},200);
			obj.find('h4').stop().animate({'top':$.ke_carousel.h4Pos},200);
			if($.ke_carousel.animationType=="fade")
				obj.find('span.description').stop().animate({'opacity':0},200);
			else if ($.ke_carousel.animationType=="slide")
				obj.find('span.description').stop().animate({'top':obj.find('.description').height(),'opacity':0},200);
		}
		if($.ke_carousel.stopCarouselOnHover && !$.ke_carousel.pausedByButton)
			$$.playPauseHandler(($.ke_carousel.container.parent).find('#pausePlayButton'),'start','blah');
		obj.find('h4').find('a').removeClass('carouselLinkHover');
	};
	$$.createThumbnails = function()
	{
		$.ke_carousel.container.parent.find('#thumbnails>li').each(function(i)
		{
			$(this).attr('seq',i);
			var img = $(this).find('img');
			img.width($.ke_carousel.thumbWidth).height($.ke_carousel.thumbHeight);
			if($.ke_carousel.override)
				if(img.attr($.ke_carousel.imageOverrideAttr)!="")
					img.attr('src',img.attr($.ke_carousel.imageOverrideAttr));
			$(this).bind('click',function(e){thumbClickHandler(this);});
			$(this).parent().width((i+1)*($.ke_carousel.thumbWidth+(2*$.ke_carousel.thumbPadding))+2);
		});
		function thumbClickHandler(obj)
		{
			$.ke_carousel.playCounter = Math.floor($(obj).parent().children().index(obj)/2);
			$$.playPauseHandler($.ke_carousel.container.parent.find('#pausePlayButton'),'stop');
			$$.animateBar();
			$$.imageAnimator($.ke_carousel.playCounter);
		};
	};
	$$.initNavButtons = function()
	{
		$.ke_carousel.container.parent.find('#prevButton').bind('click',function(e)
		{
				if($.ke_carousel.animateOverlayOnButtonHover)$$.mouseLeaveHandler($('#'+$.ke_carousel.container.id+'>li:nth-child('+($.ke_carousel.playCounter+1)+')'));
				$$.playPauseHandler($.ke_carousel.container.parent.find('#pausePlayButton'),'stop');
				$.ke_carousel.playCounter--;
				if ($.ke_carousel.playCounter<0)
				{
						$$.moveDom(0);
						if($.ke_carousel.playCounter<0)$$.setActiveThumbs($.ke_carousel.playCounter,0);
						$.ke_carousel.playCounter = 0;
				}
				else
					$$.setActiveThumbs($.ke_carousel.playCounter);
				$$.imageAnimator($.ke_carousel.playCounter);
				if($.ke_carousel.doThumbs)$$.animateBar();
				if($.ke_carousel.optimizeLoadTime)$$.preloadImage(-1);
		});
		$.ke_carousel.container.parent.find('#nextButton').bind('click',function(e)
		{
				if($.ke_carousel.animateOverlayOnButtonHover)$$.mouseLeaveHandler($('#'+$.ke_carousel.container.id+'>li:nth-child('+($.ke_carousel.playCounter+1)+')'));
				$$.playPauseHandler($.ke_carousel.container.parent.find('#pausePlayButton'),'stop');
				$.ke_carousel.playCounter++;
				if ($.ke_carousel.playCounter>=$.ke_carousel.totalGroups)
				{
						$$.moveDom(1);
						if($.ke_carousel.playCounter>3)if($.ke_carousel.doThumbs)$$.setActiveThumbs($.ke_carousel.playCounter,1);
						$.ke_carousel.playCounter = $.ke_carousel.totalGroups-1;
				}
				else 
				{
					if($.ke_carousel.doThumbs)$$.setActiveThumbs($.ke_carousel.playCounter);
				}
				$$.imageAnimator($.ke_carousel.playCounter);
				if($.ke_carousel.doThumbs)$$.animateBar();
				if($.ke_carousel.optimizeLoadTime)$$.preloadImage(2);
		});
		if(typeof($.ke_carousel.buttonHoverClass)!= 'undefined')
		{
			$.ke_carousel.container.parent.find('#nextButton').bind('mouseenter',function(){$(this).addClass('next_'+$.ke_carousel.buttonHoverClass);}).bind('mouseleave',function(){$(this).removeClass('next_'+$.ke_carousel.buttonHoverClass);});
			$.ke_carousel.container.parent.find('#pausePlayButton').bind('mouseenter',function(){($(this).hasClass('playButton'))?($(this).removeClass('pause_'+$.ke_carousel.buttonHoverClass).addClass('play_'+$.ke_carousel.buttonHoverClass)):$(this).addClass('pause_'+$.ke_carousel.buttonHoverClass);}).bind('mouseleave',function(){$(this).removeClass('pause_'+$.ke_carousel.buttonHoverClass).removeClass('play_'+$.ke_carousel.buttonHoverClass);});
			$.ke_carousel.container.parent.find('#prevButton').bind('mouseenter',function(){$(this).addClass('prev_'+$.ke_carousel.buttonHoverClass);}).bind('mouseleave',function(){$(this).removeClass('prev_'+$.ke_carousel.buttonHoverClass);});
		}
	};
	$$.startAnimation = function()
	{
		$.ke_carousel.container.parent.find('#pausePlayButton').bind('click',function(e)
		{
			if($(this).hasClass('pauseButton')){$$.playPauseHandler($(this),'stop');$(this).removeClass('pause_'+$.ke_carousel.buttonHoverClass).addClass('play_'+$.ke_carousel.buttonHoverClass);}
			else if($(this).hasClass('playButton')){$$.playPauseHandler($(this),'start');$(this).addClass('pause_'+$.ke_carousel.buttonHoverClass).removeClass('play_'+$.ke_carousel.buttonHoverClass);}
		});
		$$.initiateTimer();
	};
	$$.initiateTimer = function()
	{
		$.ke_carousel.playTimer = setInterval(function()
		{
			$$.animateCarousel();
		},$.ke_carousel.timeInterval);
	};
	$$.animateCarousel = function()
	{
		$.ke_carousel.playCounter++;
		if ($.ke_carousel.playCounter>=$.ke_carousel.totalGroups)
		{
				$$.moveDom(1);
				if($.ke_carousel.doThumbs)if($.ke_carousel.playCounter>3)$$.setActiveThumbs($.ke_carousel.playCounter,1);
				$.ke_carousel.playCounter = $.ke_carousel.totalGroups-1;
		}
		else
		{
			if($.ke_carousel.doThumbs)$$.setActiveThumbs($.ke_carousel.playCounter);
		}
		$$.imageAnimator($.ke_carousel.playCounter);
		if($.ke_carousel.doThumbs)$$.animateBar();
		if($.ke_carousel.optimizeLoadTime)$$.preloadImage(2);
	};
	$$.moveDom = function(dir)
	{
		for(var i=0;i<$.ke_carousel.grouping;i++)
		{
			if(dir==1)$.ke_carousel.container.self.append($('#'+$.ke_carousel.container.id+'>li:first-child'));
			else if (dir==0)$.ke_carousel.container.self.prepend($('#'+$.ke_carousel.container.id+'>li:last-child'));
		}
		if(dir==1)$.ke_carousel.container.self.css('left',((-1)*($.ke_carousel.playCounter-2)*($.ke_carousel.width+(2*$.ke_carousel.padding)))); //-1? //-(($.ke_carousel.totalGroups<3):(3-$.ke_carousel.totalGroups)?(0))
		else if (dir==0)$.ke_carousel.container.self.css('left',((-1)*($.ke_carousel.playCounter+2)*($.ke_carousel.width+(2*$.ke_carousel.padding))));
	};
	$$.imageAnimator = function(index,seq)
	{
		$.ke_carousel.container.self.stop().animate({left:-1*((index)*$.ke_carousel.grouping*($.ke_carousel.width+(2*$.ke_carousel.padding)))},300,'swing');
	};
	$$.setActiveThumbs = function(index,dir)
	{
		if(dir==null)
		{
			if(index>$.ke_carousel.thumbWindow[$.ke_carousel.thumbWindow.length-1])
				$.ke_carousel.thumbWindow=[index-2,index-1,index];
			else if(index<$.ke_carousel.thumbWindow[0])
				$.ke_carousel.thumbWindow=[index,index+1,index+2];
		}
		else
		{
			for(var i=0;i<$.ke_carousel.grouping;i++)
			{
				if(dir==0)$.ke_carousel.container.parent.find('#thumbnails').prepend($.ke_carousel.container.parent.find('#thumbnails>li:last-child'));
				if(dir==1)$.ke_carousel.container.parent.find('#thumbnails').append($.ke_carousel.container.parent.find('#thumbnails>li:first-child'));
			}
			if(dir==0)$.ke_carousel.container.parent.find("#thumbnails").css('left',((-1)*(index+3)*($.ke_carousel.thumbWidth+(2*$.ke_carousel.thumbPadding))));
			else if(dir==1)$.ke_carousel.container.parent.find("#thumbnails").css('left',((-1)*(index-4)*($.ke_carousel.thumbWidth+(2*$.ke_carousel.thumbPadding))));
		}
		$.ke_carousel.container.parent.find('#thumbnails').animate({left:-1*(($.ke_carousel.thumbWindow[0])*($.ke_carousel.thumbWidth+10)*2)},300,'swing');
	};
	$$.animateBar = function()
	{
			$.ke_carousel.container.parent.find('#bar').animate({left:($.ke_carousel.thumbWindow.indexOf($.ke_carousel.playCounter)*$.ke_carousel.grouping*($.ke_carousel.thumbWidth+10)+$.ke_carousel.thumbPadding)},200,'swing');
	};
	$$.playPauseHandler = function (obj,action,hover)
	{
		if(hover==null)
			$.ke_carousel.pausedByButton=true;
		else
			$.ke_carousel.pausedByButton=false;

		if(action=="start")
		{
			if($.ke_carousel.pausedByButton)$$.animateCarousel();
			$$.initiateTimer();
			$.ke_carousel.playing=true;
			if(hover==null)obj.removeClass('playButton').addClass('pauseButton');
		}
		else if(action=='stop')
		{
			clearInterval($.ke_carousel.playTimer);
			$.ke_carousel.playing=false;
			if(hover==null)obj.removeClass('pauseButton').addClass('playButton');
		}
	};
	$$.snipsnap = function (li,lines,child,elipses)
	{
		//alert(li.find(child).text());
		var fontSize = parseInt(li.find(child).css('font-size'));
		if(li.find(child).height()>=(lines+1)*fontSize)
		{
			var s = li.find(child).html();
			var n = s.split(' ');
			n.pop();
			if(elipses)n[n.length-1] = '...';
			li.find(child).html(n.join(' '));
			$$.snipsnap(li,lines,child,elipses);
		}
	};
	$$.preloadImage = function(dir)
	{
		if(dir==-1 && $.ke_carousel.playCounter==0)dir=$('#'+$.ke_carousel.container.id+'>li').length;
		var temp = $('#'+$.ke_carousel.container.id+'>li:nth-child('+($.ke_carousel.playCounter+dir)+')').find('.imageLink');
		if(temp.length==1)
		{
			temp.parent().children('a:first').append('<img src="'+temp.attr('href')+'" alt="'+temp.html()+'"/>');
			temp.remove();
		}
	};
})(jQuery);