/*Version:1.2
2011-06-16*/

(function($)
{
	$.fn.caseRotator = function(options)
	{
		// Set the options.
		options = $.extend({},$.fn.caseRotator.defaults, options);
		
		// Go through the matched elements and return the jQuery object.
		return this.each(function()
		{
			var $this = $(this);
			
			//var $rotationObj =  $this.find('img');
			var $rotationObj = $this.find('>img, > a img, >div')
			var $NowAnimated = false;
			var NbrImages = $rotationObj.length;
			var OriginalObject = new Array();
			var activeImg = 1;
			var $divs;
			var AutoRotationInterval;
			var AutoRotatePaus = false;
			var $containerData = {width: $(this).width(),height: $(this).height(), margin: 0,paddingleft:parseInt($(this).css('padding-left')), paddingright:parseInt($(this).css('padding-right'))};
			$this.css("position","relative");
			$rotationObj.css("position","absolute");
   			$rotationObj.css("overflow","hidden");
			$divs = $rotationObj.filter('div');
			
			$divs.addClass("caseRotatorDiv").wrapInner('<div class="caseRotatorDivContent" level="0" style="position:absolute; top:0; left:0; background-color:#ccc"/>');
			$divs.each(function(i){
				var $InsertObj;
				$(this).attr('w',$(this).width()).attr('h',$(this).height()).attr('rel',i);
				for(y=1;y<options.levels;y++)
				{
					
					$InsertObj = $(this).find('.caseRotatorDivContent[level=0]').clone();
					$InsertObj.attr('level',y);
					$(this).append($InsertObj)
					//$InsertObj.show('scale',{ percent: 50 }, 0);
					//$InsertObj.effect('scale',{percent: 100-(100 * options.resizestep * y) },0).css('opacity',0);
					$InsertObj.effect('scale',{percent: 100-(100 * options.resizestep * y) },0).hide();
					
					
				}
				//$(this).find('.caseRotatorDivContent[level=0]').css('opacity',0)
				$(this).find('.caseRotatorDivContent').hide();
				//OriginalObject[i] = $(this).clone();
				
			});
			$divs.addClass("caseRotatorDiv").wrapInner('<div style="position:relative"/>')
			
			
			//$divs.after('<div class="original" style="display:none;">'+ $(this).find('.caseRotatorDivContent').html() +'</div>')
			
			
			if(options.rotationInterval)
			{
				//Setup the autorotation.
				AutoRotationInterval = setInterval(function() { if(!AutoRotatePaus)DoRotate(1); }, options.rotationInterval); 
			}
			
			
			
			//Loop trough all images and set possiotion and css I think.
			$rotationObj.each(function(i)
			{
				var $image = $(this);
				options.states[i] = {height:$image.height(), width:$image.width(), top:0, left:0, opacity:1, level:0, image: $image};
				
				
				$image.find('.caseRotatorDivContent').css('height',$image.height()).css('width',$image.width());
				
				if(i==0)
				{
					//Margin on both sida of showing image.
					$containerData.margin= ($containerData.width - options.states[i].width) / 2  ;	
				}
				
				
				
				
				if(i < (NbrImages / 2))
				{
					options.states[i].level = i;
					//Position right or startimage
					options.states[i].width -= (options.states[i].width * (options.resizestep * i));
					options.states[i].height -= (options.states[i].height * (options.resizestep * i));
					
					
					if(options.states[i].level > 0)
					{
						options.states[i].left = options.states[options.states[i].level-1].left - ($containerData.margin /(options.levels - 1));
						if(options.states[i].left<0)
						{
							options.states[i].left=0;	
						}						
					}
					else
					{
						options.states[i].left = ($containerData.width - options.states[i].width) / 2 ;	
					}
					
				}
				else
				{
					//Possition left	
					options.states[i].level = NbrImages  - i;
					options.states[i].width -= (options.states[i].width * (options.resizestep * options.states[i].level));
					options.states[i].height -= (options.states[i].height * (options.resizestep * options.states[i].level));
					
					if(options.states[i].level > 0)
					{
						
						options.states[i].left = options.states[options.states[i].level-1].left - ($containerData.margin /(options.levels - 1))
						if(options.states[i].left<0)
						{
							options.states[i].left=0;	
						}						
					}
					else
					{
						options.states[i].left = ($containerData.width - options.states[i].width) / 2;	
					}					
				}
				options.states[i].left = parseInt(options.states[i].left);
				
				if(options.states[i].level < options.levels)
				{
					options.states[i].opacity = 1 - options.states[i].level * options.opacitystep;
					if(options.states[i].opacity < 0)
						options.states[i].opacity = 0;
				}
				else
				{
					options.states[i].opacity = 0;	
				}
			
			
				
 				options.states[i].top = ($containerData.height - options.states[i].height) / 2;
								
				$image.css('z-index',options.levels-options.states[i].level);
				if(i < (NbrImages / 2))
				{
					//$image.css('right',options.states[i].left);
					$image.css('left',$containerData.width - (options.states[i].width + options.states[i].left)-(parseInt($image.css('borderRightWidth'))*2));
				}
				else
				{
					$image.css('left',options.states[i].left);
					//$image.css('right','');
				}
				//$image.css('left',options.states[i].left);
				$image.css('top',options.states[i].top);
				$image.css('width',options.states[i].width);	
				$image.css('height',options.states[i].height);
				$image.css('opacity', options.states[i].opacity);	
				$image.attr('state',i);
				//$image.find('.caseRotatorDivContent[level='+ options.states[i].level +']').css('opacity',1)
				$image.find('.caseRotatorDivContent[level='+ options.states[i].level +']').show();
				
				
				
			});
			//Fix left in state.
			for(i=1;i<(NbrImages / 2);i++)
			{
				options.states[i].left = $containerData.width - (options.states[i].width + options.states[i].left)-(parseInt(options.states[i].image.css('borderRightWidth'))*2);				
			}
			if(options.start!=1){
				setStartUpPos(options.start-1)
			}
			
			$rotationObj.mouseover(function(){
				AutoRotatePaus = true;						   
			});
			$rotationObj.mouseout(function(){
				AutoRotatePaus = false;						   
			});
			
			$rotationObj.click(function(e){
				var $image = $(this);
				var clickState = $image.attr('state');
				clearInterval(AutoRotationInterval);
				if(clickState==0)
				{
					//Clicked on the front image
					//Find out with direction to rotate and do it.
					DoRotate(e.offsetX < $image.width() / 2 ? 1 : -1)
				}
				else
				{
					if(clickState < (NbrImages / 2))
					{
						//Rotate right	
						DoRotate(clickState);
					}
					else
					{
						DoRotate((NbrImages-clickState)*-1);
						//Rotate left	
					}
				}
				if(clickState!=0)
				{
					return false;	
				}
			});	
			
			function setStartUpPos(argStartStep)
			{
				for(i=0;i<NbrImages;i++)
				{
					ToState = i - argStartStep
					
					//alert("From:"+ i +" TO:"+ ToState)
					if(ToState < 0)
					{
						//ToState = ToState * -1;	
						ToState = NbrImages + ToState;	
					}
					if(ToState > NbrImages-1)
					{
						ToState = (NbrImages - ToState) * -1;
					}
					
					ToValueArray = {height:options.states[ToState].height, width:options.states[ToState].width, top:options.states[ToState].top, left:options.states[ToState].left, opacity:options.states[ToState].opacity};
					AnimationCalc = 0;
					ScaleChange = 100 - (1-(options.states[i].width/options.states[ToState].width)) * 100;
					
					
					
					
					//options.states[i].image.find('.caseRotatorDivContent:visible').fadeOut(options.animationSpeed);
					//options.states[i].image.find('.caseRotatorDivContent[level='+ options.states[ToState].level +']').fadeIn(options.animationSpeed);
					
					
					if(1==2)
					{
						options.states[i].image.find('.caseRotatorDivContent:visible').hide();
						//options.states[i].image.find('.caseRotatorDivContent[level='+ options.states[ToState].level +']').show().effect("scale",{percent: 100,  from: {width:options.states[i].width, height:options.states[i].height}},options.animationSpeed)
						ScaleChange = ScaleChange / 100
						ScaleChange = 1.3;
						//ScaleChange = 1.3;
						options.states[i].image.find('.caseRotatorDivContent[level='+ options.states[ToState].level +']').effect("scale",{scale:'content',percent: 100,  from: {width:options.states[i].width*ScaleChange, height:options.states[i].height*ScaleChange}},options.animationSpeed).show()
						if(options.states[i].image.find('.caseRotatorDivContent').length != 0)
						{
							//alert(options.states[i].width)
							//alert(ScaleChange)
						}
						//
					}
					else
					{
						ScaleChange = 100 - parseInt(100 * ((options.states[ToState].level)*options.resizestep));
						options.states[i].image.find('.caseRotatorDivContent:visible').hide();
						options.states[i].image.find('.caseRotatorDivContent[level='+ options.states[ToState].level +']').html(options.states[i].image.find('.caseRotatorDivContent[level=0]').html()).effect("scale",{scale:'content', percent: ScaleChange,  from: {width:options.states[i].width, height:options.states[i].height}},options.animationSpeed);
						if(options.states[i].image.find('.caseRotatorDivContent').length != 0)
						{
							//alert(ScaleChange)
						}
					}
					options.states[i].image.css(ToValueArray).attr('state',ToState);
				}
				for(i=0;i<NbrImages;i++)
				{
					options.states[i].image = $rotationObj.filter('[state='+ i +']');
					options.states[i].image.css({zIndex: function(){ return options.levels-options.states[parseInt($(this).attr('state'))].level}})
				}
			}
			
			function DoRotate(argDirectionStep)
			{
				//alert(argDirectionStep)
				var i,ToState,ToValueArray,AnimationCalc,$caseRotatorDivContent;
				if(!$NowAnimated)
				{
					$NowAnimated = true;
					for(i=0;i<NbrImages;i++)
					{
						ToState = i - argDirectionStep
						
						//alert("From:"+ i +" TO:"+ ToState)
						if(ToState < 0)
						{
							//ToState = ToState * -1;	
							ToState = NbrImages + ToState;	
						}
						if(ToState > NbrImages-1)
						{
							ToState = (NbrImages - ToState) * -1;
						}
						
						ToValueArray = {height:options.states[ToState].height, width:options.states[ToState].width, top:options.states[ToState].top, left:options.states[ToState].left, opacity:options.states[ToState].opacity};
						AnimationCalc = 0;
						ScaleChange = 100 - (1-(options.states[i].width/options.states[ToState].width)) * 100;
						
						
						
						
						//options.states[i].image.find('.caseRotatorDivContent:visible').fadeOut(options.animationSpeed);
						//options.states[i].image.find('.caseRotatorDivContent[level='+ options.states[ToState].level +']').fadeIn(options.animationSpeed);
						
						
						if(1==2)
						{
							options.states[i].image.find('.caseRotatorDivContent:visible').hide();
							//options.states[i].image.find('.caseRotatorDivContent[level='+ options.states[ToState].level +']').show().effect("scale",{percent: 100,  from: {width:options.states[i].width, height:options.states[i].height}},options.animationSpeed)
							ScaleChange = ScaleChange / 100
							ScaleChange = 1.3;
							//ScaleChange = 1.3;
							options.states[i].image.find('.caseRotatorDivContent[level='+ options.states[ToState].level +']').effect("scale",{scale:'content',percent: 100,  from: {width:options.states[i].width*ScaleChange, height:options.states[i].height*ScaleChange}},options.animationSpeed).show()
							if(options.states[i].image.find('.caseRotatorDivContent').length != 0)
							{
								//alert(options.states[i].width)
								//alert(ScaleChange)
							}
							//
						}
						else
						{
							ScaleChange = 100 - parseInt(100 * ((options.states[ToState].level)*options.resizestep));
							options.states[i].image.find('.caseRotatorDivContent:visible').hide();
							options.states[i].image.find('.caseRotatorDivContent[level='+ options.states[ToState].level +']').html(options.states[i].image.find('.caseRotatorDivContent[level=0]').html()).effect("scale",{scale:'content', percent: ScaleChange,  from: {width:options.states[i].width, height:options.states[i].height}},options.animationSpeed);
							if(options.states[i].image.find('.caseRotatorDivContent').length != 0)
							{
								//alert(ScaleChange)
							}
						}
						
						//$caseRotatorDivContent = options.states[i].image.find('.caseRotatorDivContent');
						//ScaleChange = 100 - ((options.states[ToState].level) * 100 * options.resizestep);
						//$caseRotatorDivContent.each(function(){
							
							//caseRotatorDivContent.filter('')
							//$(this).html(OriginalObject[i].html()).width($(this).parent().attr('w')).height($(this).parent().attr('h')).effect('scale');
							
							//$caseRotatorDivContent.effect("scale", { percent: ScaleChange,from: {height:$(this).parent().height(), width:$(this).parent().width()}}, options.animationSpeed);
							//alert(ScaleChange);
							//$(this).effect("scale", { percent: ScaleChange,from: {height:$(this).parent().height(), width:$(this).parent().width()}}, options.animationSpeed);
							//$(this).fadeTo("scale", { percent: 90 }, options.animationSpeed)
							//alert($(this).parent().height() +":"+ ScaleChange)
							//$(this).effect("scale", { scale:'content',percent: ScaleChange,from: {height:$(this).parent().height(), width:$(this).parent().width()}}, options.animationSpeed);
						//});
						//ScaleChange = 100 - (ToState-i * options)70;
						
						options.states[i].image.animate(ToValueArray, options.animationSpeed, options.easefunktion, function(){
							AnimationCalc =AnimationCalc + 1;
							if(AnimationCalc==NbrImages)
							{
								//All animations ready();
								for(i=0;i<NbrImages;i++)
								{
									options.states[i].image = $rotationObj.filter('[state='+ i +']');
								}
								$NowAnimated = false;
							}
						}).attr('state',ToState);
						
						
						
						//Set z-index after half the animationetime
						setTimeout(function()
						{
							$rotationObj.css({zIndex: function(){ return options.levels-options.states[parseInt($(this).attr('state'))].level}});
						}, options.animationSpeed / 2);
						
						
						
						
					}
					
					
				}
				
				return;
			};
			
			
		});
	};
	// Public defaults.
	$.fn.caseRotator.defaults = {
		rotationInterval: 5000,
		easefunktion:'',
		animationSpeed:500,
		opacitystep:0.5,
		resizestep:0.3,
		levels:2,
		states : [],
		start:1
	};
	
	
	// Public functions.
	$.fn.caseRotator.Rotate = function(argDirection)
	{
		DoRotate(argDirection)
		return;
	};
})(jQuery);
