/**
 * Created by JetBrains PhpStorm.
 * User: Vallefor
 * Date: 07.06.11
 * Time: 17:47
 * To change this template use File | Settings | File Templates.
 */
function animshka(rootJq, width, cb)
{
	this.cb={
		onFinish:null
	};
	$.extend(this.cb,cb);

	this.rootJq=rootJq;
	this.showNums=4;

	this.parent={};
	this.parent.width=this.rootJq.width();
	this.parent.height=this.rootJq.height();

	this.selected=2;

	this.itemArr=[];

	this.slides=false;
	this.slides=this.rootJq.find(".slide");
	this.first=true;
	this.finishCallback=false;

	this.lastNum=0;
	this.busy=false;

	this.itemsLeft=2;
	this.itemsRight=1;

	this.itemsLeftAdd=2;
	this.itemsRightAdd=2;

	this.staticPadd=12;

	this.magic=46-((1400-width)*0.25)+10;

	//alert(this.magic);

	//alert(this.magik+"  "+width);

	//this.magic=0;



	var self=this;
	this.magicCount = function(width)
	{
		this.magic=46-((1400-width)*0.25)+10;
	};

	this.loopCheck = function(num)
	{
		//alert(num);
		if(self.first) var ret=this.makeItemArr(num);

		var count=this.rootJq.find(".slide").length;
		var i=0;
		var saveIndex=0;
		this.rootJq.find(".slide").each(function(){
			//alert("c:"+$(this).attr("slideIndex"));
			if($(this).attr("slideIndex")==num) return false;
			saveIndex++;
		});
		//saveIndex--;
		//alert("num:"+num+" save:"+saveIndex);
		this.finishCallback=false;
		if(saveIndex<(this.itemsLeft+this.itemsLeftAdd))
		{
			var need=(this.itemsLeft+this.itemsLeftAdd)-saveIndex;
			var i=0;
			var numClone=0;
			//alert("gogo:"+need);
			for(i=count-1;i>=(count-need);i--)
			{
				//alert(":(");
				//alert("width+pad: "+(self.itemArr[i].padd*2+self.itemArr[i].small.width)+"   "+parseInt(this.rootJq.find("table").css("left")));
				//alert("before:"+this.rootJq.find("table").css("left"));
				//alert("before");
				var clone=this.rootJq.find(".slide").eq(i+numClone).clone();
				clone.addClass("clone");
				//alert(clone.attr("slideindex"));
				if(clone.is(".sel"))
				{
					//alert("sel");
					//alert("sel!");
					/*clone.find(".small").show();
					clone.find(".big").hide();*/

					//alert((self.itemArr[i].padd*2+self.itemArr[i].big.width));
					var x=parseInt(this.rootJq.find("table").css("left"))-(self.itemArr[parseInt(clone.attr("slideindex"))].padd*2+self.itemArr[parseInt(clone.attr("slideindex"))].big.width);
					//alert(self.itemArr[i].big.width);
				}
				else
				{
					//alert("NOT sel");
					var x=parseInt(this.rootJq.find("table").css("left"))-(self.itemArr[parseInt(clone.attr("slideindex"))].padd*2+self.itemArr[parseInt(clone.attr("slideindex"))].small.width);
					//alert(parseInt(this.rootJq.find("table").css("left"))+"  "+self.itemArr[parseInt(clone.attr("slideindex"))].small.width+"  "+self.itemArr[parseInt(clone.attr("slideindex"))].padd);
					//alert(self.itemArr[i+numClone].padd*2+self.itemArr[i+numClone].small.width);
				}


				//alert("-"+x+"px");
				this.rootJq.find(".slide").eq(i+numClone).addClass("removeClone");
				//alert("before");
				this.rootJq.find("table").css("left",x);
				//alert("after:"+this.rootJq.find("table").css("left"));
				this.rootJq.find("table tr").prepend(clone);
				//alert("done");
				//alert("up! "+parseInt(this.rootJq.find("table").css("left")));
				//this.init(0,false);
				//alert(":(");
				this.finishCallback=function(){ this.rootJq.find(".slide.removeClone").remove(); };

				numClone++;
			}

			//alert("inner: "+(saveIndex+need));
			return saveIndex+need;
		}
		if(saveIndex>=(count-(this.itemsRight+this.itemsRightAdd)))
		{

			var need=this.itemsRight+this.itemsRightAdd;
			var numClone=0;
			var x=0;
			for(i=0;i<need;i++)
			{
				var clone=this.rootJq.find(".slide").eq(i+numClone).clone();

				x+=(self.itemArr[i+numClone].padd*2+self.itemArr[i+numClone].small.width);//+parseInt(this.rootJq.find("table").css("left"));

				this.rootJq.find(".slide").eq(i+numClone).addClass("removeClone");
				this.rootJq.find("table tr").append(clone);
			}
			this.finishCallback=function(){
				self.rootJq.find(".slide.removeClone").remove();
				self.rootJq.find("table").css("left",parseInt(self.rootJq.find("table").css("left"))+x);
			};
			return saveIndex;
		}
		//alert("ololo: "+num);
		return saveIndex;
	};
	this.makeItemArr = function(num)
	{
		var i=0;
		//var targetElem=rootJq.find(".slide[slideIndex="+num+"]");

		var fullWidth=0;
		rootJq.find(".slide").each(function(){


			if(self.first) $(this).attr("slideIndex",i);

			self.itemArr[i]={};
			self.itemArr[i].small={};
			self.itemArr[i].big={};

			self.itemArr[i].small.width=$(this).find(".small").width();
			self.itemArr[i].small.height=$(this).find(".small").height();

			self.itemArr[i].big.width=$(this).find(".big").width();
			self.itemArr[i].big.height=$(this).find(".big").height();

			if(num-self.itemsLeft<=i && i<=num+self.itemsRight)
			//if(true)
			{
				if(i==num) fullWidth+=self.itemArr[i].big.width;
					else fullWidth+=self.itemArr[i].small.width;
			}
			if(i==num) $(this).addClass("sel");

			i++;
		});
		if(self.staticPadd) fullWidth+=self.staticPadd*(self.itemsLeft+self.itemsRight+1);

		var otnWidth=this.parent.width/fullWidth;
		var i=0;
		var padd=0;
		var nakop=0;
		rootJq.find(".slide").each(function(){
			if(self.staticPadd)
			{
				padd=self.staticPadd;
			}
			else
			{
				if(i==num) padd=(self.itemArr[i].big.width*otnWidth-self.itemArr[i].big.width);
				else padd=(self.itemArr[i].small.width*otnWidth-self.itemArr[i].small.width);
			}
			padd=padd/2;
			self.itemArr[i].padd=padd;
			i++;
		});

		return fullWidth;

	};
	this.next = function(animate){
		var len=this.rootJq.find(".slide").length;
		var next=this.lastNum+1;
		if(next>(len-1)) next=0;
		this.init(next,animate);
	};
	this.prev = function(animate){
		var len=this.rootJq.find(".slide").length;
		var prev=this.lastNum-1;
		if(prev<0)
		{
			//alert(prev);
			prev=(len-1);
			//alert(prev);
		}
		//alert(this.lastNum+"  "+prev);
		///alert(prev);
		this.init(prev,animate);
	};
	this.reinit = function(width)
	{
		this.magicCount(width);
		this.init(this.lastNum);
	};
	this.init = function(num, animate)
	{
		if(this.busy) return false;
		this.busy=true;
		//alert("before:"+num);
		this.lastNum=num;
		num=this.loopCheck(num);
		//this.lastNum=num;
		//alert("after:"+num);

		rootJq.find("table td").css({ height: rootJq.height() });

		self.itemArr=[];
		var fullWidth=this.makeItemArr(num);
		//alert(fullWidth);




		var otnWidth=this.parent.width/fullWidth;
		var i=0;
		var padd=0;
		var nakop=0;
		var selectedItem=null;
		rootJq.find(".slide").each(function(){

			if(animate && parseInt($(this).find(".big").css("paddingLeft"))!=parseInt(self.itemArr[i].padd)) $(this).animate({ paddingLeft: self.itemArr[i].padd, paddingRight: self.itemArr[i].padd },animate);
				else $(this).css({ paddingLeft: self.itemArr[i].padd, paddingRight: self.itemArr[i].padd });

			/*if(i==num) padd=(self.itemArr[i].big.width*otnWidth-self.itemArr[i].big.width);
			else padd=(self.itemArr[i].small.width*otnWidth-self.itemArr[i].small.width);
			padd=padd/2;

			if(animate && parseInt($(this).find(".big").css("paddingLeft"))!=parseInt(padd)) $(this).animate({ paddingLeft: padd, paddingRight: padd },animate);
				else $(this).css({ paddingLeft: padd, paddingRight: padd });*/
			if(self.staticPadd)
			{
				if(i<num-self.itemsLeft) nakop+=self.itemArr[i].small.width+self.staticPadd;
			}
			else
			{
				if(i<num-self.itemsLeft) nakop+=self.itemArr[i].small.width*otnWidth;
			}

			if(num==i && $(this).is(".sel"))
			{
				selectedItem=$(this);
				$(this).find(".small").css({ display: "none" });
				$(this).find(".big").css({ width: self.itemArr[i].small.width, height: self.itemArr[i].small.height, display: "block" });

				if(animate)
				{
					$(this).find(".big").animate({ width: self.itemArr[i].big.width, height: self.itemArr[i].big.height }, animate,function(){
						$(this).css({ width: "auto", height:"auto" });
					});
				}
				else
				{
					//$(this).find(".big").css({ width: self.itemArr[i].big.width, height: self.itemArr[i].big.height });
					$(this).find(".big").css({ width: "auto", height:"auto" });
				}
			}
			else
			{
				if($(this).is(".sel"))
				{
					if(animate)
					{
						$(this).find(".big").animate({ width: self.itemArr[i].small.width, height: self.itemArr[i].small.height }, animate,function(){
							$(this).parents(".slide").find(".big").hide().css({ width: "auto", height:"auto" });;

							$(this).parents(".slide").find(".small").show();
							$(this).parents(".slide").removeClass("sel");
						});
					}
					else
					{
						$(this).find(".big").css({ width: "auto", height: "auto" });
						$(this).parents(".slide").find(".big").hide();
						$(this).parents(".slide").find(".small").show();
						$(this).removeClass("sel");
					}
				}
				else
				{
					$(this).find(".big").hide();
					$(this).find(".small").show();
				}
			}

			i++;
		});

		if(animate)
		{
			rootJq.find("table").animate({ left: -nakop+self.magic },animate, function(){
				if(self.finishCallback) self.finishCallback(selectedItem);
				if(self.cb.onFinish) self.cb.onFinish(selectedItem);
				self.busy=false;
			});
		}
		else
		{
			rootJq.find("table").css({ left: -nakop+self.magic });
			if(self.finishCallback) self.finishCallback();
			if(self.cb.onFinish) self.cb.onFinish(selectedItem);
			this.busy=false;
		}

		self.first=false;

		/*rootJq.find(".slide").wrap("<td></td>");
		rootJq.html("<table><tr>"+rootJq.html()+"</tr></table>");*/
	}

}
