Scroller = {
	gy: function (d) {
		gy = d.offsetTop
		if (d.offsetParent) while (d = d.offsetParent) gy += d.offsetTop
		return gy
	},

	//現在位置の取得
	offsetXY: function(which){
		if(document.all){
			if(document.compatMode == "CSS1Compat"){
				x = document.documentElement.scrollLeft;
				y = document.documentElement.scrollTop;
			}else{
				x = document.body.scrollLeft;
				y = document.body.scrollTop;
			}
		}else if(window.pageXOffset !== undefined){
			x = window.pageXOffset;
			y = window.pageYOffset;
		}else{
			x = window.scrollX;
			y = window.scrollY;
		}
	
		if(which == "top"){
			return y;
		}else{
			return x;
		}
	},

	//スクロールの設定
	scrollSet: function(nowX,targetX,nowY,targetY){
		var diffX,diffY,stepX,stepY,moveX,moveY;
		diffX = .1 * (targetX - nowX);
		if(diffX > 0){
			stepX = Math.ceil(diffX);
		}else{
			stepX = Math.floor(diffX);
		}
		diffY = .1 * (targetY - nowY);
		if(diffY > 0){
			stepY = Math.ceil(diffY);
		}else{
			stepY = Math.floor(diffY);
		}
		moveX = nowX + stepX;
		moveY = nowY + stepY;
		if( stepX > 0 && moveX <= targetX || stepY > 0 && moveY <= targetY || stepX < 0 && moveX >= targetX || stepY < 0 && moveY >= targetY ){
			window.scroll(moveX,moveY);
			nowX += stepX;
			nowY += stepY;
			setTimeout("Scroller.scrollSet( " +nowX+ "," +targetX+ "," +nowY+ "," +targetY+ " )",1);
		}else{
			return true;
		}
	},

	//スクロールの実行
	scroll: function(targetX,targetY){
		var nowX = this.offsetXY("left");
		var nowY = this.offsetXY("top");
		this.scrollSet(nowX,targetX,nowY,targetY);
	},

	//idへのスクロール
	Id: function(IdName){
		var Anchor = document.getElementById(IdName);
		var posY = this.gy(Anchor);
		this.scroll(0,posY);
	},

	//アンカーへのスクロール
	Anchor: function(Anchor){
		var posY = this.gy(Anchor);
		this.scroll(0,posY);
	},

	//ページトップへのスクロール
	pageTop: function(){
		this.scroll(0,0);
	},

	//イベントハンドラを埋め込み
	add: function(event, body, d) {
		if (event.addEventListener) return event.addEventListener(body, d,false)
		if (event.attachEvent) return event.attachEvent('on'+body, d)
	},

	//イベントを使用不可に
	end: function(e){
		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			return;
		}
		if (e.preventDefault && e.stopPropagation) {
			e.preventDefault();
			e.stopPropagation();
		}
	},

	//起動時にリンクの置き換え処理を実行
	init: function(){
		Scroller.add(window,'load', Scroller.render);
	},

	//リンクの置き換え処理
	render: function(){
		a = document.getElementsByTagName('a');
		Scroller.end(this);
		window.onscroll;
		for (i=0;i<a.length;i++) {
			l = a[i];
			if(l.href && l.href.indexOf('#') != -1 && ((l.pathname==location.pathname) || ('/'+l.pathname==location.pathname)) ){
				Scroller.add(l,'click',Scroller.end)
				l.onclick = function(){
					Scroller.end(this);
					l=this.hash.substr(1);
					if(document.getElementById(l)){
						Scroller.Id(l);
					}else{
						a = document.getElementsByTagName('a');
						for (i=0;i<a.length;i++) {
							if(a[i].name == l){
								Scroller.Anchor(a[i]);
							}
						}
					}
				}
			}
		}
	}

}
Scroller.init();
