// Global holds reference to selected element
var selectedObj;

// Globals hold location of click relative to element
var offsetX, offsetY;

// Turn selected element on
function engage(evt) {
	evt = (evt) ? evt : event;
	selectedObj = (evt.target) ? evt.target : evt.srcElement;
	if (selectedObj) {
		if (document.body && document.body.setCapture) {
			// engage event capture in IE/Win
			document.body.setCapture();
		}
		if (evt.pageX) {
			offsetX = evt.pageX - getObjectLeft(selectedObj);
			offsetY = evt.pageY - getObjectTop(selectedObj);
		} else if (typeof evt.clientX != "undefined") {
			offsetX = evt.clientX - getObjectLeft(selectedObj);
			offsetY = evt.clientY - getObjectTop(selectedObj);
		} else if (typeof evt.offsetX != "undefined") {
			offsetX = evt.offsetX - ((evt.offsetX < -2) ? 0 : document.body.scrollLeft);
			offsetX -= (document.body.parentElement && document.body.parentElement.scrollLeft) ? document.body.parentElement.scrollLeft : 0
			offsetY = evt.offsetY - ((evt.offsetY < -2) ? 0 : document.body.scrollTop);
			offsetY -= (document.body.parentElement && document.body.parentElement.scrollTop) ? document.body.parentElement.scrollTop : 0
		}
		return false;
	}
}

// Drag an element
function dragIt(evt) {
	evt = (evt) ? evt : event;
	if (selectedObj) {
		if (evt.pageX) {
			x = evt.pageX;
			y = evt.pageY;
		} else if (evt.clientX || evt.clientY) {
			x = evt.clientX;
			y = evt.clientY;
		}
		if (getInsideWindowHeight()-getObjectHeight(selectedObj)-getObjectTop(selectedObj)>0) {
			newY = getObjectTop(selectedObj);
		} else {
			newY = Math.max(
				Math.min(getInsideWindowHeight()-getObjectHeight(selectedObj), 0)+6,
				Math.min(y - offsetY, 0)
			)
		}
		shiftTo(
			selectedObj,
			Math.max(
				Math.min(getInsideWindowWidth()-396-getObjectWidth(selectedObj), 0),
				Math.min(x - offsetX, 0)
			),
			newY
		);
		evt.cancelBubble = true;
		return false;
	}
}

// Turn selected element off
function release(evt) {
	if (selectedObj) {
		if (document.body && document.body.releaseCapture) {
			// stop event capture in IE/Win
			document.body.releaseCapture();
		}
		selectedObj = null;
	}
}

// Assign event handlers used by both Navigator and IE
function initDrag() {
	if (document.layers) {
		// turn on event capture for these events in NN4 event model
		document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
		return;
	} else if (document.body & document.body.addEventListener) {
		// turn on event capture for these events in W3C DOM event model
		document.addEventListener("mousedown", engage, true);
		document.addEventListener("mousemove", dragIt, true);
		document.addEventListener("mouseup", release, true);
		return;
	}
	document.onmousedown = engage;
	document.onmousemove = dragIt;
	document.onmouseup = release;
	return;
}

function switchImage(id) {
	getRawObject('image'+id).src = 'images/'+id+'_color.jpg';
}

function showBig(id, width, height) {
	window.open('image.php?id='+id,'MetareflektorImage','height='+height+',left=100,location=no,menubar=no,resizable=no,scrollbars=no,status=no,toolbar=no,top=100,width='+width);
}

var step = 30;
var timeout = 50;
var moving = false;
var textStep = 10;
var gridWidth = 130;

function move(deltaX, deltaY) {
	obj = document.getElementById("map");
	x = getObjectLeft(obj);
	y = getObjectTop(obj);
	shiftTo(
		obj,
		Math.max(
			Math.min(getInsideWindowWidth()-396-getObjectWidth(obj), 0),
			Math.min(x - deltaX*step, 0)
		),
		Math.max(
			Math.min(getInsideWindowHeight()-getObjectHeight(obj), 0)+6,
			Math.min(y - deltaY*step, 0)
		)
	);
	updateCoordinates();
	if (moving) {
		setTimeout("move("+(deltaX)+","+(deltaY)+")", timeout);
	}
}

var autoMoveDuration = 750;
var autoStepX = false;
var autoStepY = false;

function autoMove(toX, toY) {
	obj = document.getElementById("map");
	x = getObjectLeft(obj);
	y = getObjectTop(obj);
	newX = x<toX ? Math.min(toX, Math.ceil(x+autoStepX)) : Math.max(toX, Math.floor(x-autoStepX));
	newY = y<toY ? Math.min(toY, Math.ceil(y+autoStepY)) : Math.max(toY, Math.floor(y-autoStepY));
	shiftTo(
		obj,
		newX,
		newY
	);
	updateCoordinates();
	if (newX==toX && newY==toY) {
		moving = false;
	} else {
		setTimeout("autoMove("+toX+","+toY+")", timeout);
	}
}

function startAutoMove(toX, toY) {
	if (moving) {
		return;
	}
	hideText();
	obj = document.getElementById("map");
	// Calculate target coordinates
	targetX =
		Math.max(
			Math.min(getInsideWindowWidth()-396-getObjectWidth(obj), 0),
			Math.min(-toX+Math.floor((getInsideWindowWidth()-396)/2), 0)
		);
	targetY =
		Math.max(
			Math.min(getInsideWindowHeight()-getObjectHeight(obj), 0)+6,
			Math.min(-toY+Math.floor(getInsideWindowHeight(obj)/2), 0)
		);
	// Calculate step widths
	autoStepX = Math.abs(getObjectLeft(obj)-targetX)/autoMoveDuration*timeout;
	autoStepY = Math.abs(getObjectTop(obj)-targetY)/autoMoveDuration*timeout;
	// Start moving
	moving = true;
	autoMove(targetX, targetY);
}

function startMoving(deltaX, deltaY) {
	moving = true;
	hideText();
	move(deltaX, deltaY);
}

function stop() {
	moving = false;
}

function startScrolling(delta) {
	moving = true;
	scroll(delta);
}

function scroll(delta) {
	obj = getRawObject("text");
	x = getObjectLeft(obj);
	y = getObjectTop(obj);
	shiftTo(
		obj,
		isNaN(x) ? 0 : x,
		Math.max(
			Math.min(getObjectHeight(getRawObject("text_container"))-getObjectHeight(obj), 0),
			Math.min(y - delta*textStep, 0)
		)
	);
	if (moving) {
		setTimeout("scroll("+(delta)+")", timeout);
	}
}

function resize() {
	textContainer = getObject('text_container');
	textContainer.height = (getInsideWindowHeight()-396)+"px";
	mapContainer = getObject('map_container');
	mapContainer.width = (getInsideWindowWidth()-396)+"px";
	mapContainer.height = getInsideWindowHeight()+"px";
	shiftTo(
		"map",
		Math.max(
			getObjectLeft("map"),
			getObjectWidth("map_container")-getObjectWidth("map")
		),
		Math.max(
			getObjectTop("map"),
			getObjectHeight("map_container")-getObjectHeight("map")
		)
	);
	updateCoordinates();
}

var chars = new Array("A", "B", "C", "D", "E", "F", "H", "I", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "V", "X", "Z");

function updateCoordinates() {
	getRawObject("coord_bottom_x").firstChild.replaceData(0, 1, chars[-Math.ceil((getObjectLeft("map")-gridWidth/2)/gridWidth)]);
	getRawObject("coord_bottom_y").firstChild.replaceData(0, 2, -Math.ceil((getObjectTop("map")-getObjectHeight("map_container")-gridWidth/2)/gridWidth));
	getRawObject("coord_top_x").firstChild.replaceData(0, 1, chars[-Math.ceil((getObjectLeft("map")-getObjectWidth("map_container")-gridWidth/2)/gridWidth)-1]);
	getRawObject("coord_top_y").firstChild.replaceData(0, 2, 1-Math.ceil((getObjectTop("map")-gridWidth/2)/gridWidth));
}

var shownText = false;

function showText(id) {
	hide("head");
	hide("head1");
	hide("head2");
	show("scroll_up");
	show("scroll_down");
	show("language");
	shownText = id;
	target = getRawObject("text");
	hide(target);
	shiftTo(
		target,
		0,
		0
	);
	while (target.childNodes.length>0) {
		target.removeChild(target.firstChild);
	}
	source = getRawObject("text_"+id);
	for (i=0; i<source.childNodes.length; i++) {
		target.appendChild(source.childNodes[i].cloneNode(true));
	}
	show(target);
}

function hideText() {
	hide("text");
}

var animTimeout = 1000;
var animation = new Array(
	new Array("head1", "grid", "navigation2"),
	new Array("head2", "navigation3", "text_asterisk"),
	new Array("map", "navigation")
);

function animate(animStep) {
	for (i=0; i<animation[animStep].length; i++) {
		show(animation[animStep][i]);
	}
	if (animStep<animation.length-1) {
		setTimeout("animate("+(animStep+1)+")", animTimeout);
	}
}

function startAnimation() {
	setTimeout("animate(0)", animTimeout);
}
