var myYrscScrollID = null;
var myYrscMoveDistanceAry = new Array();

function myYrscSetAElms(){
	var aAry = document.getElementsByTagName('a');
	for( var i = 0; i < aAry.length; i++ ){
		if( ( ( aAry[i].href ) && ( aAry[i].href.indexOf('#') != -1 ) )
		&& ( ( aAry[i].pathname == location.pathname ) || ( ( '/' + aAry[i].pathname ) == location.pathname ) )
		&& ( aAry[i].search == location.search ) ){
			addListener( aAry[i], 'click', myYrscSetScrolling );
		}
	}
}

function myYrscScrollWindow( n, toPosi, anchor ){

	clearTimeout( myYrscScrollID );
	if( n < myYrscMoveDistanceAry.length ){
		window.scrollTo( 0, myYrscMoveDistanceAry[ n ] );
		n += 1;
		myYrscScrollID = setTimeout( 'myYrscScrollWindow(' + n + ',' + toPosi + ',"' + anchor + '")', 15 );
	}else{
		window.scrollTo( 0, toPosi );
		location.hash = anchor;
	}
}

function myYrscSetScrolling( e ){

	clearTimeout( myYrscScrollID );

	var fragment;
	var eventObj;
	if( window.event ){
		eventObj = window.event.srcElement;
	}else if( e ){
		eventObj = e.target;
	}else{
		return;
	}
	if( eventObj.nodeName.toLowerCase() != 'a' ) eventObj = eventObj.parentNode;
	if( eventObj.nodeName.toLowerCase() != 'a' ) return;
	fragment = eventObj.hash.substr( 1 );

	var toElm = null;
	var aAry = document.getElementsByTagName('a');
	for( var i = 0; i < aAry.length; i++ ){
		if( aAry[i].name && ( aAry[i].name == fragment ) ){
			toElm = aAry[i];
			break;
		}
	}
	if( ! toElm ) toElm = document.getElementById( fragment );
	if( ! toElm ) return true;

	var ara = new Array();
	ara = getElementPosition( toElm, 1 );
	var toX = ara['x'];
	var toY = ara['y'];

	myYrscMoveDistanceAry = [];
	var posiPast, posiNow;
	var flgAbovePast, flgAboveNow;
	do{
		posiPast = isNaN( posiPast ) ? getScrollPositionY() : posiNow;
		flgAbovePast = ( posiPast < toY );

		var nokoriPixel = toY - posiPast;
		var theDist = Math.abs( nokoriPixel );
		if( theDist > 48 ){
			posiNow = parseInt( nokoriPixel / 16 ) + posiPast;
		}else if( theDist > 20 ){
			posiNow = ( ( flgAbovePast ) ? 3 : -3 ) + posiPast;
		}else if( theDist > 6 ){
			posiNow = ( ( flgAbovePast ) ? 2 : -2 ) + posiPast;
		}else{
			posiNow = ( ( flgAbovePast ) ? 1 : -1 ) + posiPast;
		}
		myYrscMoveDistanceAry.push( posiNow );

		flgAboveNow = ( posiNow < toY );
	}while( ! ( ( flgAbovePast != flgAboveNow ) || ( posiPast == posiNow ) ) );

	myYrscScrollID = setTimeout( 'myYrscScrollWindow(' + 0 + ',' + toY + ',"' + fragment + '")', 15 );

	if( window.event ){
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	if( e && e.preventDefault && e.stopPropagation ){
		e.preventDefault();
		e.stopPropagation();
	}
}

function addListener( obj, event, func, useCapture ){
	if( window.addEventListener ){
		obj.addEventListener( event, func, useCapture );
	}else if( window.attachEvent ){
		obj.attachEvent( "on" + event, func );
	}else{
		
	}
}

function getScrollPositionY(){
	if( document.body && document.body.scrollTop ){
		return document.body.scrollTop;
	}else if( document.documentElement && document.documentElement.scrollTop ){
		return document.documentElement.scrollTop;
	}else if( window.pageYOffset ){
		return window.pageYOffset;
	}else{
		return 0;
	}
}

function getWindowInnerSize(){
	var windowWidth, windowHeight;
	if( self.innerHeight ){
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	}else if( document.documentElement && document.documentElement.clientHeight ){
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	}else if( document.body ){
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}
	return { 'x' : windowWidth, 'y' : windowHeight };
}

function getPageWholeSize(){
	var pageWholeSizeX, pageWholeSizeY;
	if( window.innerHeight && window.scrollMaxY ){
		pageWholeSizeX = document.body.scrollWidth;
		pageWholeSizeY = window.innerHeight + window.scrollMaxY;
	}else if( document.body.scrollHeight > document.body.offsetHeight ){
		pageWholeSizeX = document.body.scrollWidth;
		pageWholeSizeY = document.body.scrollHeight;
	}else{
		pageWholeSizeX = document.body.offsetWidth;
		pageWholeSizeY = document.body.offsetHeight;
	}
	var ary = new Array();
	ary = getWindowInnerSize();
	if( pageWholeSizeX < ary['x'] ) pageWholeSizeX = ary['x'];
	if( pageWholeSizeY < ary['y'] ) pageWholeSizeY = ary['y'];

	return { 'x' : pageWholeSizeX, 'y' : pageWholeSizeY };
}

function getElementPosition( toElm, flg ){
	var toElm = ( typeof toElm == 'string' ) ? document.getElementById( toElm ) : toElm;
	var toX = 0;
	var toY = 0;

	while( toElm ){
		toX += toElm.offsetLeft;
		toY += toElm.offsetTop;
		toElm = toElm.offsetParent;
	}

	if( ( navigator.userAgent.indexOf('Mac') != -1 ) && ( typeof document.body.leftMargin != "undefined" ) ){
		toX += document.body.leftMargin;
		toY += document.body.topMargin;
	}

	if( flg ){
		var ary = new Array();
		ary = getPageWholeSize();
		var arr = new Array();
		arr = getWindowInnerSize();
		if( toX > ( ary['x'] - arr['x'] ) ) toX = ary['x'] - arr['x'];
		if( toY > ( ary['y'] - arr['y'] ) ) toY = ary['y'] - arr['y'];
	}

	return ( { 'x' : toX, 'y' : toY } );
}

window.onload = function(){
	if( ( navigator.userAgent.indexOf('MSIE') > -1 ) || ( navigator.userAgent.indexOf('Firefox') > -1 ) ) myYrscSetAElms();
}



// 参考 → http://www.kryogenix.org/code/browser/smoothscroll/



