var ANIMATION_SMOOTH = 40;
var CROSS_DISSOLVE_SPEED = 0.4;
var CROSS_DISSOLVE_STILL = 5;
var PING_PONG_STILL = 3;
var ZOOM_SPEED = 150;
var PAN_SPEED = 50;

function parentWithPos(obj) {
	var parent;
	
	parent = obj.parentNode;
	if (parent) {
		if (parent.tagName != 'A')	{
			return parent;
		} else {
			return parentWithPos(parent);
		}
	}
	return parent;		
}

function CrossDissolve(ids) {
	this.current = -1;
	this.ids = ids;
	this.x = new Array();
	this.y = new Array();

	this.getNext = function() {
		var next = this.current+1;
		if (next >= this.ids.length) next=0;
		return next;
	}	
	
	this.start = function () {
		var first;
		var next = this.getNext();
		var obj = document.getElementById(this.ids[next]);

/* 
		if (typeof (obj.naturalWidth) != "undefined" && obj.naturalWidth == 0) {
			this.current = this.getNext();
			setTimeout(
				this.start(),
				500
			);
			return;
		}
*/
		if (this.current != next) {
			showLayer(this.ids[next]);
			
			if (this.current >= 0) {
				first  = new Tween(this.ids[this.current], 'alpha', 100,0, CROSS_DISSOLVE_SPEED, ANIMATION_SMOOTH, null);
			}
			var second = new Tween(this.ids[next],         'alpha', 0,100, CROSS_DISSOLVE_SPEED, ANIMATION_SMOOTH, null);
			second.cross = this;
			second.onMotionFinished = function() {
				hideLayer(this.cross.ids[this.cross.current]);
				this.cross.current = this.cross.getNext();
				setTimeout(
					function() {
						second.cross.start();
					},
					CROSS_DISSOLVE_STILL*1000
				);
			}
			
			if (first) first.animate();
			second.animate();
		}
		
		if (obj) {
			//var parent = obj.parentNode;
			var parent = parentWithPos(obj);
			if (parent) {
				var targetWidth = obj.offsetWidth;
				var targetHeight = obj.offsetHeight;
				
				var width = new Tween(this.ids[next], 'width', obj.offsetWidth, parent.offsetWidth, Math.abs(parent.offsetWidth-obj.offsetWidth)/ZOOM_SPEED, ANIMATION_SMOOTH, null);
				if (parent.offsetWidth / obj.offsetWidth > parent.offsetHeight / obj.offsetHeight) {
					targetWidth = parent.offsetWidth;
					targetHeight = obj.offsetHeight / obj.offsetWidth * targetWidth;
					width.animate();
				}
				
				var height = new Tween(this.ids[next], 'height', obj.offsetHeight, parent.offsetHeight, Math.abs(parent.offsetHeight-obj.offsetHeight)/ZOOM_SPEED, ANIMATION_SMOOTH, null);
				if (parent.offsetHeight / obj.offsetHeight > parent.offsetWidth / obj.offsetWidth) {
					targetHeight = parent.offsetHeight;
					targetWidth = obj.offsetWidth / obj.offsetHeight * targetHeight;
					height.animate();
				}
				
				if (!height.in_animation && !width.in_animation) {
					if (targetWidth > parent.offsetWidth) {
						if (this.x[next] == undefined || this.x[next] == null) {
							this.x[next] = new Tween(this.ids[next], 'left', 0, parent.offsetWidth-targetWidth, Math.abs(targetWidth-parent.offsetWidth)/PAN_SPEED, ANIMATION_SMOOTH, null);
							this.x[next].onMotionFinished = function () {
								var s = this.start;
								this.start = this.end;
								this.end = s;
								this.animate(PING_PONG_STILL);
							}
							this.x[next].animate();
						}
					}
	
					if (targetHeight > parent.offsetHeight) {
						if (this.y[next] == undefined || this.y[next] == null) {
							this.y[next] = new Tween(this.ids[next], 'top', 0, parent.offsetHeight-targetHeight, Math.abs(targetHeight-parent.offsetHeight)/PAN_SPEED, ANIMATION_SMOOTH, null);
							this.y[next].onMotionFinished = function () {
								var s = this.start;
								this.start = this.end;
								this.end = s;
								this.animate(PING_PONG_STILL);
							}
							this.y[next].animate();
						}
					} 
				}
			}
		}
		
	}
	
	this.start();
}

/* ============================================================================================================ */
/*													scroll														*/
/* ============================================================================================================ */

function scrollInit(scroll_id, current_id) {
	var current = document.getElementById(current_id);
	var scroll = document.getElementById(scroll_id);
	if (current && scroll) {
		var offset = getScrollOffset(scroll, current);
		
		var x = offset[0]+Math.floor(current.offsetWidth/2)-Math.floor(scroll.offsetWidth/2);
		var y = offset[1]+Math.floor(current.offsetHeight/2)-Math.floor(scroll.offsetHeight/2);
		scrollSet(scroll_id, x, y);
	}
}
									
function scroll(id, dx, dy) {
	var obj = document.getElementById(id);
	if (obj) {
		obj.stopScroll = false;
		obj.dx = dx;
		obj.dy = dy;
		goScroll(obj);
	}
}

function goScroll(obj) {
	if (obj.stopScroll) return;
	obj.scrollLeft += obj.dx;
	obj.scrollTop += obj.dy;
	_scroll_obj_ = obj;

	setTimeout(
		function() {
			goScroll(_scroll_obj_);
		}, 
		ANIMATION_SMOOTH
	);
}

function stopScroll(id) {
	var obj = document.getElementById(id);
	if (obj) {
		setTimeout(
			function() {
				obj.stopScroll = true;
			}, 
			500
		);
	}
}

function scrollSet(id, left, top) {
	var obj = document.getElementById(id);
	if (obj) {
		obj.scrollLeft = left;
		obj.scrollTop = top;
	}
}

function getScrollOffset(node1, node2) {
	if (!node2) {
		if (node1) {
			var e = getScrollOffset(null, node1);
			return new Array(-e[0], -e[1]);
		} 
		return new Array(0,0);
	}
	
	if (node1 && node1.id && node2.id == node1.id) {
		return new Array(0,0);
	}
	
	var o = getScrollOffset(node1, node2.offsetParent);
	return new Array(node2.offsetLeft+o[0], node2.offsetTop+o[1]);
}


