function init() {
	document.getElementById('up').onclick = up;
	document.getElementById('down').onclick = down;
}

function findTop() {
	var y;
	if (self.pageYOffset) {
		y = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop) {
		y = document.documentElement.scrollTop;
	} else if (document.body) {
		y = document.body.scrollTop;
	}
	return y;
}

function findElement() {
	var top = findTop();
	var projects = document.getElementById("projects").childNodes;
	var i = projects.length - 1;
	while (top < projects[i].offsetTop) {
		i--;
	}
	return projects[i];
}

function findPos(obj) {
	var top = 0;
	if (obj.offsetParent) {
		do {
			top += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return top;
}

function scroll() {
	if (end > start) {
		start = start + Math.ceil(Math.min(end - start, 100) / 2);
	} else {
		start = start - Math.ceil(Math.min(start - end, 100) / 2);
	}
	window.scrollTo(0, start);
	if (start == end) {
		clearInterval(handler);
		if (cache.length > 0) {
			cache[0]({});
			cache.splice(0, 1);
		}
	}
}

function prepare(element) {
	start = findTop();
	end = findPos(element);
	handler = setInterval(scroll, 10);
}

function up(e) {
	if (start == end) {
		var element = findElement();
		if (findPos(element) != findTop()) {
			prepare(element);
		} else {
			if (element.previousSibling) {
				prepare(element.previousSibling);
			} else {
				prepare(element);
			}
		}
	} else {
		cache.push(up);
	}
}

function down(e) {
	if (start == end) {
		var element = findElement();
		if (element.nextSibling) {
			prepare(element.nextSibling);
		} else {
			prepare(document.getElementById('contact'));
		}
	} else {
		cache.push(down);
	}
}

if (document.addEventListener) {
	document.addEventListener('DOMContentLoaded', init, false);
} else {
	window.onload = init;
}

var cache = [];
var start = 0;
var end = 0;
var handler = null;

