// Unobtrusive scroller object
var fdScroller = {
	scrollLoop:false,
	scrollInterval:null,
	currentBlock:null,
	lastY:0,
	requestedY:0,
	init: function() {
		var lnks = document.getElementsByTagName('a');
		var removeLoc = window.location + ' ';

		// strip any #target, force a String cast
		if(removeLoc.indexOf('#') != -1) {
			removeLoc = removeLoc.substr(0, removeLoc.indexOf('#'));
		} else {
			removeLoc = removeLoc.substr(0, removeLoc.length - 1);
		}

		for(var i = 0, lnk; lnk = lnks[i]; i++) {
			tmploc = lnk.href.replace(removeLoc,'');
			if(tmploc.charAt(0) == '#' && !lnk.onclick) lnk.onclick = fdScroller.initScroll;
		}
	},
	getWindowHeight: function(){
		var myHeight = 0;
		if( typeof( window.innerWidth ) == 'number' ) {
			//Non-IE
			myHeight = window.innerHeight;
		} else if( document.documentElement &&
				( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
			//IE 6+ in 'standards compliant mode'
			myHeight = document.documentElement.clientHeight;
		} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
			//IE 4 compatible
			myHeight = document.body.clientHeight;
		}
		return myHeight;
	},
	getScrollLeft: function(){
		if(document.all) return (document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft;
		else return window.pageXOffset;
	},
	getScrollTop: function(){
		if(document.all) return (document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop;
		else return window.pageYOffset;
	},
	getElementYpos: function(el){
		var y = 0;
		while(el.offsetParent){
			y += el.offsetTop
			el = el.offsetParent;
		}
		return y;
	},
	initScroll: function(e){
		var targ;

		if (!e) var e = window.event;
		if (e.target) targ = e.target;
		else if (e.srcElement) targ = e.srcElement;
		if (targ.nodeType == 3) targ = targ.parentNode;

		if(targ.href && targ.href.indexOf('#') != -1) {
			var where = targ.href.substr(targ.href.indexOf('#')+1,targ.href.length);
			fdScroller.currentBlock = document.getElementById(where);
			if(!fdScroller.currentBlock) return;

			var documentHeight = document.getElementsByTagName('body').offsetHeight;
			var windowHeight = fdScroller.getWindowHeight();
			var ypos = fdScroller.getElementYpos(fdScroller.currentBlock);
			if(ypos > documentHeight - windowHeight) ypos = documentHeight - windowHeight;
			fdScroller.requestedY = ypos;
			fdScroller.scroll();
		}

		return false;
	},
	scroll: function(){
		var left = fdScroller.getScrollLeft();
		var top  = fdScroller.getScrollTop();

		if(Math.abs(top-fdScroller.requestedY) <= 1){
			window.scrollTo(0,fdScroller.requestedY);
			fdScroller.lastY = -1;
		} else {
			fdScroller.lastY = top;
			window.scrollTo(0, Math.round(top+((fdScroller.requestedY-top)/2)));
			setTimeout(fdScroller.scroll,60);
		}
	}
}

var hoge_fdScroller = window.onload;
window.onload = function() {
	if(hoge_fdScroller != null) hoge_fdScroller();
	fdScroller.init();
}
