/**
 * smoothScroll.js
 *
 * @version    0.93
 * @updated    2009-08-05
 * @author     takumi osada <http://groovy-times.com>
 * @copyright  Copyright (c) 2009 GROOVY-TIMES
 * @license    MIT License <http://www.opensource.org/licenses/mit-license.php>
 *
 * @requires   addLoadEvent
 */ 

/* -----------------------------------------------------------------------*/
// smoothScroll
/* -----------------------------------------------------------------------*/

// SETUP ///////////////////////////////////////////////

var scroll = function() {};

/* 速度 */
scroll.velocity = 15;

/* 実行の間隔 */
scroll.interval = 12;

var tempUri;

////////////////////////////////////////////////////////

function smoothScroll() {
	if(!document.getElementsByTagName) return false;
	
	var links = document.getElementsByTagName('a');

	for (var i=0; i<links.length; i++) {
		links[i].onclick = function() {
			var ref = this.getAttribute('href');
			tempUri = ref;
			if(!ref.match(/#page_top/)) return;
			
			var xpos = document.body.scrollLeft || document.documentElement.scrollLeft;
			var ypos = document.body.scrollTop || document.documentElement.scrollTop;
			
			if(ref.split('#page_top')[0] == '' || ref.split('#page_top')[0] == location.href.split('#page_top')[0]) {
				var ids = ref.substr(ref.lastIndexOf('#page_top'), ref.length);
				var final_x
				var final_y;
				
				if(ids == '#page_top') {
					final_x = 0;
					final_y = 0;
				}
				else {
					ids = ids.slice(1);
					if(!document.getElementById(ids)) return true;
					var dst = document.getElementById(ids);
					final_x = dst.offsetLeft;
					final_y = dst.offsetTop;
				}
				moveScroll(xpos, ypos, final_x, final_y);
				return false;
			}
		}
	}
}


/* -----------------------------------------------------------------------*/
// moveScroll
/* -----------------------------------------------------------------------*/
function moveScroll(xpos, ypos, final_x, final_y) {

	if(xpos == final_x && ypos == final_y) {
		clearTimeout(smoothing);
		return location.replace(tempUri);
	}

	if(xpos < final_x) {
		var dist = Math.ceil((final_x - xpos) / scroll.velocity);
		xpos = xpos + dist;
		window.scrollBy(dist, 0);
	}
	
	if(xpos > final_x) {
		var dist = Math.ceil((xpos - final_x) / scroll.velocity);
		xpos = xpos - dist;
		window.scrollBy(-dist, 0);
	}

	if(ypos < final_y) {
		var dist = Math.ceil((final_y - ypos) / scroll.velocity);
		ypos = ypos + dist;
		window.scrollBy(0, dist);
	}
	
	if(ypos > final_y) {
		var dist = Math.ceil((ypos - final_y) / scroll.velocity);
		ypos = ypos - dist;
		window.scrollBy(0, -dist);
	}
	
	var repeat = "moveScroll("+xpos+", "+ypos+", "+final_x+", "+final_y+")";
	var smoothing = setTimeout(repeat, scroll.interval);
	
	/* マウスホイールでキャンセル */
	function cancel(event) {
		clearTimeout(smoothing);
		return;
	}
	if (window.addEventListener) {
		window.addEventListener('DOMMouseScroll', cancel, false);
	}
	window.onmousewheel = document.onmousewheel = cancel;
}


/* -----------------------------------------------------------------------*/
// addLoadEvent
/* -----------------------------------------------------------------------*/
addLoadEvent(smoothScroll);

