/*

	Хуй

*/

var rotator = function(slots, objects, first, speed, flyDist) {

	if(!speed) speed = 500;
	if(!flyDist) flyDist = 500;

	var flyCount = 0;


	var scrollLayer = $(document.body);
	/*var scrollLayer = $(document.createElement("div"));
	scrollLayer.setStyle({
		position: "fixed",
		top: "0",
		left: "0",
		width: "100%",
		height: "100%",
		overflow: "hidden"
	});
	$(document.body).appendChild(scrollLayer);*/


	var beforeScroll = function() {
		if(flyCount++ == 0) {
			$(document.body).setStyle({
				overflowX: "hidden"
			});
		}
	};

	var afterScroll = function() {
		if(--flyCount == 0) {
			$(document.body).setStyle({
				overflowX: ""
			});
		}
	};

	this.fly = function (object, slot, flyOffset) {

		if(slot == null) {
			// Скрытие
			var sourceOpacity = 1;
			var targetOpacity = 0;

			var sourcePos = [ $(object.parentNode).cumulativeOffset(), [ $(object.parentNode).getWidth(), $(object.parentNode).getHeight() ] ];
			var targetPos = [ [ sourcePos[0][0] + flyOffset[0], sourcePos[0][1] + flyOffset[1] ], [ sourcePos[1][0], sourcePos[1][1] ] ];

		} else {
			// Имеем целевой слот
			slot = $(slot);
			var targetPos = [ slot.cumulativeOffset(), [ slot.getWidth(), slot.getHeight() ] ];
			var targetOpacity = 1;

			if(flyOffset != null) {
				// Появление
				var sourceOpacity = 0;
				var sourcePos = [ [ targetPos[0][0] + flyOffset[0], targetPos[0][1] + flyOffset[1] ], [ targetPos[1][0], targetPos[1][1] ] ];
			} else {
				// Перемещение
				var sourceOpacity = 1;
				var sourcePos = [ $(object.parentNode).cumulativeOffset(), [ $(object.parentNode).getWidth(), $(object.parentNode).getHeight() ] ];
			}


		}

		object.setStyle({
			position: "absolute",
			display: "block",
			left: sourcePos[0][0]+"px",
			top: sourcePos[0][1]+"px",
			width: sourcePos[1][0]+"px",
			height: sourcePos[1][1]+"px",
			opacity: sourceOpacity
		});
		scrollLayer.appendChild(object);

		var begin = new Date();

		beforeScroll();
		var interval = setInterval(function() {

			var now = new Date();
			var phaseLin = (now - begin) / speed;
			var phase = (1 - Math.cos(phaseLin*Math.PI)) / 2;

			if((now - begin) >= speed) {
				clearInterval(interval);
				afterScroll();
				object.setStyle({
					position: "",
					width: "100%",
					height: "100%",
					opacity: targetOpacity
				});
				if(slot) {
					slot.appendChild(object);
				} else {
					object.setStyle({ display: "none" });
				}
			} else {
				var currentPos = [
					[
						sourcePos[0][0]*(1-phase) + targetPos[0][0]*phase,
						sourcePos[0][1]*(1-phase) + targetPos[0][1]*phase
					],
					[
						sourcePos[1][0]*(1-phase) + targetPos[1][0]*phase,
						sourcePos[1][1]*(1-phase) + targetPos[1][1]*phase
					]
				];
				object.setStyle({
					left: currentPos[0][0]+"px",
					top: currentPos[0][1]+"px",
					width: currentPos[1][0]+"px",
					height: currentPos[1][1]+"px",
					opacity: sourceOpacity*(1-phaseLin)+targetOpacity*phaseLin
				});
			}

		}, 10);
	};


	this.rotateFwd = function () {
		if(flyCount == 0) {
			if(++first == objects.length) first = 0;
			for(var i=(slots.length-1); i>=0; i--) {
				if(slots[i].content != null) {
					if(i == slots.length-1) {
						this.fly(slots[i].content, null, [ -flyDist, 0 ]);
						slots[i].content = null;
					} else {
						this.fly(slots[i].content, slots[i+1].slot);
						slots[i+1].content = slots[i].content;
						slots[i].content = null;
					}
				}
			}
			this.fly(objects[first], slots[0].slot, [ flyDist, 0 ]);
			slots[0].content = objects[first];
		}
	};

	this.rotateBack = function () {
		if(flyCount == 0) {
			if(--first == -1) first = objects.length - 1;
			for(var i=0; i<slots.length; i++) {
				if(slots[i].content != null) {
					if(i == 0) {
						this.fly(slots[i].content, null, [ flyDist, 0 ]);
						slots[i].content = null;
					} else {
						this.fly(slots[i].content, slots[i-1].slot);
						slots[i-1].content = slots[i].content;
						slots[i].content = null;
					}
				}
			}
			var obj = objects[(first+slots.length-1) % objects.length];
			var slot = slots[slots.length-1];
			this.fly(obj, slot.slot, [ -flyDist, 0 ]);
			slot.content = obj;

		}
	};


}

